diff --git a/media/css/seahub.css b/media/css/seahub.css index 49ea5d7f54..47f02421e0 100644 --- a/media/css/seahub.css +++ b/media/css/seahub.css @@ -2254,14 +2254,16 @@ textarea:-moz-placeholder {/* for FF */ #md-edit-help { width:550px; } -/* shareadmin */ +/* shareadmin & useradmin */ .view-link-alert p { display: inline-block; } -.share-permission-edit-icon { +.share-permission-edit-icon, +.user-status-edit-icon { cursor:pointer; } -.share-permission-select { +.share-permission-select, +.user-status-select { position:relative;/*for long text in other lang in 'share admin'*/ background:#fff; border:1px solid #ddd; diff --git a/seahub/templates/sysadmin/sys_useradmin.html b/seahub/templates/sysadmin/sys_useradmin.html index ea958bb65a..93b876e3e5 100644 --- a/seahub/templates/sysadmin/sys_useradmin.html +++ b/seahub/templates/sysadmin/sys_useradmin.html @@ -31,12 +31,24 @@ {% for user in users %} - {{ user.email }} - {% if user.props.is_active %} - {% trans "Activated" %} - {% else %} - {% trans "Active" %} - {% endif %} + {{ user.email }} + + +
+ {% if user.is_active %} + {% trans "Active" %} + {% else %} + {% trans "Inactive" %} + {% endif %} + {% trans +
+ + + {% if CALC_SHARE_USAGE %} {{ user.self_usage|filesizeformat }} + {{ user.share_usage|filesizeformat }} {% if user.quota > 0 %} / {{ user.quota|filesizeformat }} {% endif %} @@ -117,6 +129,54 @@ $('#search-user-btn').click(function() { location.href = "{% url 'user_search' %}"; }); +$('tr:gt(0)').hover( + function() { + $(this).find('.user-status-edit-icon').removeClass('vh'); + }, + function() { + $(this).find('.user-status-edit-icon').addClass('vh'); + } +); +$('.user-status-edit-icon').click(function() { + $(this).parent().addClass('hide'); + $(this).parent().next().removeClass('hide'); // show 'user-status-select' +}); +$('.user-status-select').change(function() { + var select = $(this), + uid = $(this).parent().prev().attr('data'), + select_val = select.val(), + url = "{{ SITE_ROOT }}useradmin/toggle_status/" + uid + "/?s=" + select_val; + + $.ajax({ + url: url, + type: 'GET', + dataType: 'json', + cache: false, + success: function(data) { + if (data['success']) { + feedback("{% trans "Edit succeeded" %}", 'success'); + select.prev().children('.user-status-cur-value').html(select.children('option[value="' +select.val() + '"]').text()); + } + select.addClass('hide'); + select.prev().removeClass('hide'); + }, + error: function() { + feedback("{% trans "Edit failed." %}", 'error'); + select.addClass('hide'); + select.prev().removeClass('hide'); + } + }); +}); +// select shows, but the user doesn't select a value, or doesn't change the permission, click other place to hide the select +$(document).click(function(e) { + var target = e.target || event.srcElement; + // target can't be edit-icon + if (!$('.user-status-edit-icon, .user-status-select').is(target)) { + $('.user-status').removeClass('hide'); + $('.user-status-select').addClass('hide'); + } +}); + $('#add-user-form').submit(function() { var form = $(this), form_id = $(this).attr('id'), diff --git a/seahub/urls.py b/seahub/urls.py index 3938fcb008..7546852d37 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -18,7 +18,8 @@ from seahub.views.wiki import personal_wiki, personal_wiki_pages, \ from seahub.views.sysadmin import sys_repo_admin, sys_user_admin, user_search,\ sys_group_admin, user_info, user_add, user_remove, user_make_admin, \ user_remove_admin, user_reset, user_activate, sys_publink_admin, \ - sys_repo_search, sys_repo_transfer, sys_list_orphan + sys_repo_search, sys_repo_transfer, sys_list_orphan, user_deactivate, \ + user_toggle_status from seahub.views.ajax import * # Uncomment the next two lines to enable the admin: @@ -158,7 +159,10 @@ urlpatterns = patterns('', url(r'^useradmin/makeadmin/(?P[^/]+)/$', user_make_admin, name='user_make_admin'), url(r'^useradmin/removeadmin/(?P[^/]+)/$', user_remove_admin, name='user_remove_admin'), url(r'^useradmin/info/(?P[^/]+)/$', user_info, name='user_info'), - (r'^useradmin/activate/(?P[^/]+)/$', user_activate), + url(r'^useradmin/activate/(?P[^/]+)/$', user_activate, name='user_activate'), + url(r'^useradmin/deactivate/(?P[^/]+)/$', user_deactivate, name='user_deactivate'), + url(r'^useradmin/toggle_status/(?P[^/]+)/$', user_toggle_status, name='user_toggle_status'), + url(r'^useradmin/password/reset/(?P[^/]+)/$', user_reset, name='user_reset'), ) diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py index a5e7dd757d..5782c64add 100644 --- a/seahub/views/sysadmin.py +++ b/seahub/views/sysadmin.py @@ -285,6 +285,43 @@ def user_activate(request, user_id): return HttpResponseRedirect(next) +@login_required +@sys_staff_required +def user_deactivate(request, user_id): + try: + user = User.objects.get(id=int(user_id)) + user.is_active = False + user.save() + messages.success(request, _(u'Successfully deactivated "%s".') % user.email) + except User.DoesNotExist: + messages.success(request, _(u'Failed to deactivate: user does not exist.')) + + next = request.META.get('HTTP_REFERER', None) + if not next: + next = reverse('sys_useradmin') + + return HttpResponseRedirect(next) + +@login_required +@sys_staff_required +def user_toggle_status(request, user_id): + content_type = 'application/json; charset=utf-8' + + try: + user_status = int(request.GET.get('s', 0)) + except ValueError: + user_status = 0 + + try: + user = User.objects.get(id=int(user_id)) + user.is_active = bool(user_status) + user.save() + return HttpResponse(json.dumps({'success': True}), + content_type=content_type) + except User.DoesNotExist: + return HttpResponse(json.dumps({'success': False}), status=500, + content_type=content_type) + def send_user_reset_email(request, email, password): """ Send email when reset user password.