From 73b818a98667e7a53ae09390a332c547723a00fb Mon Sep 17 00:00:00 2001 From: zhengxie Date: Tue, 15 Sep 2015 17:32:09 +0800 Subject: [PATCH 1/3] [sysadmin] Show org expiration date and search org --- .../templates/sysadmin/org_admin_table.html | 28 +++++++++++ seahub/templates/sysadmin/sys_org_admin.html | 42 ++++++----------- seahub/templates/sysadmin/sys_org_search.html | 33 +++++++++++++ seahub/urls.py | 1 + seahub/views/sysadmin.py | 46 +++++++++++++++++++ 5 files changed, 121 insertions(+), 29 deletions(-) create mode 100644 seahub/templates/sysadmin/org_admin_table.html create mode 100644 seahub/templates/sysadmin/sys_org_search.html diff --git a/seahub/templates/sysadmin/org_admin_table.html b/seahub/templates/sysadmin/org_admin_table.html new file mode 100644 index 0000000000..720d1b5e64 --- /dev/null +++ b/seahub/templates/sysadmin/org_admin_table.html @@ -0,0 +1,28 @@ +{% load seahub_tags i18n %} + + + + + + + + + {% for org in orgs %} + + + + + + + + {% endfor %} +
{% trans "Name" %}{% trans "Creator" %}{% trans "Space Used" %}{% trans "Created At / Expiration" %}{% trans "Operations" %}
+ {{ org.org_name }} + {% if org.trial_info %} +

(Trial  X)

+ {% endif %} +
{{ org.creator }} + {{ org.quota_usage|filesizeformat }} {% if org.total_quota > 0 %} / {{ org.total_quota|filesizeformat }} {% endif %} + {{ org.ctime|tsstr_sec }}
+ {% if org.expiration %}{{ org.expiration|date:'Y-m-d H:i:s' }}{% else %}--{% endif %} +
{% trans "Delete" %}
diff --git a/seahub/templates/sysadmin/sys_org_admin.html b/seahub/templates/sysadmin/sys_org_admin.html index 85bc412250..62289b12f9 100644 --- a/seahub/templates/sysadmin/sys_org_admin.html +++ b/seahub/templates/sysadmin/sys_org_admin.html @@ -1,8 +1,13 @@ {% extends "sysadmin/base.html" %} {% load seahub_tags i18n %} - {% block cur_org %}tab-cur{% endblock %} +{% block left_panel %}{{block.super}} +
+ +
+{% endblock %} + {% block right_panel %}

{% trans "All Organizations" %}

@@ -29,35 +34,8 @@ {% if orgs %} - - - - - - - - - {% for org in orgs %} - - - - - - - - - {% endfor %} -
{% trans "Name" %}{% trans "Url Prefix" %}{% trans "Creator" %}{% trans "Space Used" %}{% trans "Created At" %}
- {{ org.org_name }} - {% if org.trial_info %} -

(Trial  X)

- {% endif %} -
{{ org.url_prefix }}{{ org.creator }} - {{ org.quota_usage|filesizeformat }} {% if org.total_quota > 0 %} / {{ org.total_quota|filesizeformat }} {% endif %} - {{ org.ctime|tsstr_sec }}
- +{% include "sysadmin/org_admin_table.html" %} {% include "snippets/admin_paginator.html" %} - {% else %}

{% trans "None." %}

{% endif %} @@ -70,6 +48,12 @@ $('#add-btn').click(function() { $('#simplemodal-container').css({'width':'auto'}); }); +addConfirmTo($('.remove-btn'), { + 'title':"{% trans "Delete org" %}", + 'con':"{% trans "Are you sure you want to delete %s ?" %}", + 'post': true // post request +}); + $('#add-org-form').submit(function() { var form = $(this), form_id = form.attr('id'), diff --git a/seahub/templates/sysadmin/sys_org_search.html b/seahub/templates/sysadmin/sys_org_search.html new file mode 100644 index 0000000000..58d3fb8c55 --- /dev/null +++ b/seahub/templates/sysadmin/sys_org_search.html @@ -0,0 +1,33 @@ +{% extends "sysadmin/base.html" %} +{% load seahub_tags i18n staticfiles %} +{% block cur_org %}tab-cur{% endblock %} + +{% block right_panel %} +

{% trans "Search Org"%}

+ +
+

{% trans "Tip: you can search by keyword in name or creator or both." %}

+
+
+ +
+ +

{% trans "Result"%}

+{% if orgs %} +{% include "sysadmin/org_admin_table.html" %} +{% else %} +

{% trans "No result" %}

+{% endif %} + +{% endblock %} + +{% block extra_script %} + +{% endblock %} diff --git a/seahub/urls.py b/seahub/urls.py index bd945463f3..ba3604660c 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -220,6 +220,7 @@ urlpatterns = patterns( url(r'^sys/groupadmin/$', sys_group_admin, name='sys_group_admin'), url(r'^sys/groupadmin/(?P\d+)/$', sys_admin_group_info, name='sys_admin_group_info'), url(r'^sys/orgadmin/$', sys_org_admin, name='sys_org_admin'), + url(r'^sys/orgadmin/search/$', sys_org_search, name='sys_org_search'), url(r'^sys/orgadmin/(?P\d+)/set_quota/$', sys_org_set_quota, name='sys_org_set_quota'), url(r'^sys/orgadmin/(?P\d+)/rename/$', sys_org_rename, name='sys_org_rename'), url(r'^sys/orgadmin/(?P\d+)/set_member_quota/$', sys_org_set_member_quota, name='sys_org_set_member_quota'), diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py index 522b3c3259..cc44a5e604 100644 --- a/seahub/views/sysadmin.py +++ b/seahub/views/sysadmin.py @@ -13,6 +13,7 @@ from django.contrib import messages from django.http import HttpResponse, Http404, HttpResponseRedirect, HttpResponseNotAllowed from django.shortcuts import render_to_response from django.template import RequestContext +from django.utils import timezone from django.utils.translation import ugettext as _ from seaserv import ccnet_threaded_rpc, seafserv_threaded_rpc, get_emailusers, \ @@ -1159,10 +1160,22 @@ def sys_org_admin(request): org.quota_usage = seafserv_threaded_rpc.get_org_quota_usage(org.org_id) org.total_quota = seafserv_threaded_rpc.get_org_quota(org.org_id) + from seahub_extra.organizations.settings import ORG_TRIAL_DAYS + if ORG_TRIAL_DAYS > 0: + from datetime import timedelta + org.expiration = datetime.datetime.fromtimestamp(org.ctime / 1e6) + timedelta(days=ORG_TRIAL_DAYS) + org.trial_info = None for trial_org in trial_orgs: if trial_org.user_or_org == str(org.org_id): org.trial_info = {'expire_date': trial_org.expire_date} + if trial_org.expire_date: + org.expiration = trial_org.expire_date + + if org.expiration: + org.is_expired = True if org.expiration < timezone.now() else False + else: + org.is_expired = False if len(orgs_plus_one) == per_page + 1: page_next = True @@ -1178,6 +1191,39 @@ def sys_org_admin(request): 'page_next': page_next, }, context_instance=RequestContext(request)) +@login_required +@sys_staff_required +def sys_org_search(request): + org_name = request.GET.get('name', '').lower() + creator = request.GET.get('creator', '').lower() + if not org_name and not creator: + return HttpResponseRedirect(reverse('sys_org_admin')) + + orgs = [] + orgs_all = ccnet_threaded_rpc.get_all_orgs(-1, -1) + + if org_name and creator: + for o in orgs_all: + if org_name in o.org_name.lower() and creator in o.creator.lower(): + orgs.append(o) + else: + if org_name: + for o in orgs_all: + if org_name in o.org_name.lower(): + orgs.append(o) + + if creator: + for o in orgs_all: + if creator in o.creator.lower(): + orgs.append(o) + + return render_to_response( + 'sysadmin/sys_org_search.html', { + 'orgs': orgs, + 'name': org_name, + 'creator': creator, + }, context_instance=RequestContext(request)) + @login_required @sys_staff_required def sys_org_rename(request, org_id): From 8c1a64a70263a1cfb384881308a1cdac03b1eacb Mon Sep 17 00:00:00 2001 From: zhengxie Date: Wed, 16 Sep 2015 18:40:14 +0800 Subject: [PATCH 2/3] [sysadmin] List paid users and orgs --- seahub/templates/sysadmin/sys_org_admin.html | 16 ++++- seahub/templates/sysadmin/sys_useradmin.html | 3 + .../sysadmin/sys_useradmin_paid.html | 39 +++++++++++ .../templates/sysadmin/useradmin_table.html | 6 +- seahub/views/sysadmin.py | 65 +++++++++++++++++-- 5 files changed, 118 insertions(+), 11 deletions(-) create mode 100644 seahub/templates/sysadmin/sys_useradmin_paid.html diff --git a/seahub/templates/sysadmin/sys_org_admin.html b/seahub/templates/sysadmin/sys_org_admin.html index 62289b12f9..a32072eccd 100644 --- a/seahub/templates/sysadmin/sys_org_admin.html +++ b/seahub/templates/sysadmin/sys_org_admin.html @@ -9,8 +9,13 @@ {% endblock %} {% block right_panel %} -
-

{% trans "All Organizations" %}

+
+
@@ -34,11 +39,16 @@ {% if orgs %} + {% include "sysadmin/org_admin_table.html" %} -{% include "snippets/admin_paginator.html" %} + + {% if not hide_paginator %} + {% include "snippets/admin_paginator.html" %} + {% endif %} {% else %}

{% trans "None." %}

{% endif %} + {% endblock %} {% block extra_script %} diff --git a/seahub/templates/sysadmin/sys_useradmin.html b/seahub/templates/sysadmin/sys_useradmin.html index f869c6fdaa..06cb985347 100644 --- a/seahub/templates/sysadmin/sys_useradmin.html +++ b/seahub/templates/sysadmin/sys_useradmin.html @@ -17,6 +17,9 @@
  • {% trans "LDAP(imported)" %}
  • {% endif %}
  • {% trans "Admins" %}
  • + {% if enable_user_plan %} +
  • {% trans "Paid" %}
  • + {% endif %}
    diff --git a/seahub/templates/sysadmin/sys_useradmin_paid.html b/seahub/templates/sysadmin/sys_useradmin_paid.html new file mode 100644 index 0000000000..1b8e4b95c8 --- /dev/null +++ b/seahub/templates/sysadmin/sys_useradmin_paid.html @@ -0,0 +1,39 @@ +{% extends "sysadmin/base.html" %} +{% load seahub_tags i18n %} +{% block cur_users %}tab-cur{% endblock %} + +{% block left_panel %}{{block.super}} +
    + +
    +{% endblock %} + +{% block right_panel %} +
    + +
    + +{% with is_admin_page=False%} +{% include "sysadmin/useradmin_table.html" %} +{% endwith %} + +
    +

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

    +
    +{% endblock %} + +{% block extra_script %} + +{% endblock %} diff --git a/seahub/templates/sysadmin/useradmin_table.html b/seahub/templates/sysadmin/useradmin_table.html index 626fa83b90..e7e8744ea5 100644 --- a/seahub/templates/sysadmin/useradmin_table.html +++ b/seahub/templates/sysadmin/useradmin_table.html @@ -79,12 +79,12 @@ {% if not user.is_self %} - {% trans "Delete" %} + {% trans "Delete" %} {% if user.source == "DB" %} - {% trans "ResetPwd" %} + {% trans "ResetPwd" %} {% endif %} {% if is_admin_page %} - {% trans "Revoke Admin" %} + {% trans "Revoke Admin" %} {% endif %} {% endif %} diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py index cc44a5e604..bccd5be0a4 100644 --- a/seahub/views/sysadmin.py +++ b/seahub/views/sysadmin.py @@ -362,6 +362,33 @@ def _populate_user_quota_usage(user): def sys_user_admin(request): """List all users from database. """ + try: + from seahub_extra.plan.models import UserPlan + enable_user_plan = True + except ImportError: + enable_user_plan = False + + if enable_user_plan and request.GET.get('filter', '') == 'paid': + # show paid users + users = [] + ups = UserPlan.objects.all() + for up in ups: + u = User.objects.get(up.username) + _populate_user_quota_usage(u) + users.append(u) + + last_logins = UserLastLogin.objects.filter(username__in=[x.username for x in users]) + for u in users: + for e in last_logins: + if e.username == u.username: + u.last_login = e.last_login + + return render_to_response('sysadmin/sys_useradmin_paid.html', { + 'users': users, + 'enable_user_plan': enable_user_plan, + }, context_instance=RequestContext(request)) + + ### List all users # Make sure page request is an int. If not, deliver first page. try: current_page = int(request.GET.get('page', '1')) @@ -426,6 +453,7 @@ def sys_user_admin(request): 'guest_user': GUEST_USER, 'is_pro': is_pro_version(), 'pro_server': pro_server, + 'enable_user_plan': enable_user_plan, }, context_instance=RequestContext(request)) @login_required @@ -1148,14 +1176,44 @@ def sys_org_admin(request): current_page = 1 per_page = 25 + try: + from seahub_extra.plan.models import OrgPlan + enable_org_plan = True + except ImportError: + enable_org_plan = False + + if enable_org_plan and request.GET.get('filter', '') == 'paid': + orgs = [] + ops = OrgPlan.objects.all() + for e in ops: + o = ccnet_threaded_rpc.get_org_by_id(e.org_id) + o.quota_usage = seafserv_threaded_rpc.get_org_quota_usage(o.org_id) + o.total_quota = seafserv_threaded_rpc.get_org_quota(o.org_id) + o.expiration = e.expire_date + o.is_expired = True if e.expire_date < timezone.now() else False + orgs.append(o) + + return render_to_response('sysadmin/sys_org_admin.html', { + 'orgs': orgs, + 'enable_org_plan': enable_org_plan, + 'hide_paginator': True, + 'paid_page': True, + }, context_instance=RequestContext(request)) + orgs_plus_one = ccnet_threaded_rpc.get_all_orgs(per_page * (current_page - 1), per_page + 1) + if len(orgs_plus_one) == per_page + 1: + page_next = True + else: + page_next = False + orgs = orgs_plus_one[:per_page] if ENABLE_TRIAL_ACCOUNT: trial_orgs = TrialAccount.objects.filter(user_or_org__in=[x.org_id for x in orgs]) else: trial_orgs = [] + for org in orgs: org.quota_usage = seafserv_threaded_rpc.get_org_quota_usage(org.org_id) org.total_quota = seafserv_threaded_rpc.get_org_quota(org.org_id) @@ -1177,11 +1235,6 @@ def sys_org_admin(request): else: org.is_expired = False - if len(orgs_plus_one) == per_page + 1: - page_next = True - else: - page_next = False - return render_to_response('sysadmin/sys_org_admin.html', { 'orgs': orgs, 'current_page': current_page, @@ -1189,6 +1242,8 @@ def sys_org_admin(request): 'next_page': current_page+1, 'per_page': per_page, 'page_next': page_next, + 'enable_org_plan': enable_org_plan, + 'all_page': True, }, context_instance=RequestContext(request)) @login_required From 8b1193368ba8ae12a426856b1fdf54d4a2f15469 Mon Sep 17 00:00:00 2001 From: zhengxie Date: Thu, 17 Sep 2015 16:14:09 +0800 Subject: [PATCH 3/3] [sysadmin] Enable delete an org --- .../templates/sysadmin/org_admin_table.html | 2 +- seahub/urls.py | 1 + seahub/views/sysadmin.py | 29 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/seahub/templates/sysadmin/org_admin_table.html b/seahub/templates/sysadmin/org_admin_table.html index 720d1b5e64..74aaa0ace9 100644 --- a/seahub/templates/sysadmin/org_admin_table.html +++ b/seahub/templates/sysadmin/org_admin_table.html @@ -22,7 +22,7 @@ {{ org.ctime|tsstr_sec }}
    {% if org.expiration %}{{ org.expiration|date:'Y-m-d H:i:s' }}{% else %}--{% endif %} - {% trans "Delete" %} + {% trans "Delete" %} {% endfor %} diff --git a/seahub/urls.py b/seahub/urls.py index ba3604660c..c1dafa1c2b 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -223,6 +223,7 @@ urlpatterns = patterns( url(r'^sys/orgadmin/search/$', sys_org_search, name='sys_org_search'), url(r'^sys/orgadmin/(?P\d+)/set_quota/$', sys_org_set_quota, name='sys_org_set_quota'), url(r'^sys/orgadmin/(?P\d+)/rename/$', sys_org_rename, name='sys_org_rename'), + url(r'^sys/orgadmin/(?P\d+)/remove/$', sys_org_remove, name='sys_org_remove'), url(r'^sys/orgadmin/(?P\d+)/set_member_quota/$', sys_org_set_member_quota, name='sys_org_set_member_quota'), url(r'^sys/orgadmin/(?P\d+)/user/$', sys_org_info_user, name='sys_org_info_user'), url(r'^sys/orgadmin/(?P\d+)/group/$', sys_org_info_group, name='sys_org_info_group'), diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py index bccd5be0a4..09a0803838 100644 --- a/seahub/views/sysadmin.py +++ b/seahub/views/sysadmin.py @@ -1300,6 +1300,35 @@ def sys_org_rename(request, org_id): return HttpResponseRedirect(next) +@login_required +@require_POST +@sys_staff_required +def sys_org_remove(request, org_id): + """Remove an org and all members/repos/groups. + + Arguments: + - `request`: + - `org_id`: + """ + org_id = int(org_id) + org = ccnet_threaded_rpc.get_org_by_id(org_id) + users = ccnet_threaded_rpc.get_org_emailusers(org.url_prefix, -1, -1) + for u in users: + ccnet_threaded_rpc.remove_org_user(org_id, u.email) + + groups = ccnet_threaded_rpc.get_org_groups(org.org_id, -1, -1) + for g in groups: + ccnet_threaded_rpc.remove_org_group(org_id, g.gid) + + # remove org repos + seafserv_threaded_rpc.remove_org_repo_by_org_id(org_id) + + # remove org + ccnet_threaded_rpc.remove_org(org_id) + + messages.success(request, _(u'Successfully deleted.')) + return HttpResponseRedirect(reverse('sys_org_admin')) + @login_required_ajax @sys_staff_required def sys_org_set_member_quota(request, org_id):