diff --git a/forms.py b/forms.py index 04f2024a7f..5eab93e03b 100644 --- a/forms.py +++ b/forms.py @@ -110,7 +110,7 @@ class RepoCreateForm(forms.Form): class RepoNewFileForm(forms.Form): """ - Form for create a new empty file + Form for create a new empty file. """ repo_id = forms.CharField(error_messages={'required': '参数错误'}) parent_dir = forms.CharField(error_messages={'required': '参数错误'}) @@ -131,9 +131,33 @@ class RepoNewFileForm(forms.Form): except SearpcError, e: raise forms.ValidationError(str(e)) +class RepoRenameFileForm(forms.Form): + """ + Form for rename a file. + """ + repo_id = forms.CharField(error_messages={'required': '参数错误'}) + parent_dir = forms.CharField(error_messages={'required': '参数错误'}) + oldname = forms.CharField(error_messages={'required': '参数错误'}) + newname = forms.CharField(max_length=settings.MAX_UPLOAD_FILE_NAME_LEN, + error_messages={ + 'max_length': '新文件名太长', + 'required': '新文件名不能为空', + }) + + def clean_newname(self): + newname = self.cleaned_data['newname'] + try: + if not is_valid_filename(newname): + error_msg = u"您输入的文件名 %s 包含非法字符" % newname + raise forms.ValidationError(error_msg) + else: + return newname + except SearpcError, e: + raise forms.ValidationError(str(e)) + class RepoNewDirForm(forms.Form): """ - Form for create a new empty dir + Form for create a new empty dir. """ repo_id = forms.CharField(error_messages={'required': '参数错误'}) parent_dir = forms.CharField(error_messages={'required': '参数错误'}) diff --git a/templates/repo.html b/templates/repo.html index 0bf1797c1e..400ef0c3a0 100644 --- a/templates/repo.html +++ b/templates/repo.html @@ -197,22 +197,22 @@ {% if not view_history %} -
{% csrf_token %} + {% csrf_token %}

新目录名称:


-

输入不能为空

+

-
{% csrf_token %} + {% csrf_token %}

新文件名称:


-

输入不能为空

+

@@ -238,7 +238,7 @@
-

输入不能为空。

+

@@ -398,13 +398,94 @@ $('.file-cp, .file-mv, .dir-cp, .dir-mv').click(function () { return false; }); -$('#add-new-dir-form .submit, #add-new-file-form .submit, #rename-form .submit').click(function() { - if (!$.trim($(this).prev().prev().prev().val())) {//if the input is empty - $(this).prev().removeClass('hide');//show error msg - $('#simplemodal-container').css('height', $(this).parent().height()); - return false; - } +$('#rename-form .submit').click(function() { + $.ajax({ + url: '{% url 'views.repo_rename_file' %}', + type: 'POST', + dataType: 'json', + cache: 'false', + beforeSend: prepareCSRFToken, + data: { + 'repo_id': $('#rename-form input[name="repo_id"]').val(), + 'parent_dir': $('#rename-form input[name="parent_dir"]').val(), + 'oldname': $('#rename-form input[name="oldname"]').val(), + 'newname': $('#rename-form input[name="newname"]').val() + }, + success: function(data) { + if (data['success']) { + location.reload(true); + } else { + apply_form_error('rename-form', data['error']); + } + }, + error: function(data, textStatus, jqXHR) { + var errors = $.parseJSON(data.responseText); + $.each(errors, function(index, value) { + apply_form_error('rename-form', value[0]); + }); + } + }); + return false; }); + +$('#add-new-file-form .submit').click(function() { + $.ajax({ + url: '{% url 'views.repo_new_file' %}', + type: 'POST', + dataType: 'json', + cache: 'false', + beforeSend: prepareCSRFToken, + data: { + 'repo_id': $('#add-new-file-form input[name="repo_id"]').val(), + 'parent_dir': $('#add-new-file-form input[name="parent_dir"]').val(), + 'new_file_name': $('#add-new-file-form input[name="new_file_name"]').val() + }, + success: function(data) { + if (data['success']) { + location.reload(true); + } else { + apply_form_error('add-new-file-form', data['error']); + } + }, + error: function(data, textStatus, jqXHR) { + var errors = $.parseJSON(data.responseText); + $.each(errors, function(index, value) { + apply_form_error('add-new-file-form', value[0]); + }); + } + }); + return false; +}); + +$('#add-new-dir-form .submit').click(function() { + $.ajax({ + url: '{% url 'views.repo_new_dir' %}', + type: 'POST', + dataType: 'json', + cache: 'false', + beforeSend: prepareCSRFToken, + data: { + 'repo_id': $('#add-new-dir-form input[name="repo_id"]').val(), + 'parent_dir': $('#add-new-dir-form input[name="parent_dir"]').val(), + 'new_dir_name': $('#add-new-dir-form input[name="new_dir_name"]').val() + }, + success: function(data) { + if (data['success']) { + location.reload(true); + } else { + apply_form_error('add-new-dir-form', data['error']); + } + }, + error: function(data, textStatus, jqXHR) { + var errors = $.parseJSON(data.responseText); + $.each(errors, function(index, value) { + apply_form_error('add-new-dir-form', value[0]); + }); + } + }); + return false; +}); + $('#mv-form .submit').click(function() { if (!$.trim($(this).prev().prev().val())) {//if the input is empty $(this).prev().removeClass('hide');//show error msg diff --git a/views.py b/views.py index b17ba17240..50b9bca51c 100644 --- a/views.py +++ b/views.py @@ -47,7 +47,7 @@ from group.models import GroupMessage, MessageAttachment from group.signals import grpmsg_added from seahub.notifications.models import UserNotification from forms import AddUserForm, FileLinkShareForm, RepoCreateForm, \ - RepoNewDirForm, RepoNewFileForm, FileCommentForm + RepoNewDirForm, RepoNewFileForm, FileCommentForm, RepoRenameFileForm from utils import render_permission_error, render_error, list_to_string, \ get_httpserver_root, get_ccnetapplet_root, gen_token, \ calculate_repo_last_modify, valid_previewed_file, \ @@ -1610,7 +1610,9 @@ def file_upload_progress_page(request): @login_required def repo_new_dir(request): - + result = {} + content_type = 'application/json; charset=utf-8' + form = RepoNewDirForm(request.POST) if form.is_valid(): repo_id = form.cleaned_data["repo_id"] @@ -1618,20 +1620,26 @@ def repo_new_dir(request): new_dir_name = form.cleaned_data["new_dir_name"] user = request.user.username else: - return render_error(request, form.errors.values()[0]) + result['error'] = str(form.errors.values()[0]) + return HttpResponse(json.dumps(result), content_type=content_type) new_dir_name = check_filename_with_rename(repo_id, parent_dir, new_dir_name) try: seafserv_threaded_rpc.post_dir(repo_id, parent_dir, new_dir_name, user) except Exception, e: - return render_error(request, str(e)) + result['error'] = str(e) + return HttpResponse(json.dumps(result), content_type=content_type) - url = reverse('repo', args=[repo_id]) + ('?p=%s' % urllib2.quote(parent_dir.encode('utf-8'))) - return HttpResponseRedirect(url) + url = reverse('repo', args=[repo_id]) + \ + ('?p=%s' % urllib2.quote(parent_dir.encode('utf-8'))) + return HttpResponse(json.dumps({'success': True}), + content_type=content_type) @login_required def repo_new_file(request): + result = {} + content_type = 'application/json; charset=utf-8' form = RepoNewFileForm(request.POST) if form.is_valid(): @@ -1640,52 +1648,59 @@ def repo_new_file(request): new_file_name = form.cleaned_data["new_file_name"] user = request.user.username else: - return render_error(request, form.errors.values()[0]) + result['error'] = str(form.errors.values()[0]) + return HttpResponse(json.dumps(result), content_type=content_type) - new_file_name = check_filename_with_rename(repo_id, parent_dir, new_file_name) + new_file_name = check_filename_with_rename(repo_id, parent_dir, + new_file_name) try: - seafserv_threaded_rpc.post_empty_file(repo_id, parent_dir, new_file_name, user) + seafserv_threaded_rpc.post_empty_file(repo_id, parent_dir, + new_file_name, user) except Exception, e: - return render_error(request, str(e)) + result['error'] = str(e) + return HttpResponse(json.dumps(result), content_type=content_type) - url = reverse('repo', args=[repo_id]) + ('?p=%s' % urllib2.quote(parent_dir.encode('utf-8'))) - return HttpResponseRedirect(url) + url = reverse('repo', args=[repo_id]) + \ + ('?p=%s' % urllib2.quote(parent_dir.encode('utf-8'))) + return HttpResponse(json.dumps({'success': True}), + content_type=content_type) @login_required def repo_rename_file(request): - repo_id = request.POST.get("repo_id") - parent_dir = request.POST.get("parent_dir") - oldname = request.POST.get("oldname") - newname = request.POST.get("newname") - user = request.user.username + result = {} + content_type = 'application/json; charset=utf-8' - if not newname: - error_msg = u"新文件名不能为空" - return render_error(request, error_msg) + form = RepoRenameFileForm(request.POST) + if form.is_valid(): + repo_id = form.cleaned_data["repo_id"] + parent_dir = form.cleaned_data["parent_dir"] + oldname = form.cleaned_data["oldname"] + newname = form.cleaned_data["newname"] + user = request.user.username + else: + result['error'] = str(form.errors.values()[0]) + return HttpResponse(json.dumps(result), content_type=content_type) if newname == oldname: - url = reverse('repo', args=[repo_id]) + ('?p=%s' % urllib2.quote(parent_dir.encode('utf-8'))) - return HttpResponseRedirect(url) + return HttpResponse(json.dumps({'success': True}), + content_type=content_type) newname = check_filename_with_rename(repo_id, parent_dir, newname) - if len(newname) > settings.MAX_UPLOAD_FILE_NAME_LEN: - error_msg = u"新文件名太长" - return render_error(request, error_msg) - - if not (repo_id and parent_dir and oldname): - return render_error(request) - try: seafserv_threaded_rpc.rename_file (repo_id, parent_dir, oldname, newname, user) - messages.add_message(request, messages.INFO, u'%s 已重命名为 %s。' % (oldname, newname)) + messages.add_message(request, messages.INFO, u'%s 已重命名为 %s。' % \ + (oldname, newname)) except Exception, e: - return render_error(request, str(e)) + result['error'] = str(e) + return HttpResponse(json.dumps(result), content_type=content_type) - url = reverse('repo', args=[repo_id]) + ('?p=%s' % urllib2.quote(parent_dir.encode('utf-8'))) - return HttpResponseRedirect(url) + url = reverse('repo', args=[repo_id]) + \ + ('?p=%s' % urllib2.quote(parent_dir.encode('utf-8'))) + return HttpResponse(json.dumps({'success': True}), + content_type=content_type) @login_required def validate_filename(request):