diff --git a/media/js/base.js b/media/js/base.js index 508b5bd119..8d0992ab37 100644 --- a/media/js/base.js +++ b/media/js/base.js @@ -72,7 +72,7 @@ $(function() { }, error: function (xhr, textStatus, errorThrown) { if (xhr.responseText) { - var error = jQuery.parseJSON(xhr.responseText).error; + var error = $.parseJSON(xhr.responseText).error; loading_tip.hide(); if ($('.error', popup).length == 0) { loading_tip.after('

' + error + '

'); @@ -126,7 +126,7 @@ $(function() { }, error: function (xhr, textStatus, errorThrown) { if (xhr.responseText) { - var error = jQuery.parseJSON(xhr.responseText).error; + var error = $.parseJSON(xhr.responseText).error; loading_tip.hide(); if ($('.error', popup).length == 0) { loading_tip.after('

' + error + '

'); diff --git a/seahub/auth/decorators.py b/seahub/auth/decorators.py index 634b82b883..0d043471b0 100644 --- a/seahub/auth/decorators.py +++ b/seahub/auth/decorators.py @@ -8,6 +8,7 @@ from django.http import HttpResponseRedirect, HttpResponse from django.utils.decorators import available_attrs from django.utils.http import urlquote import simplejson as json +from django.utils.translation import ugettext as _ def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME): """ @@ -50,3 +51,31 @@ def permission_required(perm, login_url=None): enabled, redirecting to the log-in page if necessary. """ return user_passes_test(lambda u: u.has_perm(perm), login_url=login_url) + + +def login_required_ajax(function=None,redirect_field_name=None): + """ + Just make sure the user is authenticated to access a certain ajax view + + Otherwise return a HttpResponse 401 - authentication required + instead of the 302 redirect of the original Django decorator + """ + def _decorator(view_func): + def _wrapped_view(request, *args, **kwargs): + if not request.is_ajax(): + raise Http404 + + if request.user.is_authenticated(): + return view_func(request, *args, **kwargs) + else: + content_type = 'application/json; charset=utf-8' + return HttpResponse(json.dumps({ + 'error': _('Please log in.') + }), status=401, content_type=content_type) + + return _wrapped_view + + if function is None: + return _decorator + else: + return _decorator(function) diff --git a/seahub/group/templates/group/grpmember_add_js.html b/seahub/group/templates/group/grpmember_add_js.html index e912e7cf4a..5a3fa78931 100644 --- a/seahub/group/templates/group/grpmember_add_js.html +++ b/seahub/group/templates/group/grpmember_add_js.html @@ -9,7 +9,7 @@ $("#group-member-add, #group-admin-add").click(function() { $('#enter .tip').addClass('hide'); form.data('post_url', '{% url 'group_add_admin' group.id %}'); } else { - form.data('post_url', '{% url 'group_manage' group.id %}'); + form.data('post_url', '{% url 'group_add_member' group.id %}'); } addAutocomplete('#added-member-name', '#enter', contact_list); }); diff --git a/seahub/group/urls.py b/seahub/group/urls.py index b4c762b566..df7de9acce 100644 --- a/seahub/group/urls.py +++ b/seahub/group/urls.py @@ -7,7 +7,7 @@ from views import group_info, group_members, group_member_operations, group_add_ group_wiki_page_new, group_wiki_page_edit, group_wiki_pages, \ group_wiki_page_delete, group_wiki_use_lib, group_remove, group_dismiss, group_quit, \ group_make_public, group_revoke_public, group_transfer, group_toggle_modules, \ - group_add_discussion, group_rename, group_add + group_add_discussion, group_rename, group_add, ajax_add_group_member urlpatterns = patterns('', url(r'^(?P\d+)/$', group_info, name='group_info'), @@ -37,11 +37,13 @@ urlpatterns = patterns('', url(r'^(?P\d+)/admin/add/$', group_add_admin, name='group_add_admin'), url(r'^(?P\d+)/admin/remove/$', group_remove_admin, name='group_remove_admin'), url(r'^recommend/$', group_recommend, name='group_recommend'), - url(r'^attention/$', attention, name='group_attention'), + #url(r'^attention/$', attention, name='group_attention'), url(r'^joinrequest/(?P[\d]+)/$', group_joinrequest, name='group_joinrequest'), url(r'^(?P\d+)/modules/toggle/$', group_toggle_modules, name='group_toggle_modules'), url(r'^(?P\d+)/discussion/add/$', group_add_discussion, name='group_add_discussion'), url(r'^add/$', group_add, name='group_add'), + + url(r'^ajax/(?P\d+)/member/add/$', ajax_add_group_member, name='group_add_member'), ) import seahub.settings as settings diff --git a/seahub/group/views.py b/seahub/group/views.py index e11aebae74..1476590ba9 100644 --- a/seahub/group/views.py +++ b/seahub/group/views.py @@ -17,7 +17,7 @@ from django.utils.http import urlquote from django.utils.translation import ugettext as _ from django.utils.translation import ungettext -from seahub.auth.decorators import login_required +from seahub.auth.decorators import login_required, login_required_ajax import seaserv from seaserv import ccnet_threaded_rpc, seafserv_threaded_rpc, \ web_get_access_token, seafile_api, get_repo, get_group_repos, get_commits, \ @@ -146,10 +146,10 @@ def group_check(func): return _decorated ########## views -@login_required +@login_required_ajax def group_add(request): """Add a new group""" - if not request.is_ajax() or request.method != 'POST': + if request.method != 'POST': raise Http404 username = request.user.username @@ -453,56 +453,56 @@ def group_message_remove(request, group_id, msg_id): def msg_reply(request, msg_id): """Show group message replies, and process message reply in ajax""" + if not request.is_ajax(): + raise Http404 + content_type = 'application/json; charset=utf-8' - if request.is_ajax(): - ctx = {} - try: - group_msg = GroupMessage.objects.get(id=msg_id) - except GroupMessage.DoesNotExist: - return HttpResponseBadRequest(content_type=content_type) + ctx = {} + try: + group_msg = GroupMessage.objects.get(id=msg_id) + except GroupMessage.DoesNotExist: + return HttpResponseBadRequest(content_type=content_type) - if request.method == 'POST': - if not request.user.is_authenticated(): - return HttpResponseBadRequest(json.dumps({ - "error": "login required"}), content_type=content_type) + if request.method == 'POST': + if not request.user.is_authenticated(): + return HttpResponseBadRequest(json.dumps({ + "error": "login required"}), content_type=content_type) - form = MessageReplyForm(request.POST) - r_status = request.GET.get('r_status') - # TODO: invalid form - if form.is_valid(): - msg = form.cleaned_data['message'] + form = MessageReplyForm(request.POST) + r_status = request.GET.get('r_status') + # TODO: invalid form + if form.is_valid(): + msg = form.cleaned_data['message'] - msg_reply = MessageReply() - msg_reply.reply_to = group_msg - msg_reply.from_email = request.user.username - msg_reply.message = msg - msg_reply.save() + msg_reply = MessageReply() + msg_reply.reply_to = group_msg + msg_reply.from_email = request.user.username + msg_reply.message = msg + msg_reply.save() - # send signal if reply other's message - if group_msg.from_email != request.user.username: - grpmsg_reply_added.send(sender=MessageReply, - msg_id=msg_id, - from_email=request.user.username, - reply_msg=msg) - replies = MessageReply.objects.filter(reply_to=group_msg) - r_num = len(replies) - if r_num < 4 or r_status == 'show': - ctx['replies'] = replies - else: - ctx['replies'] = replies[r_num - 3:] - html = render_to_string("group/group_reply_list.html", ctx) - serialized_data = json.dumps({"r_num": r_num, "html": html}) - return HttpResponse(serialized_data, content_type=content_type) - - else: + # send signal if reply other's message + if group_msg.from_email != request.user.username: + grpmsg_reply_added.send(sender=MessageReply, + msg_id=msg_id, + from_email=request.user.username, + reply_msg=msg) replies = MessageReply.objects.filter(reply_to=group_msg) r_num = len(replies) - ctx['replies'] = replies + if r_num < 4 or r_status == 'show': + ctx['replies'] = replies + else: + ctx['replies'] = replies[r_num - 3:] html = render_to_string("group/group_reply_list.html", ctx) serialized_data = json.dumps({"r_num": r_num, "html": html}) return HttpResponse(serialized_data, content_type=content_type) + else: - return HttpResponseBadRequest(content_type=content_type) + replies = MessageReply.objects.filter(reply_to=group_msg) + r_num = len(replies) + ctx['replies'] = replies + html = render_to_string("group/group_reply_list.html", ctx) + serialized_data = json.dumps({"r_num": r_num, "html": html}) + return HttpResponse(serialized_data, content_type=content_type) @login_required def msg_reply_new(request): @@ -662,11 +662,20 @@ def send_group_member_add_mail(request, group, from_user, to_user): subject = _(u'You are invited to join a group on %s') % SITE_NAME send_html_email(subject, 'group/add_member_email.html', c, None, [to_user]) -def ajax_add_group_member(request, group): +@login_required_ajax +@group_staff_required +def ajax_add_group_member(request, group_id): """Add user to group in ajax. """ result = {} content_type = 'application/json; charset=utf-8' + + group = get_group(group_id) + if not group: + result['error'] = _(u'The group does not exist.') + return HttpResponse(json.dumps(result), status=400, + content_type=content_type) + username = request.user.username member_name_str = request.POST.get('user_name', '') @@ -780,13 +789,6 @@ def group_manage(request, group_id): if not group: return HttpResponseRedirect(reverse('group_list', args=[])) - if request.method == 'POST': - """ - Add group members. - """ - return ajax_add_group_member(request, group) - - ### GET ### members_all = ccnet_threaded_rpc.get_group_members(group.id) admins = [ m for m in members_all if m.is_staff ] @@ -811,7 +813,7 @@ def group_manage(request, group_id): "mods_available": mods_available, }, context_instance=RequestContext(request)) -@login_required +@login_required_ajax @group_staff_required def group_add_admin(request, group_id): """ @@ -819,7 +821,7 @@ def group_add_admin(request, group_id): """ group_id = int(group_id) # Checked by URL Conf - if request.method != 'POST' or not request.is_ajax(): + if request.method != 'POST': raise Http404 result = {} @@ -927,7 +929,7 @@ def group_remove_member(request, group_id, user_name): return HttpResponseRedirect(reverse('group_manage', args=[group_id])) -@login_required +@login_required_ajax def group_recommend(request): """ Recommend a file or directory to a group. @@ -954,12 +956,12 @@ def group_recommend(request): try: group_id = int(group_id) except ValueError: - result['err'] = _(u'Error: wrong group id') + result['error'] = _(u'Error: wrong group id') return HttpResponse(json.dumps(result), status=400, content_type=content_type) group = get_group(group_id) if not group: - result['err'] = _(u'Error: the group does not exist.') + result['error'] = _(u'Error: the group does not exist.') return HttpResponse(json.dumps(result), status=400, content_type=content_type) # TODO: Check whether repo is in the group and Im in the group @@ -994,10 +996,10 @@ def group_recommend(request): result['success'] = _(u'Successfully posted to %(groups)s.') % {'groups': ', '.join(groups_posted_to)} if len(groups_not_in) > 0: - result['err'] = _(u'Error: you are not in group %s.') % (', '.join(groups_not_in)) + result['error'] = _(u'Error: you are not in group %s.') % (', '.join(groups_not_in)) else: - result['err'] = str(form.errors) + result['error'] = str(form.errors) return HttpResponse(json.dumps(result), status=400, content_type=content_type) # request.method == 'GET' @@ -1006,10 +1008,10 @@ def group_recommend(request): path = request.GET.get('path', None) repo = get_repo(repo_id) if not repo: - result['err'] = _(u'Error: the library does not exist.') + result['error'] = _(u'Error: the library does not exist.') return HttpResponse(json.dumps(result), status=400, content_type=content_type) if path is None: - result['err'] = _(u'Error: no path.') + result['error'] = _(u'Error: no path.') return HttpResponse(json.dumps(result), status=400, content_type=content_type) # get discussions & replies @@ -1034,7 +1036,7 @@ def group_recommend(request): return HttpResponse(json.dumps(result), content_type=content_type) -@login_required +@login_required_ajax def create_group_repo(request, group_id): """Create a repo and share it to current group""" @@ -1113,12 +1115,12 @@ def create_group_repo(request, group_id): return HttpResponse(json.dumps({'success': True}), content_type=content_type) -@login_required +@login_required_ajax def group_joinrequest(request, group_id): """ Handle post request to join a group. """ - if not request.is_ajax() or request.method != 'POST': + if request.method != 'POST': raise Http404 result = {} @@ -1152,14 +1154,12 @@ def group_joinrequest(request, group_id): else: return HttpResponseBadRequest(json.dumps(form.errors), content_type=content_type) - + +@login_required_ajax def attention(request): """ Handle ajax request to query group members used in autocomplete. """ - if not request.is_ajax(): - raise Http404 - user = request.user.username name_str = request.GET.get('name_startsWith') gids = request.GET.get('gids', '') @@ -1201,7 +1201,6 @@ def attention(request): content_type = 'application/json; charset=utf-8' return HttpResponse(json.dumps(result), content_type=content_type) - @group_check def group_add_discussion(request, group): @@ -1480,6 +1479,7 @@ def group_wiki_pages(request, group): "mods_available": mods_available, }, context_instance=RequestContext(request)) +@login_required_ajax @group_check def group_wiki_create(request, group): if group.view_perm == "pub": diff --git a/seahub/message/templates/message/all_msg_list.html b/seahub/message/templates/message/all_msg_list.html index afaf113571..a5c7379807 100644 --- a/seahub/message/templates/message/all_msg_list.html +++ b/seahub/message/templates/message/all_msg_list.html @@ -110,8 +110,14 @@ $('#add-msg').click(function() { popup.html('

' + "{% trans "please add contacts at first" %}" + '

'); } }, - error: function() { - popup.html('

' + "{% trans "Failed to get your contacts for sending a message." %}" + '

'); + error: function(jqXHR, textStatus, errorThrown) { + var error; + if (jqXHR.responseText) { + error = $.parseJSON(jqXHR.responseText).error; + } else { + error = "{% trans "Please check the network." %}"; + } + popup.html('

' + error + '

'); } }); }); diff --git a/seahub/message/views.py b/seahub/message/views.py index 6def8468a6..1ba6213109 100755 --- a/seahub/message/views.py +++ b/seahub/message/views.py @@ -9,11 +9,10 @@ from django.core.urlresolvers import reverse from django.template import RequestContext from django.core.paginator import EmptyPage, InvalidPage from django.utils.translation import ugettext as _ -from django.views.decorators.http import require_POST from models import UserMessage, UserMsgAttachment from message import msg_info_list -from seahub.auth.decorators import login_required +from seahub.auth.decorators import login_required, login_required_ajax from seahub.base.accounts import User from seahub.base.decorators import user_mods_check from seahub.views import is_registered_user @@ -108,7 +107,7 @@ def user_msg_list(request, id_or_email): "to_email": to_email, }, context_instance=RequestContext(request)) -@login_required +@login_required_ajax def user_msg_remove(request, msg_id): """Remove sent message. """ @@ -134,7 +133,7 @@ def user_msg_remove(request, msg_id): 'err_msg': _(u"You don't have the permission.") }), content_type=json_ct) -@login_required +@login_required_ajax def user_received_msg_remove(request, msg_id): """Remove received message. """ @@ -160,13 +159,12 @@ def user_received_msg_remove(request, msg_id): 'err_msg': _(u"You don't have the permission."), }), content_type=json_ct) -@login_required -@require_POST +@login_required_ajax def message_send(request): """Handle POST request to send message to user(s). """ - if not request.is_ajax() or request.method != 'POST': + if request.method != 'POST': raise Http404 content_type = 'application/json; charset=utf-8' @@ -251,13 +249,10 @@ def message_send(request): return HttpResponse(json.dumps({"html": html, "error": errors}), status=400, content_type=content_type) -@login_required +@login_required_ajax def msg_count(request): """Count user's unread message. """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' username = request.user.username diff --git a/seahub/notifications/views.py b/seahub/notifications/views.py index 7386cf57a7..6351bb7471 100644 --- a/seahub/notifications/views.py +++ b/seahub/notifications/views.py @@ -10,7 +10,7 @@ from django.utils.translation import ugettext as _ import seaserv -from seahub.auth.decorators import login_required +from seahub.auth.decorators import login_required, login_required_ajax from seahub.notifications.models import Notification, NotificationForm, \ UserNotification from seahub.notifications.utils import refresh_cache @@ -78,7 +78,7 @@ def user_notification_list(request): 'notices_more': notices_more, }, context_instance=RequestContext(request)) -@login_required +@login_required_ajax def user_notification_more(request): """Fetch next ``limit`` notifications starts from ``start``. @@ -87,9 +87,6 @@ def user_notification_more(request): - `start`: - `limit`: """ - if not request.is_ajax(): - return Http404 - username = request.user.username start = int(request.GET.get('start', 0)) limit = int(request.GET.get('limit', 0)) diff --git a/seahub/share/urls.py b/seahub/share/urls.py index 3888ad1e39..ff72cf62d8 100644 --- a/seahub/share/urls.py +++ b/seahub/share/urls.py @@ -14,11 +14,17 @@ urlpatterns = patterns('', url(r'^link/get/$', get_shared_link, name='get_shared_link'), url(r'^link/remove/$', remove_shared_link, name='remove_shared_link'), + + url(r'^ajax/link/remove/$', ajax_remove_shared_link, name='ajax_remove_shared_link'), + url(r'^link/send/$', send_shared_link, name='send_shared_link'), url(r'^link/save/$', save_shared_link, name='save_shared_link'), url(r'^upload_link/get/$', get_shared_upload_link, name='get_shared_upload_link'), url(r'^upload_link/remove/$', remove_shared_upload_link, name='remove_shared_upload_link'), + + url(r'^ajax/upload_link/remove/$', ajax_remove_shared_upload_link, name='ajax_remove_shared_upload_link'), + url(r'^upload_link/send/$', send_shared_upload_link, name='send_shared_upload_link'), url(r'^permission_admin/$', share_permission_admin, name='share_permission_admin'), diff --git a/seahub/share/views.py b/seahub/share/views.py index 02b290b35e..c7ea8ad9a4 100644 --- a/seahub/share/views.py +++ b/seahub/share/views.py @@ -27,7 +27,7 @@ from seahub.share.models import FileShare, PrivateFileDirShare, \ from seahub.share.signals import share_repo_to_user_successful # from settings import ANONYMOUS_SHARE_COOKIE_TIMEOUT # from tokens import anon_share_token_generator -from seahub.auth.decorators import login_required +from seahub.auth.decorators import login_required, login_required_ajax from seahub.base.accounts import User from seahub.base.decorators import user_mods_check from seahub.contacts.models import Contact @@ -542,7 +542,7 @@ def view_priv_shared_folder(request, repo_id): url = reverse('repo', args=[repo.origin_repo_id]) + '?p=' + repo.origin_path return HttpResponseRedirect(url) -@login_required +@login_required_ajax def share_permission_admin(request): """Change repo share permission in ShareAdmin. """ @@ -692,14 +692,11 @@ def share_permission_admin(request): # return HttpResponseRedirect(next) ########## share link -@login_required +@login_required_ajax def get_shared_link(request): """ Handle ajax request to generate file or dir shared link. """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' repo_id = request.GET.get('repo_id', '') @@ -744,19 +741,24 @@ def remove_shared_link(request): """ token = request.GET.get('t') - if not request.is_ajax(): - FileShare.objects.filter(token=token).delete() - next = request.META.get('HTTP_REFERER', None) - if not next: - next = reverse('share_admin') + FileShare.objects.filter(token=token).delete() + next = request.META.get('HTTP_REFERER', None) + if not next: + next = reverse('share_admin') - messages.success(request, _(u'Removed successfully')) + messages.success(request, _(u'Removed successfully')) - return HttpResponseRedirect(next) + return HttpResponseRedirect(next) + + +@login_required_ajax +def ajax_remove_shared_link(request): content_type = 'application/json; charset=utf-8' result = {} + token = request.GET.get('t') + if not token: result = {'error': _(u"Argument missing")} return HttpResponse(json.dumps(result), status=400, content_type=content_type) @@ -770,6 +772,7 @@ def remove_shared_link(request): result = {'error': _(u"The link doesn't exist")} return HttpResponse(json.dumps(result), status=400, content_type=content_type) + @login_required def remove_shared_upload_link(request): """ @@ -777,19 +780,23 @@ def remove_shared_upload_link(request): """ token = request.GET.get('t') - if not request.is_ajax(): - UploadLinkShare.objects.filter(token=token).delete() - next = request.META.get('HTTP_REFERER', None) - if not next: - next = reverse('share_admin') + UploadLinkShare.objects.filter(token=token).delete() + next = request.META.get('HTTP_REFERER', None) + if not next: + next = reverse('share_admin') - messages.success(request, _(u'Removed successfully')) + messages.success(request, _(u'Removed successfully')) - return HttpResponseRedirect(next) + return HttpResponseRedirect(next) + + +@login_required_ajax +def ajax_remove_shared_upload_link(request): content_type = 'application/json; charset=utf-8' result = {} + token = request.GET.get('t') if not token: result = {'error': _(u"Argument missing")} return HttpResponse(json.dumps(result), status=400, content_type=content_type) @@ -803,12 +810,13 @@ def remove_shared_upload_link(request): result = {'error': _(u"The link doesn't exist")} return HttpResponse(json.dumps(result), status=400, content_type=content_type) -@login_required + +@login_required_ajax def send_shared_link(request): """ Handle ajax post request to send file shared link. """ - if not request.is_ajax() and not request.method == 'POST': + if not request.method == 'POST': raise Http404 content_type = 'application/json; charset=utf-8' @@ -1035,13 +1043,11 @@ def user_share_list(request, id_or_email): 'add_to_contacts': add_to_contacts, }, context_instance=RequestContext(request)) -@login_required +@login_required_ajax def get_shared_upload_link(request): """ Handle ajax request to generate dir upload link. """ - if not request.is_ajax(): - raise Http404 content_type = 'application/json; charset=utf-8' repo_id = request.GET.get('repo_id', '') @@ -1085,12 +1091,12 @@ def get_shared_upload_link(request): data = json.dumps({'token': token, 'shared_upload_link': shared_upload_link}) return HttpResponse(data, status=200, content_type=content_type) -@login_required +@login_required_ajax def send_shared_upload_link(request): """ Handle ajax post request to send shared upload link. """ - if not request.is_ajax() and not request.method == 'POST': + if not request.method == 'POST': raise Http404 content_type = 'application/json; charset=utf-8' diff --git a/seahub/templates/client_mgmt.html b/seahub/templates/client_mgmt.html deleted file mode 100644 index 4961774a34..0000000000 --- a/seahub/templates/client_mgmt.html +++ /dev/null @@ -1,124 +0,0 @@ -{% extends "home_base.html" %} - -{% load seahub_tags avatar_tags i18n %} - -{% block sub_title %}{% trans "Clients" %} - {% endblock %} -{% block cur_clients %}tab-cur{% endblock %} - -{% block right_panel %} -

{% trans "Clients" %}

-{% if clients %} - - - - - - - - - {% for client in clients %} - - - - - - - - {% endfor %} -
{% trans "Client Name" %}{% trans "Library" %}{% trans "IP" %}{% trans "Last Sync" %}{% trans "Operations" %}
- {% if client.peer_name %} - {% if client.show_peer_name %} - {{ client.peer_name }} - {% endif %} - {% else %} - -- - {% endif %} - - {{ client.repo_name }} - - {% if client.peer_ip %} - {{ client.peer_ip }} - {% else %} - -- - {% endif %} - - {% if client.sync_time > 0 %} - {{ client.sync_time|translate_seahub_time }} - {% else %} - {% trans "Not synced" %} - {% endif %} - - -
-
-

{% trans "Really want to unsync it?" %}

- - -
-{% else %} -
-

{% trans "You do not have connected clients" %}

-

{% trans "The libraries synced to desktop clients are listed in this page. You can see the client's name and its IP address. You may unsync a client from a library if you no longer want to sync it." %}

-
-{% endif %} - -{% endblock %} - -{% block extra_script %}{{block.super}} - -{% endblock %} diff --git a/seahub/templates/myhome.html b/seahub/templates/myhome.html index 526e00bae8..5fa1686302 100644 --- a/seahub/templates/myhome.html +++ b/seahub/templates/myhome.html @@ -107,9 +107,13 @@ sublib_create_btn.click(function() { } }, error: function(jqXHR, textStatus, errorThrown) { - if (!jqXHR.responseText) { - dir_tree_cont.html('

' + "{% trans "Failed. Please check the network." %}" + '

'); + var error; + if (jqXHR.responseText) { + error = $.parseJSON(jqXHR.responseText).error; + } else { + error = "{% trans "Failed. Please check the network." %}"; } + dir_tree_cont.html('

' + error + '

'); } }); }); diff --git a/seahub/templates/repo_settings.html b/seahub/templates/repo_settings.html index 17a320d62b..7c4ef5bb91 100644 --- a/seahub/templates/repo_settings.html +++ b/seahub/templates/repo_settings.html @@ -307,9 +307,9 @@ $('#remove-repo-shared-download-link, #remove-repo-shared-upload-link').click(fu ajax_url; if (id.indexOf('upload') != -1) { - ajax_url = '{% url 'remove_shared_upload_link' %}'; + ajax_url = '{% url 'ajax_remove_shared_upload_link' %}'; } else { - ajax_url = '{% url 'remove_shared_link' %}'; + ajax_url = '{% url 'ajax_remove_shared_link' %}'; } $.ajax({ diff --git a/seahub/templates/snippets/add_file_js.html b/seahub/templates/snippets/add_file_js.html index 67781519e1..9c493e6d5e 100644 --- a/seahub/templates/snippets/add_file_js.html +++ b/seahub/templates/snippets/add_file_js.html @@ -16,9 +16,13 @@ $('.add-file').click(function(){ } }, error: function(jqXHR, textStatus, errorThrown) { - if (!jqXHR.responseText) { - file_tree_cont.html('

' + "{% trans "Failed. Please check the network." %}" + '

'); + var error; + if (jqXHR.responseText) { + error = $.parseJSON(jqXHR.responseText).error; + } else { + error = "{% trans "Failed. Please check the network." %}"; } + file_tree_cont.html('

' + error + '

'); } }); }); diff --git a/seahub/templates/snippets/bottom_bar.html b/seahub/templates/snippets/bottom_bar.html index 9733989f4d..c074f8bc9e 100644 --- a/seahub/templates/snippets/bottom_bar.html +++ b/seahub/templates/snippets/bottom_bar.html @@ -40,7 +40,7 @@ $('#discuss').click(function() { error: function(jqXHR, textStatus, errorThrown) { var err_str = ''; if (jqXHR.responseText) { - err_str = $.parseJSON(jqXHR.responseText).err; + err_str = $.parseJSON(jqXHR.responseText).error; feedback(err_str, 'error'); } } @@ -98,13 +98,13 @@ $('#discuss-submit').click(function() { form.find('.input').val(''); } if(data['err']) { - feedback(data['err'], 'error'); + feedback(data['error'], 'error'); } }, error: function(jqXHR, textStatus, errorThrown) { var err_str = ''; if (jqXHR.responseText) { - err_str = $.parseJSON(jqXHR.responseText).err; + err_str = $.parseJSON(jqXHR.responseText).error; } else { err_str = "{% trans "Failed. Please check the network." %}"; } diff --git a/seahub/templates/snippets/shared_link_js.html b/seahub/templates/snippets/shared_link_js.html index ac86b16a98..4ea96fc859 100644 --- a/seahub/templates/snippets/shared_link_js.html +++ b/seahub/templates/snippets/shared_link_js.html @@ -311,7 +311,7 @@ $('#rm-shared-link').click(function() { token = obj.data('token'); $.ajax({ - url: '{% url 'remove_shared_link' %}?t=' + token, + url: '{% url 'ajax_remove_shared_link' %}?t=' + token, dataType: 'json', cache: false, success: function(data) { @@ -468,7 +468,7 @@ $('#rm-shared-upload-link').click(function() { token = obj.data('upload-token'); $.ajax({ - url: '{% url 'remove_shared_upload_link' %}?t=' + token, + url: '{% url 'ajax_remove_shared_upload_link' %}?t=' + token, dataType: 'json', cache: false, success: function(data) { diff --git a/seahub/urls.py b/seahub/urls.py index 67c777f8d4..259867a7e2 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -49,8 +49,6 @@ urlpatterns = patterns('', url(r'^home/wiki_page_edit/(?P[^/]+)$', personal_wiki_page_edit, name='personal_wiki_page_edit'), url(r'^home/wiki_page_delete/(?P[^/]+)$', personal_wiki_page_delete, name='personal_wiki_page_delete'), - # url(r'^home/clients/$', client_mgmt, name='client_mgmt'), - # url(r'^home/clients/unsync/$', client_unsync, name='client_unsync'), url(r'^devices/$', devices, name='devices'), url(r'^home/devices/unlink/$', unlink_device, name='unlink_device'), diff --git a/seahub/views/__init__.py b/seahub/views/__init__.py index 07f4440667..54d2c270b4 100644 --- a/seahub/views/__init__.py +++ b/seahub/views/__init__.py @@ -34,7 +34,7 @@ from seaserv import seafile_api from pysearpc import SearpcError from seahub.avatar.util import get_avatar_file_storage -from seahub.auth.decorators import login_required +from seahub.auth.decorators import login_required, login_required_ajax from seahub.auth import login as auth_login from seahub.auth import authenticate, get_backends from seahub.base.accounts import User @@ -527,7 +527,7 @@ def repo_settings(request, repo_id): 'repo_shared_links': repo_shared_links, }, context_instance=RequestContext(request)) -@login_required +@login_required_ajax def repo_owner(request, repo_id): """Handle post request to transfer library owner. """ @@ -584,7 +584,7 @@ def repo_owner(request, repo_id): return HttpResponse(json.dumps({'success': True}), content_type=content_type) -@login_required +@login_required_ajax def repo_change_passwd(request, repo_id): """Handle ajax post request to change library password. """ @@ -1056,11 +1056,8 @@ def devices(request): "devices": user_devices, }, context_instance=RequestContext(request)) -@login_required +@login_required_ajax def unlink_device(request): - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' platform = request.POST.get('platform', '') @@ -1078,58 +1075,6 @@ def unlink_device(request): return HttpResponse(json.dumps({'success': True}), content_type=content_type) -@login_required -@user_mods_check -def client_mgmt(request): - username = request.user.username - - clients = [] - try: - clients = seafile_api.list_repo_tokens_by_email(username) - except: - pass - - filter_clients = [] - for c in clients: - if c.peer_name is not None: - filter_clients.append(c) - - if filter_clients: - filter_clients.sort(key=lambda client: client.peer_name) - for i, client in enumerate(filter_clients): - if i == 0: - client.show_peer_name = True - else: - if client.peer_name != filter_clients[i-1].peer_name: - client.show_peer_name = True - - return render_to_response('client_mgmt.html', { - 'clients': filter_clients, - }, context_instance=RequestContext(request)) - -@login_required -def client_unsync(request): - if not request.is_ajax(): - raise Http404 - - content_type = 'application/json; charset=utf-8' - - repo_id = request.GET.get('repo_id', '') - token = request.GET.get('token', '') - - if not (repo_id and token): - return HttpResponse(json.dumps({'error': _(u'Argument missing')}), - status=400, content_type=content_type) - - username = request.user.username - try: - seafile_api.delete_repo_token(repo_id, token, username) - return HttpResponse(json.dumps({'success': True}), - content_type=content_type) - except: - return HttpResponse(json.dumps({'error': _(u'Internal server error')}), - status=500, content_type=content_type) - @login_required def unsetinnerpub(request, repo_id): """Unshare repos in organization or in share admin page. @@ -1708,6 +1653,7 @@ def pubuser(request): 'page_range': page_range, }, context_instance=RequestContext(request)) +@login_required_ajax def repo_set_password(request): content_type = 'application/json; charset=utf-8' diff --git a/seahub/views/ajax.py b/seahub/views/ajax.py index de37485fb3..0a3401b69b 100644 --- a/seahub/views/ajax.py +++ b/seahub/views/ajax.py @@ -18,7 +18,7 @@ from seaserv import seafile_api, seafserv_rpc, is_passwd_set, \ get_user_quota_usage, get_user_share_usage from pysearpc import SearpcError -from seahub.auth.decorators import login_required +from seahub.auth.decorators import login_required_ajax from seahub.contacts.models import Contact from seahub.forms import RepoNewDirentForm, RepoRenameDirentForm, \ RepoCreateForm, SharedRepoCreateForm @@ -57,14 +57,11 @@ def is_group_user(gid, username): return seaserv.is_group_user(gid, username) ########## repo related -@login_required +@login_required_ajax def get_dirents(request, repo_id): """ Get dirents in a dir for file tree """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' # permission checking @@ -79,7 +76,7 @@ def get_dirents(request, repo_id): all_dir = request.GET.get('all_dir', False) if not path: err_msg = _(u"No path.") - return HttpResponse(json.dumps({"err_msg": err_msg}), status=400, + return HttpResponse(json.dumps({"error": err_msg}), status=400, content_type=content_type) # get dirents for every path element @@ -104,7 +101,7 @@ def get_dirents(request, repo_id): try: dirents = seafile_api.list_dir_by_path(repo_id, path.encode('utf-8')) except SearpcError, e: - return HttpResponse(json.dumps({"err_msg": e.msg}), status=500, + return HttpResponse(json.dumps({"error": e.msg}), status=500, content_type=content_type) d_list = [] @@ -144,28 +141,24 @@ def get_dirents(request, repo_id): f_list.sort(lambda x, y : cmp(x['name'].lower(), y['name'].lower())) return HttpResponse(json.dumps(d_list + f_list), content_type=content_type) -@login_required +@login_required_ajax def get_unenc_group_repos(request, group_id): ''' Get unenc repos in a group. ''' - - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' group_id_int = int(group_id) group = get_group(group_id_int) if not group: err_msg = _(u"The group doesn't exist") - return HttpResponse(json.dumps({"err_msg": err_msg}), status=400, + return HttpResponse(json.dumps({"error": err_msg}), status=400, content_type=content_type) joined = is_group_user(group_id_int, request.user.username) if not joined and not request.user.is_staff: err_msg = _(u"Permission denied") - return HttpResponse(json.dumps({"err_msg": err_msg}), status=403, + return HttpResponse(json.dumps({"error": err_msg}), status=403, content_type=content_type) repos = seafile_api.get_group_repo_list(group_id_int) @@ -177,13 +170,10 @@ def get_unenc_group_repos(request, group_id): repo_list.sort(lambda x, y : cmp(x['name'].lower(), y['name'].lower())) return HttpResponse(json.dumps(repo_list), content_type=content_type) -@login_required +@login_required_ajax def get_my_unenc_repos(request): """Get my owned and unencrypted repos. """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' repos = get_owned_repo_list(request) @@ -196,16 +186,13 @@ def get_my_unenc_repos(request): repo_list.sort(lambda x, y: cmp(x['name'].lower(), y['name'].lower())) return HttpResponse(json.dumps(repo_list), content_type=content_type) -@login_required +@login_required_ajax def unenc_rw_repos(request): """Get a user's unencrypt repos that he/she can read-write. Arguments: - `request`: """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' acc_repos = get_unencry_rw_repos_by_user(request) @@ -216,14 +203,11 @@ def unenc_rw_repos(request): repo_list.sort(lambda x, y: cmp(x['name'].lower(), y['name'].lower())) return HttpResponse(json.dumps(repo_list), content_type=content_type) -@login_required +@login_required_ajax def list_dir(request, repo_id): """ List directory entries in AJAX. """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' repo = get_repo(repo_id) @@ -303,14 +287,11 @@ def list_dir(request, repo_id): return HttpResponse(json.dumps({'html': html, 'path': path}), content_type=content_type) -@login_required +@login_required_ajax def list_dir_more(request, repo_id): """ List 'more' entries in a directory with AJAX. """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' repo = get_repo(repo_id) @@ -381,7 +362,7 @@ def new_dirent_common(func): """Decorator for common logic in creating directory and file. """ def _decorated(request, repo_id, *args, **kwargs): - if request.method != 'POST' or not request.is_ajax(): + if request.method != 'POST': raise Http404 result = {} @@ -422,7 +403,7 @@ def new_dirent_common(func): return func(repo.id, parent_dir, dirent_name, username) return _decorated -@login_required +@login_required_ajax @new_dirent_common def new_dir(repo_id, parent_dir, dirent_name, username): """ @@ -442,7 +423,7 @@ def new_dir(repo_id, parent_dir, dirent_name, username): return HttpResponse(json.dumps({'success': True, 'name': dirent_name}), content_type=content_type) -@login_required +@login_required_ajax @new_dirent_common def new_file(repo_id, parent_dir, dirent_name, username): """ @@ -462,12 +443,12 @@ def new_file(repo_id, parent_dir, dirent_name, username): return HttpResponse(json.dumps({'success': True, 'name': dirent_name}), content_type=content_type) -@login_required +@login_required_ajax def rename_dirent(request, repo_id): """ Rename a file/dir in a repo, with ajax """ - if request.method != 'POST' or not request.is_ajax(): + if request.method != 'POST': raise Http404 result = {} @@ -521,14 +502,11 @@ def rename_dirent(request, repo_id): return HttpResponse(json.dumps({'success': True}), content_type=content_type) -@login_required +@login_required_ajax def delete_dirent(request, repo_id): """ Delete a file/dir with ajax. """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' repo = get_repo(repo_id) @@ -563,14 +541,11 @@ def delete_dirent(request, repo_id): return HttpResponse(json.dumps({'error': err_msg}), status=500, content_type=content_type) -@login_required +@login_required_ajax def delete_dirents(request, repo_id): """ Delete multi files/dirs with ajax. """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' repo = get_repo(repo_id) @@ -611,7 +586,7 @@ def copy_move_common(func): """Decorator for common logic in copying/moving dir/file. """ def _decorated(request, repo_id, *args, **kwargs): - if request.method != 'POST' or not request.is_ajax(): + if request.method != 'POST': raise Http404 result = {} @@ -661,7 +636,7 @@ def copy_move_common(func): return func(repo_id, path, dst_repo_id, dst_path, obj_name, username) return _decorated -@login_required +@login_required_ajax @copy_move_common def mv_file(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): result = {} @@ -691,7 +666,7 @@ def mv_file(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): return HttpResponse(json.dumps(result), content_type=content_type) -@login_required +@login_required_ajax @copy_move_common def cp_file(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): result = {} @@ -721,7 +696,7 @@ def cp_file(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): return HttpResponse(json.dumps(result), content_type=content_type) -@login_required +@login_required_ajax @copy_move_common def mv_dir(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): result = {} @@ -758,7 +733,7 @@ def mv_dir(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): return HttpResponse(json.dumps(result), content_type=content_type) -@login_required +@login_required_ajax @copy_move_common def cp_dir(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): result = {} @@ -802,7 +777,7 @@ def dirents_copy_move_common(func): """ def _decorated(request, repo_id, *args, **kwargs): - if request.method != 'POST' or not request.is_ajax(): + if request.method != 'POST': raise Http404 result = {} @@ -854,7 +829,7 @@ def dirents_copy_move_common(func): return func(repo_id, parent_dir, dst_repo_id, dst_path, obj_file_names, obj_dir_names, username) return _decorated -@login_required +@login_required_ajax @dirents_copy_move_common def mv_dirents(src_repo_id, src_path, dst_repo_id, dst_path, obj_file_names, obj_dir_names, username): result = {} @@ -893,7 +868,7 @@ def mv_dirents(src_repo_id, src_path, dst_repo_id, dst_path, obj_file_names, obj result = {'success': success, 'failed': failed, 'url': url, 'task_ids': task_ids} return HttpResponse(json.dumps(result), content_type=content_type) -@login_required +@login_required_ajax @dirents_copy_move_common def cp_dirents(src_repo_id, src_path, dst_repo_id, dst_path, obj_file_names, obj_dir_names, username): result = {} @@ -932,14 +907,11 @@ def cp_dirents(src_repo_id, src_path, dst_repo_id, dst_path, obj_file_names, obj result = {'success': success, 'failed': failed, 'url': url, 'task_ids': task_ids} return HttpResponse(json.dumps(result), content_type=content_type) -@login_required +@login_required_ajax def get_cp_progress(request): ''' Fetch progress of file/dir mv/cp. ''' - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' result = {} @@ -964,14 +936,11 @@ def get_cp_progress(request): return HttpResponse(json.dumps(result), content_type=content_type) -@login_required +@login_required_ajax def get_multi_cp_progress(request): ''' Fetch progress of multi files/dirs mv/cp. ''' - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' result = {} @@ -997,14 +966,11 @@ def get_multi_cp_progress(request): result['fail'] = fail return HttpResponse(json.dumps(result), content_type=content_type) -@login_required +@login_required_ajax def cancel_cp(request): ''' cancel file/dir mv/cp. ''' - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' result = {} @@ -1024,11 +990,8 @@ def cancel_cp(request): return HttpResponse(json.dumps(result), status=400, content_type=content_type) -@login_required +@login_required_ajax def repo_star_file(request, repo_id): - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' path = request.GET.get('file', '') @@ -1041,11 +1004,8 @@ def repo_star_file(request, repo_id): return HttpResponse(json.dumps({'success':True}), content_type=content_type) -@login_required +@login_required_ajax def repo_unstar_file(request, repo_id): - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' path = request.GET.get('file', '') @@ -1058,11 +1018,8 @@ def repo_unstar_file(request, repo_id): return HttpResponse(json.dumps({'success':True}), content_type=content_type) ########## contacts related -@login_required +@login_required_ajax def get_contacts(request): - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' username = request.user.username @@ -1074,11 +1031,8 @@ def get_contacts(request): return HttpResponse(json.dumps({"contacts":contact_list}), content_type=content_type) -@login_required +@login_required_ajax def get_current_commit(request, repo_id): - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' repo = get_repo(repo_id) @@ -1127,15 +1081,12 @@ def get_current_commit(request, repo_id): return HttpResponse(json.dumps({'html': html}), content_type=content_type) -@login_required +@login_required_ajax def sub_repo(request, repo_id): ''' check if a dir has a corresponding sub_repo if it does not have, create one ''' - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' result = {} @@ -1180,10 +1131,8 @@ def sub_repo(request, repo_id): return HttpResponse(json.dumps(result), content_type=content_type) +@login_required_ajax def download_enc_file(request, repo_id, file_id): - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' result = {} @@ -1255,22 +1204,14 @@ def upload_file_done(request): return HttpResponse(json.dumps({'success': True}), content_type=ct) +@login_required_ajax def unseen_notices_count(request): """Count user's unseen notices. Arguments: - `request`: """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' - - if not request.user.is_authenticated(): - return HttpResponse(json.dumps({ - 'error': _('Please log in.') - }), status=400, content_type=content_type) - username = request.user.username count = UserNotification.objects.count_unseen_user_notifications(username) @@ -1278,6 +1219,7 @@ def unseen_notices_count(request): result['count'] = count return HttpResponse(json.dumps(result), content_type=content_type) +@login_required_ajax def get_popup_notices(request): """Get user's notifications. @@ -1289,16 +1231,7 @@ def get_popup_notices(request): Arguments: - `request`: """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' - - if not request.user.is_authenticated(): - return HttpResponse(json.dumps({ - 'error': _('Please log in.') - }), status=400, content_type=content_type) - username = request.user.username result_notices = [] @@ -1371,16 +1304,13 @@ def get_popup_notices(request): "notice_html": notice_html, }), content_type=content_type) -@login_required +@login_required_ajax def set_notices_seen(request): """Set user's notices seen: Arguments: - `request`: """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' username = request.user.username @@ -1392,16 +1322,13 @@ def set_notices_seen(request): return HttpResponse(json.dumps({'success': True}), content_type=content_type) -@login_required +@login_required_ajax def set_notice_seen_by_id(request): """ Arguments: - `request`: """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' notice_id = request.GET.get('notice_id') @@ -1412,14 +1339,8 @@ def set_notice_seen_by_id(request): return HttpResponse(json.dumps({'success': True}), content_type=content_type) -@login_required +@login_required_ajax def repo_remove(request, repo_id): - if not request.is_ajax(): - raise Http404 - - ct = 'application/json; charset=utf-8' - result = {} - if get_system_default_repo_id() == repo_id: result['error'] = _(u'System library can not be deleted.') return HttpResponse(json.dumps(result), status=403, content_type=ct) @@ -1471,17 +1392,10 @@ def repo_remove(request, repo_id): result['error'] = _(u'Permission denied.') return HttpResponse(json.dumps(result), status=403, content_type=ct) +@login_required_ajax def space_and_traffic(request): - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' - if not request.user.is_authenticated(): - return HttpResponse(json.dumps({ - 'error': _('Please log in.') - }), status=400, content_type=content_type) - username = request.user.username quota = seafserv_threaded_rpc.get_user_quota(username) @@ -1625,16 +1539,13 @@ def get_group_repos(request, groups): group_repos.append(r) return group_repos -@login_required +@login_required_ajax def my_shared_and_group_repos(request): """Return html snippet of repos that shared to user and group repos. Arguments: - `request`: """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' # shared @@ -1672,13 +1583,10 @@ def my_shared_and_group_repos(request): } return HttpResponse(json.dumps(ret), content_type=content_type) -@login_required +@login_required_ajax def get_file_op_url(request, repo_id): """Get file upload/update url for AJAX. """ - if not request.is_ajax(): - raise Http404 - content_type = 'application/json; charset=utf-8' op_type = request.GET.get('op_type') # value can be 'upload', 'update', 'upload-blks', 'update-blks' @@ -1696,11 +1604,8 @@ def get_file_op_url(request, repo_id): return HttpResponse(json.dumps({"url": url}), content_type=content_type) -@login_required +@login_required_ajax def repo_history_changes(request, repo_id): - if not request.is_ajax(): - return Http404 - changes = {} content_type = 'application/json; charset=utf-8' @@ -1743,13 +1648,13 @@ def repo_history_changes(request, repo_id): return HttpResponse(json.dumps(changes), content_type=content_type) -@login_required +@login_required_ajax def repo_create(request): ''' Handle ajax post to create a library. ''' - if not request.is_ajax() or request.method != 'POST': + if request.method != 'POST': return Http404 result = {} @@ -1819,13 +1724,13 @@ def repo_create(request): repo_name=repo_name) return HttpResponse(json.dumps(result), content_type=content_type) -@login_required +@login_required_ajax def public_repo_create(request): ''' Handle ajax post to create public repo. ''' - if not request.is_ajax() or request.method != 'POST': + if request.method != 'POST': return Http404 result = {} @@ -1874,11 +1779,8 @@ def public_repo_create(request): repo_name=repo_name) return HttpResponse(json.dumps(result), content_type=content_type) -@login_required +@login_required_ajax def events(request): - if not request.is_ajax(): - raise Http404 - events_count = 15 username = request.user.username start = int(request.GET.get('start')) diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py index 4a3d5503be..abfb2d827a 100644 --- a/seahub/views/sysadmin.py +++ b/seahub/views/sysadmin.py @@ -22,7 +22,7 @@ from pysearpc import SearpcError from seahub.base.accounts import User from seahub.base.models import UserLastLogin from seahub.base.decorators import sys_staff_required -from seahub.auth.decorators import login_required +from seahub.auth.decorators import login_required, login_required_ajax from seahub.utils import IS_EMAIL_CONFIGURED, string2list, is_valid_username from seahub.views import get_system_default_repo_id from seahub.forms import SetUserQuotaForm, AddUserForm, BatchAddUserForm @@ -343,10 +343,10 @@ def user_info(request, email): 'd_profile': d_profile, }, context_instance=RequestContext(request)) -@login_required +@login_required_ajax @sys_staff_required def user_set_quota(request, email): - if not request.is_ajax() or request.method != 'POST': + if request.method != 'POST': raise Http404 content_type = 'application/json; charset=utf-8' @@ -361,7 +361,7 @@ def user_set_quota(request, email): try: seafile_api.set_user_quota(email, quota) except: - result['error'] = _(u'Failed to set quota: internal error') + result['error'] = _(u'Failed to set quota: internal server error') return HttpResponse(json.dumps(result), status=500, content_type=content_type) result['success'] = True @@ -463,7 +463,7 @@ def email_user_on_activation(user): send_html_email(_(u'Your account on %s is activated') % SITE_NAME, 'sysadmin/user_activation_email.html', c, None, [user.email]) -@login_required +@login_required_ajax @sys_staff_required def user_toggle_status(request, user_id): content_type = 'application/json; charset=utf-8' @@ -558,31 +558,44 @@ def send_user_add_mail(request, email, password): send_html_email(_(u'You are invited to join %s') % SITE_NAME, 'sysadmin/user_add_email.html', c, None, [email]) -@login_required +@login_required_ajax def user_add(request): """Add a user""" - if not request.user.is_staff: + if not request.user.is_staff or request.method != 'POST': raise Http404 content_type = 'application/json; charset=utf-8' - if request.method == 'POST': - post_values = request.POST.copy() - post_email = request.POST.get('email', '') - post_values.update({'email': post_email.lower()}) - form = AddUserForm(post_values) - if form.is_valid(): - email = form.cleaned_data['email'] - password = form.cleaned_data['password1'] + post_values = request.POST.copy() + post_email = request.POST.get('email', '') + post_values.update({'email': post_email.lower()}) - user = User.objects.create_user(email, password, is_staff=False, - is_active=True) - if request.user.org: - org_id = request.user.org.org_id - url_prefix = request.user.org.url_prefix - ccnet_threaded_rpc.add_org_user(org_id, email, 0) - if IS_EMAIL_CONFIGURED: + form = AddUserForm(post_values) + if form.is_valid(): + email = form.cleaned_data['email'] + password = form.cleaned_data['password1'] + + user = User.objects.create_user(email, password, is_staff=False, + is_active=True) + if request.user.org: + org_id = request.user.org.org_id + url_prefix = request.user.org.url_prefix + ccnet_threaded_rpc.add_org_user(org_id, email, 0) + if IS_EMAIL_CONFIGURED: + try: + send_user_add_mail(request, email, password) + messages.success(request, _(u'Successfully added user %s. An email notification has been sent.') % email) + except Exception, e: + logger.error(str(e)) + messages.success(request, _(u'Successfully added user %s. An error accurs when sending email notification, please check your email configuration.') % email) + else: + messages.success(request, _(u'Successfully added user %s.') % email) + + return HttpResponse(json.dumps({'success': True}), content_type=content_type) + else: + if IS_EMAIL_CONFIGURED: + if SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER: try: send_user_add_mail(request, email, password) messages.success(request, _(u'Successfully added user %s. An email notification has been sent.') % email) @@ -591,25 +604,12 @@ def user_add(request): messages.success(request, _(u'Successfully added user %s. An error accurs when sending email notification, please check your email configuration.') % email) else: messages.success(request, _(u'Successfully added user %s.') % email) - - return HttpResponse(json.dumps({'success': True}), content_type=content_type) else: - if IS_EMAIL_CONFIGURED: - if SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER: - try: - send_user_add_mail(request, email, password) - messages.success(request, _(u'Successfully added user %s. An email notification has been sent.') % email) - except Exception, e: - logger.error(str(e)) - messages.success(request, _(u'Successfully added user %s. An error accurs when sending email notification, please check your email configuration.') % email) - else: - messages.success(request, _(u'Successfully added user %s.') % email) - else: - messages.success(request, _(u'Successfully added user %s. But email notification can not be sent, because Email service is not properly configured.') % email) + messages.success(request, _(u'Successfully added user %s. But email notification can not be sent, because Email service is not properly configured.') % email) - return HttpResponse(json.dumps({'success': True}), content_type=content_type) - else: - return HttpResponse(json.dumps({'err': str(form.errors)}), status=400, content_type=content_type) + return HttpResponse(json.dumps({'success': True}), content_type=content_type) + else: + return HttpResponse(json.dumps({'err': str(form.errors)}), status=400, content_type=content_type) @login_required @sys_staff_required @@ -808,12 +808,12 @@ def sys_traffic_admin(request): }, context_instance=RequestContext(request)) -@login_required +@login_required_ajax @sys_staff_required def batch_user_make_admin(request): """Batch make users as admins. """ - if not request.is_ajax() or request.method != 'POST': + if request.method != 'POST': raise Http404 result = {}