diff --git a/seahub/templates/sysadmin/sys_org_info.html b/seahub/templates/sysadmin/sys_org_info.html index 1fbc281c5c..a69e43b632 100644 --- a/seahub/templates/sysadmin/sys_org_info.html +++ b/seahub/templates/sysadmin/sys_org_info.html @@ -15,7 +15,7 @@ {% block left_panel %}
- +

{{ org.org_name }}

{% trans "Number of members" %}
@@ -48,40 +48,79 @@
- + + + + + + + + + + {% for user in users %} + + + + + + + + {% endfor %} +
{% trans "Email" %}{% trans "Status" %}{% trans "Space Used" %}{% trans "Create At / Last Login" %}{% trans "Operations" %}
{{ 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 %} + {% else %} + {{ user.self_usage|filesizeformat }} {% if user.quota > 0 %} / {{ user.quota|filesizeformat }} {% endif %} + {% endif %} + + {{ user.ctime|tsstr_sec }} / {% if user.last_login %}{{user.last_login|translate_seahub_time}} {% else %} -- {% endif %} + + {% if not user.is_self %} + {% trans "Delete" %} + {% trans "ResetPwd" %} + {% endif %} +
{% if groups %} -
+
+

{% trans "Activating..., please wait" %}

+
{% endblock %} {% block extra_script %} @@ -126,6 +165,76 @@ $('#set-quota-form .submit').click(function() { }); return false; }); +addConfirmTo($('.group-remove-btn'), { + 'title': "{% trans "Delete Group" %}", + 'con': "{% trans "Are you sure you want to delete %s ?" %}" +}); +addConfirmTo($('.remove-user-btn'), { + 'title':"{% trans "Delete User" %}", + 'con':"{% trans "Are you sure you want to delete %s ?" %}" +}); +addConfirmTo($('.reset-user-btn'), { + 'title':"{% trans "Password Reset" %}", + 'con':"{% trans "Are you sure you want to reset the password of %s ?" %}" +}); +$('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 'select' +}); +$('.user-status-select').change(function() { + var select = $(this), + select_val = select.val(), + uid = select.parents('tr').attr('data-userid'), + url = "{{ SITE_ROOT }}useradmin/toggle_status/" + uid + "/?s=" + select_val; + $.ajax({ + url: url, + type: 'GET', + dataType: 'json', + cache: false, + beforeSend: function() { + if (select_val == 1) { + // show activating popup + $('#activate-msg').modal(); + $('#simplemodal-container').css({'height':'auto'}); + } + }, + success: function(data) { + if (data['email_sent']) { + feedback("{% trans "Edit succeeded, an email has been sent." %}", 'success'); + } else if (data['email_sent'] === false) { + feedback("{% trans "Edit succeeded, but failed to send email, please check your email configuration." %}", 'success'); + } else { + feedback("{% trans "Edit succeeded" %}", 'success'); + } + select.prev().children('span').html(select.children('option[value="' +select.val() + '"]').text()); + select.addClass('hide'); + select.prev().removeClass('hide'); + $.modal.close(); + }, + error: function() { + feedback("{% trans "Edit failed." %}", 'error'); + select.addClass('hide'); + select.prev().removeClass('hide'); + $.modal.close(); + } + }); +}); +$(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'); + } +}); {% endblock %} diff --git a/seahub/urls.py b/seahub/urls.py index e88c6e0385..2304cbc771 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -191,7 +191,7 @@ urlpatterns = patterns('', url(r'^sys/publinkadmin/$', sys_publink_admin, name='sys_publink_admin'), url(r'^sys/notificationadmin/', notification_list, name='notification_list'), url(r'^useradmin/add/$', user_add, name="user_add"), - (r'^useradmin/remove/(?P[^/]+)/$', user_remove), + url(r'^useradmin/remove/(?P[^/]+)/$', user_remove, name="user_remove"), url(r'^useradmin/search/$', user_search, name="user_search"), url(r'^useradmin/makeadmin/(?P[^/]+)/$', user_make_admin, name='user_make_admin'), url(r'^useradmin/removeadmin/(?P[^/]+)/$', user_remove_admin, name='user_remove_admin'), diff --git a/seahub/views/ajax.py b/seahub/views/ajax.py index f534752f3f..c1df957cff 100644 --- a/seahub/views/ajax.py +++ b/seahub/views/ajax.py @@ -14,7 +14,7 @@ from django.utils.translation import ugettext as _ import seaserv from seaserv import seafile_api, seafserv_rpc, is_passwd_set, \ get_related_users_by_repo, get_related_users_by_org_repo, \ - CALC_SHARE_USAGE, seafserv_threaded_rpc, \ + CALC_SHARE_USAGE, seafserv_threaded_rpc, ccnet_threaded_rpc, \ get_user_quota_usage, get_user_share_usage from pysearpc import SearpcError @@ -1356,10 +1356,17 @@ def space_and_traffic(request): username = request.user.username - quota = seafserv_threaded_rpc.get_user_quota(username) - quota_usage = 0 - share_usage = 0 - my_usage = get_user_quota_usage(username) + org = ccnet_threaded_rpc.get_orgs_by_user(username) + if not org: + quota = seafserv_threaded_rpc.get_user_quota(username) + my_usage = get_user_quota_usage(username) + else: + org_id = org[0].org_id + quota = seafserv_threaded_rpc.get_org_user_quota(org_id, + username) + my_usage = seafserv_threaded_rpc.get_org_user_quota_usage(org_id, + username) + rates = {} if CALC_SHARE_USAGE: share_usage = get_user_share_usage(username) @@ -1369,6 +1376,7 @@ def space_and_traffic(request): rates['share_usage'] = str(float(share_usage)/quota * 100) + '%' else: quota_usage = my_usage + share_usage = 0 if quota > 0: rates['quota_usage'] = str(float(my_usage)/quota * 100) + '%' diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py index abff4153c3..921a16a4c7 100644 --- a/seahub/views/sysadmin.py +++ b/seahub/views/sysadmin.py @@ -173,14 +173,23 @@ def sys_user_admin(request): for user in users: if user.props.id == request.user.id: user.is_self = True + + org = ccnet_threaded_rpc.get_orgs_by_user(user.email) try: - user.self_usage = seafile_api.get_user_self_usage(user.email) - user.share_usage = seafile_api.get_user_share_usage(user.email) - user.quota = seafile_api.get_user_quota(user.email) + if not org: + user.self_usage = seafile_api.get_user_self_usage(user.email) + user.share_usage = seafile_api.get_user_share_usage(user.email) + user.quota = seafile_api.get_user_quota(user.email) + else: + org_id = org[0].org_id + user.self_usage = seafserv_threaded_rpc.get_org_user_quota_usage(org_id, user.email) + user.share_usage = 0 #seafile_api.get_user_share_usage(user.email) + user.quota = seafserv_threaded_rpc.get_org_user_quota(org_id, user.email) except: user.self_usage = -1 user.share_usage = -1 user.quota = -1 + # check user's role if user.role == GUEST_USER: user.is_guest = True @@ -320,11 +329,17 @@ def sys_user_admin_admins(request): def user_info(request, email): owned_repos = seafile_api.get_owned_repo_list(email) - quota = seafile_api.get_user_quota(email) - quota_usage = 0 - share_usage = 0 - my_usage = 0 - my_usage = seafile_api.get_user_self_usage(email) + org = ccnet_threaded_rpc.get_orgs_by_user(email) + if not org: + my_usage = seafile_api.get_user_self_usage(email) + quota = seafile_api.get_user_quota(email) + else: + org_id = org[0].org_id + my_usage =seafserv_threaded_rpc. \ + get_org_user_quota_usage(org_id, email) + quota = seafserv_threaded_rpc. \ + get_org_user_quota(org_id, email) + if CALC_SHARE_USAGE: try: share_usage = seafile_api.get_user_share_usage(email) @@ -333,6 +348,7 @@ def user_info(request, email): share_usage = 0 quota_usage = my_usage + share_usage else: + share_usage = 0 quota_usage = my_usage # Repos that are share to user @@ -371,8 +387,13 @@ def user_set_quota(request, email): quota_mb = f.cleaned_data['quota'] quota = quota_mb * (1 << 20) + org = ccnet_threaded_rpc.get_orgs_by_user(email) try: - seafile_api.set_user_quota(email, quota) + if not org: + seafile_api.set_user_quota(email, quota) + else: + org_id = org[0].org_id + seafserv_threaded_rpc.set_org_user_quota(org_id, email, quota) except: result['error'] = _(u'Failed to set quota: internal server error') return HttpResponse(json.dumps(result), status=500, content_type=content_type) @@ -383,7 +404,6 @@ def user_set_quota(request, email): result['error'] = str(f.errors.values()[0]) return HttpResponse(json.dumps(result), status=400, content_type=content_type) - @login_required_ajax @sys_staff_required def sys_org_set_quota(request, org_id): @@ -413,6 +433,12 @@ def user_remove(request, user_id): """Remove user, also remove group relationship.""" try: user = User.objects.get(id=int(user_id)) + org = ccnet_threaded_rpc.get_orgs_by_user(user.email) + if org: + org_id = org[0].org_id + org_repos = seafile_api.get_org_owned_repo_list(org_id, user.email) + for repo in org_repos: + seafile_api.remove_repo(repo.id) user.delete() messages.success(request, _(u'Successfully deleted %s') % user.username) except User.DoesNotExist: @@ -420,7 +446,7 @@ def user_remove(request, user_id): referer = request.META.get('HTTP_REFERER', None) next = reverse('sys_useradmin') if referer is None else referer - + return HttpResponseRedirect(next) @login_required @@ -753,6 +779,7 @@ def sys_org_admin(request): @login_required @sys_staff_required def sys_org_info(request, org_id): + org_id = int(org_id) org = ccnet_threaded_rpc.get_org_by_id(org_id) @@ -762,11 +789,33 @@ def sys_org_info(request, org_id): # quota total_quota = seafserv_threaded_rpc.get_org_quota(org_id) quota_usage = seafserv_threaded_rpc.get_org_quota_usage(org_id) - + + last_logins = UserLastLogin.objects.filter(username__in=[x.email for x in users]) + for user in users: + if user.id == request.user.id: + user.is_self = True + try: + user.self_usage =seafserv_threaded_rpc. \ + get_org_user_quota_usage(org_id, user.email) + user.share_usage = 0 #seafile_api.get_user_share_usage(user.email) + user.quota = seafserv_threaded_rpc. \ + get_org_user_quota(org_id, user.email) + except SearpcError as e: + logger.error(e) + user.self_usage = -1 + user.share_usage = -1 + user.quota = -1 + + # populate user last login time + user.last_login = None + for last_login in last_logins: + if last_login.username == user.email: + user.last_login = last_login.last_login + # groups groups = ccnet_threaded_rpc.get_org_groups(org_id, -1, -1) groups_count = len(groups) - + return render_to_response('sysadmin/sys_org_info.html', { 'org': org, 'users': users,