diff --git a/seahub/notifications/templates/notifications/notification_list.html b/seahub/notifications/templates/notifications/notification_list.html deleted file mode 100644 index 512cafd962..0000000000 --- a/seahub/notifications/templates/notifications/notification_list.html +++ /dev/null @@ -1,73 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load i18n %} - -{% block cur_notice %}tab-cur{% endblock %} - -{% block right_panel %} -
-

{% trans "All Notifications" %}

- -
-
{% csrf_token %} -

{% trans "Add new notification" %}

-
-

- -
- -{% if notes %} - - - - - - - - - {% for note in notes %} - - - - {% endfor %} - -
{% trans "Notification Detail" %}{% trans "Operations" %}
{{ note.message }} - {% if note.primary == 1 %} - {% trans "(current notification)" %} - {% endif %} - - {% if note.primary != 1 %} - {% trans "Set to current" %} - {% endif %} - {% trans "Delete" %} -
-{% else %} -

{% trans "Empty" %}

-{% endif %} -{% endblock %} - -{% block extra_script %} - -{% endblock %} - diff --git a/seahub/notifications/urls.py b/seahub/notifications/urls.py index 970faf226a..da2bd72984 100644 --- a/seahub/notifications/urls.py +++ b/seahub/notifications/urls.py @@ -3,12 +3,7 @@ from django.conf.urls import url from .views import * urlpatterns = [ -# url(r'^$', 'notification_list', name='notification_list'), - url(r'^add/$', notification_add, name='notification_add'), - url(r'^delete/(?P[\d]+)/$', notification_delete, name='notification_delete'), - url(r'^set-primary/(?P[\d]+)/$', set_primary, name='set_primary'), - -########## user notifications + ########## user notifications url(r'^list/$', user_notification_list, name='user_notification_list'), url(r'^more/$', user_notification_more, name='user_notification_more'), url(r'^remove/$', user_notification_remove, name='user_notification_remove'), diff --git a/seahub/notifications/views.py b/seahub/notifications/views.py index b79700a022..82baf0d25a 100644 --- a/seahub/notifications/views.py +++ b/seahub/notifications/views.py @@ -19,47 +19,6 @@ from seahub.avatar.util import get_default_avatar_url # Get an instance of a logger logger = logging.getLogger(__name__) -@login_required -def notification_list(request): - if not request.user.is_staff: - raise Http404 - notes = Notification.objects.all().order_by('-id') - - return render(request, 'notifications/notification_list.html', { - 'notes': notes, - }) - -@login_required -def notification_add(request): - if not request.user.is_staff or request.method != 'POST': - raise Http404 - - f = NotificationForm(request.POST) - f.save() - return HttpResponseRedirect(reverse('notification_list', args=[])) - -@login_required -def notification_delete(request, nid): - if not request.user.is_staff: - raise Http404 - Notification.objects.filter(id=nid).delete() - refresh_cache() - - return HttpResponseRedirect(reverse('notification_list', args=[])) - -@login_required -def set_primary(request, nid): - if not request.user.is_staff: - raise Http404 - - # TODO: use transaction? - Notification.objects.filter(primary=1).update(primary=0) - Notification.objects.filter(id=nid).update(primary=1) - - refresh_cache() - - return HttpResponseRedirect(reverse('notification_list', args=[])) - ########## user notifications @login_required def user_notification_list(request): diff --git a/seahub/templates/base.html b/seahub/templates/base.html index 9ee1ced103..1acbdb90bd 100644 --- a/seahub/templates/base.html +++ b/seahub/templates/base.html @@ -66,7 +66,7 @@ {% trans "Settings" %} {% block admin_link %} {% if request.user.is_staff %} - {% trans "System Admin" %} + {% trans "System Admin" %} {% endif %} {% if request.user.org and request.user.org.is_staff %} {% trans "Organization Admin" %} diff --git a/seahub/templates/snippets/web_settings_form.html b/seahub/templates/snippets/web_settings_form.html deleted file mode 100644 index b12670dd68..0000000000 --- a/seahub/templates/snippets/web_settings_form.html +++ /dev/null @@ -1,74 +0,0 @@ -{% load i18n %} - -{% if type == 'input' %} -
-
{{ setting_display_name }}
-
- -

-

{{ help_tip }}

-
-
- - -
-
-{% endif %} - -{% if type == 'textarea' %} -
-
{{ setting_display_name }}
-
- -

-

{{ help_tip }}

-
-
- - -
-
-{% endif %} - -{% if type == 'code-textarea' %} -
-
{{ setting_display_name }}
-
- -

- {% if help_tip %} -

{{ help_tip }}

- {% endif %} -
-
- - -
-
-{% endif %} - -{% if type == 'checkbox' %} -
{% csrf_token %} -
{{ setting_display_name }}
-
- -
-
-{% endif %} - -{% if type == 'file' %} -
{% csrf_token %} -
{{ setting_display_name }}
-
- -

{{ help_tip }}

-
- - -
-
-
-{% endif %} diff --git a/seahub/templates/sysadmin/base.html b/seahub/templates/sysadmin/base.html deleted file mode 100644 index aa877a92df..0000000000 --- a/seahub/templates/sysadmin/base.html +++ /dev/null @@ -1,153 +0,0 @@ -{% extends "base.html" %} -{% load i18n %} - -{% block top_search %}{% endblock %} {# no 'file search' for system admin pages #} -{% block main_class %}d-flex ovhd{% endblock %} - -{% block admin_link %} - {% trans "Exit System Admin" %} -{% endblock %} - -{% block main_content %} -
-
-
- - logo - -
-
- {% block left_panel %} -

{% trans "System Admin" %}

- - {% endblock %} -
-
- -
- {% block right_panel %}{% endblock %} -
-
-{% endblock %} diff --git a/seahub/templates/sysadmin/org_admin_table.html b/seahub/templates/sysadmin/org_admin_table.html deleted file mode 100644 index bcf3b9ca1f..0000000000 --- a/seahub/templates/sysadmin/org_admin_table.html +++ /dev/null @@ -1,47 +0,0 @@ -{% load seahub_tags i18n %} - - - - - - - - - - {% for org in orgs %} - - - - - - - - - {% endfor %} -
{% trans "Name" %}{% trans "Creator" %}{% trans "Role" %}{% trans "Space Used" %}{% trans "Created At / Expiration" %}{% trans "Operations" %}
- {{ org.org_name }} - {% if org.trial_info %} -

(Trial  X)

- {% endif %} -
{{ org.creator }} -
- - {% if org.is_default_role %} - {% trans "Default" %} - {% else %} - {{ org.role }} - {% endif %} - - -
- -
- {{ org.quota_usage|seahub_filesizeformat }} {% if org.total_quota > 0 %} / {{ org.total_quota|seahub_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/repo_transfer_form.html b/seahub/templates/sysadmin/repo_transfer_form.html deleted file mode 100644 index a82f142157..0000000000 --- a/seahub/templates/sysadmin/repo_transfer_form.html +++ /dev/null @@ -1,10 +0,0 @@ -{% load i18n %} -
{% csrf_token %} -

{% trans "Transfer Library"%}

-

{% trans "Transfer %(lib_name)s to:"%}

-
- -

- - -
diff --git a/seahub/templates/sysadmin/repoadmin_js.html b/seahub/templates/sysadmin/repoadmin_js.html deleted file mode 100644 index 00744e05c6..0000000000 --- a/seahub/templates/sysadmin/repoadmin_js.html +++ /dev/null @@ -1,91 +0,0 @@ -{% load i18n%} - -$('.repo-transfer-btn').on('click', function(){ - var btn_ct = $(this).parents('td'), - $tr = $(this).closest('tr'), - repo_id = btn_ct.data('id'), - repo_name = btn_ct.attr('data-name'), - form = $('#repo-transfer-form'); - - form.modal({appendTo:'#main'}); - $('#simplemodal-container').css({'width':'auto', 'height':'auto'}); - - var detail = $('.detail', form); - detail.html(detail.html().replace('%(lib_name)s', '' + HTMLescape(repo_name) + '')); - - $('[name="email"]', form).select2($.extend({ - width: '268px', - maximumSelectionSize: 1, - placeholder: "{% trans "Search user or enter email and press Enter" %}", - formatInputTooShort: "{% trans "Please enter 1 or more character" %}", - formatNoMatches: "{% trans "No matches" %}", - formatSearching: "{% trans "Searching..." %}", - formatAjaxError: "{% trans "Loading failed" %}", - formatSelectionTooBig: "{% trans "You cannot select any more choices" %}" - }, userInputOPtionsForSelect2('{% url 'search-user' %}'))); - - $('input[name="repo_id"]', form).val(repo_id); - form.data('tr', $tr); - return false; -}); - -$('#repo-transfer-form').on('submit', function() { - var form = $(this), - form_id = form.attr('id'), - repo_id = $('[name="repo_id"]', form).val(), - email = $.trim(form.children('[name="email"]').val()); - var $tr = form.data('tr'); - - if (!email) { - return false; - } - - $.ajax({ - url: '{{SITE_ROOT}}api/v2.1/admin/libraries/' + encodeURIComponent(repo_id) + '/', - data: {'owner': email}, - type: 'PUT', - cache: false, - beforeSend: prepareCSRFToken, - dataType: 'json', - success: function() { - $tr.remove(); - feedback("{% trans "Successfully transfered 1 item." %}", 'success'); - }, - error: ajaxErrorHandler, - complete: function() { - $.modal.close(); - } - }); - - return false; -}); - -$('#main-panel').removeClass('ovhd'); - -$('.repo-delete-btn').on('click', function() { - var $tr = $(this).closest('tr'); - var $td = $(this).closest('td'); - var repo_id = $td.data('id'); - var repo_name = $td.data('name'); - var popupTitle = "{% trans "Delete Library" %}"; - var popupContent = "{% trans "Are you sure you want to delete %s ?" %}".replace('%s', '' + HTMLescape(repo_name) + ''); - var yesCallback = function() { - $.ajax({ - url: '{{SITE_ROOT}}api/v2.1/admin/libraries/' + encodeURIComponent(repo_id) + '/', - type: 'DELETE', - cache: false, - beforeSend: prepareCSRFToken, - dataType: 'json', - success: function() { - $tr.remove(); - feedback("{% trans "Successfully deleted 1 item." %}", 'success'); - }, - error: ajaxErrorHandler, - complete: function() { - $.modal.close(); - } - }); - }; - showConfirm(popupTitle, popupContent, yesCallback); - return false; -}); diff --git a/seahub/templates/sysadmin/settings.html b/seahub/templates/sysadmin/settings.html deleted file mode 100644 index d37c97aa5c..0000000000 --- a/seahub/templates/sysadmin/settings.html +++ /dev/null @@ -1,341 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load seahub_tags i18n %} - -{% block cur_settings %}tab-cur{% endblock %} -{% block right_panel %} -

{% trans "Settings" %}

- -
- -

{% trans "Note: Settings via web interface are saved in database table (seahub-db/constance_config). They have a higher priority over the settings in config files." %}

- -

URL

- - {% with type="input" setting_display_name="SERVICE_URL" setting_name="SERVICE_URL" setting_val=config_dict.SERVICE_URL %} - {% trans "The URL of the server, like https://seafile.example.com or http://192.168.1.2:8000" as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="input" setting_display_name="FILE_SERVER_ROOT" setting_name="FILE_SERVER_ROOT" setting_val=config_dict.FILE_SERVER_ROOT %} - {% trans "The internal URL for downloading/uploading files. Users will not be able to download/upload files if this is not set correctly. If you config Seafile behind Nginx/Apache, it should be SERVICE_URL/seafhttp, like https://seafile.example.com/seafhttp ." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - -

{% trans "Branding" %}

- - {% with type="input" setting_display_name="SITE_TITLE" setting_name="SITE_TITLE" setting_val=config_dict.SITE_TITLE %} - {% trans "Site title shown in a browser tab" as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="input" setting_display_name="SITE_NAME" setting_name="SITE_NAME" setting_val=config_dict.SITE_NAME %} - {% trans "Site name used in email sending" as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="file" setting_display_name="Logo" setting_name="logo" file_path=logo_path file_width=256 file_height=64 help_tip="logo.png, 256px * 64px" %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="file" setting_display_name="Favicon" setting_name="favicon" file_path=favicon_path file_width=32 file_height=32 help_tip="favicon.ico, 32px * 32px" %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="file" setting_name="login_bg_image" file_path=login_bg_image_path file_width=240 file_height=160 help_tip="login-bg.jpg, 2400px * 1600px" %} - {% trans "Login Background Image" as setting_display_name %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="checkbox" setting_name="ENABLE_BRANDING_CSS" setting_val=config_dict.ENABLE_BRANDING_CSS %} - {% trans "ENABLE_BRANDING_CSS" as setting_display_name %} - {% trans "Use custom CSS" as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="code-textarea" setting_name="CUSTOM_CSS" setting_val=config_dict.CUSTOM_CSS %} - {% trans "Custom CSS" as setting_display_name %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - -

{% trans "User" %}

- - {% with type="checkbox" setting_name="ENABLE_SIGNUP" setting_val=config_dict.ENABLE_SIGNUP %} - {% trans "allow new registrations" as setting_display_name %} - {% trans "Allow new user registrations. Uncheck this to prevent anyone from creating a new account." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="checkbox" setting_name="ACTIVATE_AFTER_REGISTRATION" setting_val=config_dict.ACTIVATE_AFTER_REGISTRATION %} - {% trans "activate after registration" as setting_display_name %} - {% trans "Activate user immediately after registration. If unchecked, a user need to be activated by administrator or via activation email" as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="checkbox" setting_name="REGISTRATION_SEND_MAIL" setting_val=config_dict.REGISTRATION_SEND_MAIL %} - {% trans "send activation email" as setting_display_name %} - {% trans "Send activation Email after user registration." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="input" setting_name="LOGIN_REMEMBER_DAYS" setting_val=config_dict.LOGIN_REMEMBER_DAYS %} - {% trans "keep sign in" as setting_display_name %} - {% trans "Number of days that keep user sign in." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="input" setting_display_name="LOGIN_ATTEMPT_LIMIT" setting_name="LOGIN_ATTEMPT_LIMIT" setting_val=config_dict.LOGIN_ATTEMPT_LIMIT %} - {% trans "The maximum number of failed login attempts before showing CAPTCHA." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="checkbox" setting_display_name="FREEZE_USER_ON_LOGIN_FAILED" setting_name="FREEZE_USER_ON_LOGIN_FAILED" setting_val=config_dict.FREEZE_USER_ON_LOGIN_FAILED %} - {% trans "Freeze user account when failed login attempts exceed limit." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - -

{% trans "Groups" %}

- - {% with type="checkbox" setting_display_name="ENABLE_SHARE_TO_ALL_GROUPS" setting_name="ENABLE_SHARE_TO_ALL_GROUPS" setting_val=config_dict.ENABLE_SHARE_TO_ALL_GROUPS %} - {% trans "Enable users to share libraries to any groups in the system." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - -

{% trans "Password" %}

- - {% with type="checkbox" setting_name="USER_STRONG_PASSWORD_REQUIRED" setting_val=config_dict.USER_STRONG_PASSWORD_REQUIRED %} - {% trans "strong password" as setting_display_name %} - {% trans "Force user to use a strong password when sign up or change password." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="checkbox" setting_name="FORCE_PASSWORD_CHANGE" setting_val=config_dict.FORCE_PASSWORD_CHANGE %} - {% trans "force password change" as setting_display_name %} - {% trans "Force user to change password when account is newly added or reset by admin" as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="input" setting_name="USER_PASSWORD_MIN_LENGTH" setting_val=config_dict.USER_PASSWORD_MIN_LENGTH %} - {% trans "password minimum length" as setting_display_name %} - {% trans "The least number of characters an account password should include." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="input" setting_name="USER_PASSWORD_STRENGTH_LEVEL" setting_val=config_dict.USER_PASSWORD_STRENGTH_LEVEL %} - {% trans "password strength level" as setting_display_name %} - {% trans "The level(1-4) of an account password's strength. For example, '3' means password must have at least 3 of the following: num, upper letter, lower letter and other symbols" as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="checkbox" setting_name="ENABLE_TWO_FACTOR_AUTH" setting_val=config_dict.ENABLE_TWO_FACTOR_AUTH %} - {% trans "enable two factor authentication" as setting_display_name %} - {% trans "Enable two factor authentication" as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - -

{% trans "Library" %}

- - {% with type="checkbox" setting_name="ENABLE_REPO_HISTORY_SETTING" setting_val=config_dict.ENABLE_REPO_HISTORY_SETTING %} - {% trans "library history" as setting_display_name %} - {% trans "Allow user to change library history settings" as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="checkbox" setting_name="ENABLE_ENCRYPTED_LIBRARY" setting_val=config_dict.ENABLE_ENCRYPTED_LIBRARY %} - {% trans "encrypted library" as setting_display_name %} - {% trans "Allow user to create encrypted libraries" as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="input" setting_name="REPO_PASSWORD_MIN_LENGTH" setting_val=config_dict.REPO_PASSWORD_MIN_LENGTH %} - {% trans "library password minimum length" as setting_display_name %} - {% trans "The least number of characters an encrypted library password should include." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="input" setting_name="SHARE_LINK_PASSWORD_MIN_LENGTH" setting_val=config_dict.SHARE_LINK_PASSWORD_MIN_LENGTH %} - {% trans "download/upload link password minimum length" as setting_display_name %} - {% trans "The least number of characters a download/upload link password should include." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="checkbox" setting_display_name="ENABLE_USER_CREATE_ORG_REPO" setting_name="ENABLE_USER_CREATE_ORG_REPO" setting_val=config_dict.ENABLE_USER_CREATE_ORG_REPO %} - {% trans "Allow user to add organization libraries. Otherwise, only system admin can add organization libraries." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - - {% with type="checkbox" setting_display_name="ENABLE_USER_CLEAN_TRASH" setting_name="ENABLE_USER_CLEAN_TRASH" setting_val=config_dict.ENABLE_USER_CLEAN_TRASH %} - {% trans "Allow user to clean library trash" as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - -

{% trans "Online Preview" %}

- - {% with type="textarea" setting_name="TEXT_PREVIEW_EXT" setting_val=config_dict.TEXT_PREVIEW_EXT %} - {% trans "text file extensions" as setting_display_name %} - {% trans "Extensions of text files that can be online previewed, each suffix is separated by a comma." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - -

{% trans "Sync" %}

- - {% with type="checkbox" setting_display_name="DISABLE_SYNC_WITH_ANY_FOLDER" setting_name="DISABLE_SYNC_WITH_ANY_FOLDER" setting_val=config_dict.DISABLE_SYNC_WITH_ANY_FOLDER %} - {% trans "If turn on, the desktop clients will not be able to sync a folder outside the default Seafile folder." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - -

{% trans "Terms" %}

- - {% with type="checkbox" setting_display_name="ENABLE_TERMS_AND_CONDITIONS" setting_name="ENABLE_TERMS_AND_CONDITIONS" setting_val=config_dict.ENABLE_TERMS_AND_CONDITIONS %} - {% trans "Enable system admin to add Terms and Conditions, and all users will have to accept the terms." as help_tip %} - {% include "snippets/web_settings_form.html" %} - {% endwith %} - -
-{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/snippets/org_admin_js.html b/seahub/templates/sysadmin/snippets/org_admin_js.html deleted file mode 100644 index c414c1982f..0000000000 --- a/seahub/templates/sysadmin/snippets/org_admin_js.html +++ /dev/null @@ -1,49 +0,0 @@ -{% load i18n %} - -addConfirmTo($('.remove-btn'), { - 'title': "{% trans "Delete organization" %}", - 'con': "{% trans "Are you sure you want to delete %s ?" %}", - 'post': true // post request -}); - -$('.org-role-edit-icon').on('click', function() { - var $td = $(this).closest('td'); - $('.org-role', $td).hide(); - $('.org-role-select', $td).show(); -}); -$('.org-role-select').on('change', function() { - var $select = $(this), - $td = $select.closest('td'), - $role = $('.org-role', $td); - var org_id = $(this).closest('tr').attr('data-orgid'); - - $.ajax({ - url: '{{SITE_ROOT}}api/v2.1/admin/organizations/' + org_id + '/', - type: 'PUT', - dataType: 'json', - data: {'role': $select.val()}, - cache: false, - beforeSend: prepareCSRFToken, - success: function(data) { - $select.hide(); - $('.org-role-cur-value', $td).html($('option[value="' + data.role + '"]', $select).text()); - $role.show(); - $.modal.close(); - feedback("{% trans "Edit succeeded" %}", 'success'); - }, - error: function(xhr) { - $select.hide(); - $role.show(); - $.modal.close(); - feedback(prepareAjaxErrorMsg(xhr), 'error'); - } - }); -}); -$(document).on('click', function(e) { - var target = e.target || event.srcElement; - // target can't be edit-icon - if (!$('.org-role-edit-icon, .org-role-select').is(target)) { - $('.org-role').show(); - $('.org-role-select').hide(); - } -}); diff --git a/seahub/templates/sysadmin/snippets/sys_org_info_nav.html b/seahub/templates/sysadmin/snippets/sys_org_info_nav.html deleted file mode 100644 index 7510d1afc1..0000000000 --- a/seahub/templates/sysadmin/snippets/sys_org_info_nav.html +++ /dev/null @@ -1,8 +0,0 @@ -{% load i18n %} - diff --git a/seahub/templates/sysadmin/snippets/sys_statistic_nav.html b/seahub/templates/sysadmin/snippets/sys_statistic_nav.html deleted file mode 100644 index 3503001603..0000000000 --- a/seahub/templates/sysadmin/snippets/sys_statistic_nav.html +++ /dev/null @@ -1,10 +0,0 @@ -{% load i18n %} - diff --git a/seahub/templates/sysadmin/sys_inst_admin.html b/seahub/templates/sysadmin/sys_inst_admin.html deleted file mode 100644 index 72b705fcc4..0000000000 --- a/seahub/templates/sysadmin/sys_inst_admin.html +++ /dev/null @@ -1,71 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load i18n seahub_tags %} - -{% block cur_inst %}tab-cur{% endblock %} - -{% block right_panel %} -
-
    -

    {% trans "All Institutions" %}

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

{% trans "Add institution" %}

-
-
-

- -
- -{% if insts %} - - - - - - - {% for inst in insts %} - - - - - - {% endfor %} -
{% trans "Name" %}{% trans "Create At" %}{% trans "Operations" %}
{{ inst.name }}{{ inst.create_time|translate_seahub_time }} - {% trans "Remove" %} -
- -{% include "snippets/admin_paginator.html" %} -{% else %} -

{% trans "Empty" %}

-{% endif %} -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_inst_info_admins.html b/seahub/templates/sysadmin/sys_inst_info_admins.html deleted file mode 100644 index 884ff28c0e..0000000000 --- a/seahub/templates/sysadmin/sys_inst_info_admins.html +++ /dev/null @@ -1,62 +0,0 @@ -{% extends "sysadmin/sys_inst_info_base.html" %} -{% load i18n seahub_tags %} - -{% block right_panel %} - - -{% if admins %} - - - - - - - - - - {% for user in admins %} - - - - - - - - {% 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 %} -
-
-

{{ user.space_usage|seahub_filesizeformat }} {% if user.space_quota > 0 %} / {{ user.space_quota|seahub_filesizeformat }} {% endif %}

-
- {{ user.ctime|tsstr_sec }} / {% if user.last_login %}{{user.last_login|translate_seahub_time}} {% else %} -- {% endif %} - - {% trans "Revoke Admin" %} -
-{% else %} -

{% trans "Empty" %}

-{% endif %} - -{% endblock %} - -{% block extra_script %}{{ block.super }} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_inst_info_base.html b/seahub/templates/sysadmin/sys_inst_info_base.html deleted file mode 100644 index 2046f52447..0000000000 --- a/seahub/templates/sysadmin/sys_inst_info_base.html +++ /dev/null @@ -1,80 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load i18n seahub_tags %} - -{% block nav_orgadmin_class %}class="cur"{% endblock %} - -{% block extra_style %} - -{% endblock %} - -{% block left_panel %} - -
-

{{ inst.name }}

-
-
{% trans "Number of members" %}
-
{{ users_count }}
- -
{% trans "Space Used" %}
-
{{ space_usage|seahub_filesizeformat }} {% if space_quota > 0 %} / {{ space_quota|seahub_filesizeformat }} {% endif %} {% trans "Set Quota" %}
- -
- -
{% csrf_token %} -

{% trans "Set storage limit" %}

- MB -

{% trans "Tip: 0 means default limit" %}

-

- -
- -
- -
- -
-{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_inst_info_user.html b/seahub/templates/sysadmin/sys_inst_info_user.html deleted file mode 100644 index b4adb130ef..0000000000 --- a/seahub/templates/sysadmin/sys_inst_info_user.html +++ /dev/null @@ -1,182 +0,0 @@ -{% extends "sysadmin/sys_inst_info_base.html" %} -{% load i18n seahub_tags %} -{% load staticfiles %} - -{% block extra_style %} - - -{% endblock %} - -{% block right_panel %} -
- -
- -
-
- -
-

{% trans "Add Members" %}

-
-
-

- -
-{% if users %} - - - - - - - - - - {% 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 %} -
-
- {{ user.space_usage|seahub_filesizeformat }} {% if user.space_quota > 0 %} / {{ user.space_quota|seahub_filesizeformat }} {% endif %} - - {{ user.ctime|tsstr_sec }} / {% if user.last_login %}{{user.last_login|translate_seahub_time}} {% else %} -- {% endif %} - - {% if user.inst_admin %}{% trans "Revoke Admin" %}{% else %}{% trans "Set Admin" %}{% endif %} -
-{% include "snippets/admin_paginator.html" %} -{% else %} -

{% trans "Empty" %}

-{% endif %} - -
-

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

-
- -{% endblock %} - -{% block extra_script %}{{ block.super }} - - - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_inst_search_user.html b/seahub/templates/sysadmin/sys_inst_search_user.html deleted file mode 100644 index 119f7be443..0000000000 --- a/seahub/templates/sysadmin/sys_inst_search_user.html +++ /dev/null @@ -1,62 +0,0 @@ -{% extends "sysadmin/sys_inst_info_base.html" %} -{% load i18n seahub_tags %} - -{% block right_panel %} -

{% trans "Search User"%}

- -
-
-
- -
-

{% trans "Result"%}

- -{% if users %} - - - - - - - - - - {% 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 %} -
-
-

{{ user.space_usage|seahub_filesizeformat }} {% if user.space_quota > 0 %} / {{ user.space_quota|seahub_filesizeformat }} {% endif %}

-
- {{ user.ctime|tsstr_sec }} / {% if user.last_login %}{{user.last_login|translate_seahub_time}} {% else %} -- {% endif %} - - {% if user.inst_admin %}{% trans "Revoke Admin" %}{% else %}{% trans "Set Admin" %}{% endif %} -
-{% else %} -

{% trans "No result" %}

-{% endif %} - -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_invitations_admin.html b/seahub/templates/sysadmin/sys_invitations_admin.html deleted file mode 100644 index 5a78eb4330..0000000000 --- a/seahub/templates/sysadmin/sys_invitations_admin.html +++ /dev/null @@ -1,99 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load i18n seahub_tags %} - -{% block cur_invitations %}tab-cur{% endblock %} - -{% block right_panel %} - -
-

{% trans "All Invitations" %}

- -
- -{% if invitations %} - - - - - - - - - - - {% for invitation in invitations %} - - - - - - - {% if invitation.is_expired %} - - {% else %} - - {% endif %} - - - {% endfor %} -
{% trans "Inviter" %}{% trans "Accepter" %}{% trans "Type" %}{% trans "Invited at" %}{% trans "Accepted at" %}{% trans "Expired at" %}
{{ invitation.inviter }} - {% if invitation.accept_time %} - {{ invitation.accepter }} - {% else %} - {{ invitation.accepter }} - {% endif %} - {{ invitation.invite_type }}{{ invitation.invite_time|translate_seahub_time }} - {% if invitation.accept_time %} - {{ invitation.accept_time|translate_seahub_time }} - {% else %} - -- - {% endif %} - {{ invitation.expire_time }}{{ invitation.expire_time }} - -
- -{% include "snippets/admin_paginator.html" %} -{% else %} -
-

{% trans "There is no invitation yet." %}

-
-{% endif %} -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_link_search.html b/seahub/templates/sysadmin/sys_link_search.html deleted file mode 100644 index 1a3b34aeb6..0000000000 --- a/seahub/templates/sysadmin/sys_link_search.html +++ /dev/null @@ -1,74 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load seahub_tags i18n %} - -{% block cur_links %}tab-cur{% endblock %} - -{% block right_panel %} -

{% trans "Search Link"%}

- - - -

{% trans "Result" %}

- -{% if publinks %} - - - - - - - - - - {% for publink in publinks %} - - - - - - - - - {% endfor %} -
{% trans "Name" %}{% trans "Token" %}{% trans "Owner" %}{% trans "Create At" %}{% trans "Count" %}
{{ publink.name }}{{ publink.token }}{{ publink.username }}{{ publink.ctime|translate_seahub_time }} {{ publink.view_cnt }} - {% trans "Remove" %} -
-{% else %} -

{% trans "No result" %}

-{% endif %} - -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_org_admin.html b/seahub/templates/sysadmin/sys_org_admin.html deleted file mode 100644 index e0fd859e55..0000000000 --- a/seahub/templates/sysadmin/sys_org_admin.html +++ /dev/null @@ -1,121 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load seahub_tags i18n %} -{% block cur_org %}tab-cur{% endblock %} - -{% block left_panel %}{{block.super}} -
- -
-{% endblock %} - -{% block right_panel %} -
- - -
- -
{% csrf_token %} -

{% trans "Add organization" %}

-
-
-
-
-
-
-
-
- -

- -
- -{% if orgs %} - -{% include "sysadmin/org_admin_table.html" %} - - {% if not hide_paginator %} - {% include "snippets/admin_paginator.html" %} - {% endif %} -{% else %} -

{% trans "None." %}

-{% endif %} - -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_org_info_base.html b/seahub/templates/sysadmin/sys_org_info_base.html deleted file mode 100644 index 464f227adb..0000000000 --- a/seahub/templates/sysadmin/sys_org_info_base.html +++ /dev/null @@ -1,40 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load i18n seahub_tags %} - -{% block nav_orgadmin_class %}class="cur"{% endblock %} - -{% block extra_style %} - -{% endblock %} - -{% block left_panel %} - -
-

{{ org.org_name }}

-
-
{% trans "Number of members" %}
-
{{ users_count }}
-
{% trans "Number of groups" %}
-
{{ groups_count }}
-
- -

{% trans "Space Used" %}

-

{{ quota_usage|seahub_filesizeformat }} {% if total_quota > 0 %}/ {{ total_quota|seahub_filesizeformat }} {% endif %}

- {% trans "Set Quota" %} -
-
{% csrf_token %} -

{% trans "Set org storage limit" %}

- - MB -

- {% trans "An integer that is greater than or equal to 0." %}
- {% trans "Tip: 0 means default limit" %} -

-

- -
-{% endblock %} diff --git a/seahub/templates/sysadmin/sys_org_info_group.html b/seahub/templates/sysadmin/sys_org_info_group.html deleted file mode 100644 index 5806bdb996..0000000000 --- a/seahub/templates/sysadmin/sys_org_info_group.html +++ /dev/null @@ -1,45 +0,0 @@ -{% extends "sysadmin/sys_org_info_base.html" %} -{% load i18n seahub_tags %} - - -{% block right_panel %} -
- {% with cur_tab='group' %} - {% include 'sysadmin/snippets/sys_org_info_nav.html' %} - {% endwith %} -
- -{% if groups %} - - - - - - - - {% for group in groups %} - - - - - - - {% endfor %} -
{% trans "Name" %}{% trans "Creator" %}{% trans "Create At" %}{% trans "Operations" %}
{{ group.group_name }}{{ group.creator_name }}{{ group.timestamp|tsstr_sec }}
-{% else %} -
-

{% trans "This organization doesn't have any groups" %}

-
-{% endif %} -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_org_info_library.html b/seahub/templates/sysadmin/sys_org_info_library.html deleted file mode 100644 index 14383e5cae..0000000000 --- a/seahub/templates/sysadmin/sys_org_info_library.html +++ /dev/null @@ -1,61 +0,0 @@ -{% extends "sysadmin/sys_org_info_base.html" %} -{% load i18n seahub_tags %} - -{% block right_panel %} -
- {% with cur_tab='library' %} - {% include 'sysadmin/snippets/sys_org_info_nav.html' %} - {% endwith %} -
- -{% if org_repos %} - - - - - - - - - {% for repo in org_repos %} - - {% if repo.encrypted %} - - {% else %} - - {% endif %} - - - - - - {% endfor %} -
{% trans "Name" %}ID{% trans "Owner" %}{% trans "Operations" %}
{% trans {% trans {{ repo.name }}{{ repo.id }} - {% if repo.owner %} - {{ repo.owner}} - {% else %} - -- - {% endif %} - - -
-{% else %} -
-

{% trans "This organization doesn't have any libraries" %}

-
-{% endif %} - -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_org_info_setting.html b/seahub/templates/sysadmin/sys_org_info_setting.html deleted file mode 100644 index d596b68c1c..0000000000 --- a/seahub/templates/sysadmin/sys_org_info_setting.html +++ /dev/null @@ -1,76 +0,0 @@ -{% extends "sysadmin/sys_org_info_base.html" %} -{% load i18n seahub_tags %} - - -{% block right_panel %} -
- {% with cur_tab='setting' %} - {% include 'sysadmin/snippets/sys_org_info_nav.html' %} - {% endwith %} -
- -
-

{% trans "Rename Organization" %}

-
{% csrf_token %} -
-
- -
- - {% if org_member_quota %} -

{% trans "Limit Organization User Number" %}

-
{% csrf_token %} -
-
-

- -
- {% endif %} -
- -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_org_info_traffic.html b/seahub/templates/sysadmin/sys_org_info_traffic.html deleted file mode 100644 index 4b16c7f525..0000000000 --- a/seahub/templates/sysadmin/sys_org_info_traffic.html +++ /dev/null @@ -1,392 +0,0 @@ -{% extends "sysadmin/sys_org_info_base.html" %} -{% load seahub_tags i18n staticfiles %} - -{% block extra_style %} - -{% endblock %} - -{% block right_panel %} -
- {% with cur_tab='traffic' %} - {% include 'sysadmin/snippets/sys_org_info_nav.html' %} - {% endwith %} -
- -
-
- - - -
- -
- - - - - - -
-
- -
- -
{# `
` is needed for ``, as the plugin requires. #} - -
-
- -
-
- -
-
- -
-

-
-{% endblock %} - -{% block extra_script %} - - - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_org_info_user.html b/seahub/templates/sysadmin/sys_org_info_user.html deleted file mode 100644 index 7f8f4c1dd6..0000000000 --- a/seahub/templates/sysadmin/sys_org_info_user.html +++ /dev/null @@ -1,253 +0,0 @@ -{% extends "sysadmin/sys_org_info_base.html" %} -{% load i18n seahub_tags %} - -{% block right_panel %} -
- {% with cur_tab='user' %} - {% include 'sysadmin/snippets/sys_org_info_nav.html' %} - {% endwith %} -
- -
-
- - - - - - - - - - - {% 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 %} - -
- -
- {{ user.self_usage|seahub_filesizeformat }} {% if user.quota > 0 %} / {{ user.quota|seahub_filesizeformat }} {% 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 %} -
- -
-

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

-
- -
{% csrf_token %} -

{% trans "Add user" %}

-
-
- -
-
- - -
- - - -
-
-
-

- -
-{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_org_search.html b/seahub/templates/sysadmin/sys_org_search.html deleted file mode 100644 index f228c6267d..0000000000 --- a/seahub/templates/sysadmin/sys_org_search.html +++ /dev/null @@ -1,30 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load seahub_tags i18n staticfiles %} -{% block cur_org %}tab-cur{% endblock %} - -{% block right_panel %} -

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/templates/sysadmin/sys_org_set_quota_js.html b/seahub/templates/sysadmin/sys_org_set_quota_js.html deleted file mode 100644 index 7e43a24fd4..0000000000 --- a/seahub/templates/sysadmin/sys_org_set_quota_js.html +++ /dev/null @@ -1,38 +0,0 @@ -{% load i18n%} -$('#set-quota').on('click', function() { - $("#set-quota-form").modal({appendTo: "#main"}); - return false; -}); - -$('#set-quota-form').on('submit', function() { - var form = $('#set-quota-form'), - form_id = form.attr('id'); - - var quota = $('input[name="quota"]', form).val(); - if (!$.trim(quota)) { - apply_form_error(form_id, "{% trans "Quota can not be empty" %}"); - return false; - } - - var sb_btn = $(this); - disable(sb_btn); - $.ajax({ - url: '{% url 'sys_org_set_quota' org.org_id %}', - type: 'POST', - dataType: 'json', - cache: false, - beforeSend: prepareCSRFToken, - data: { - 'quota': quota - }, - success: function(data) { - location.reload(true); - }, - error: function(xhr, textStatus, errorThrown) { - var error_msg = prepareAjaxErrorMsg(xhr); - apply_form_error(form_id, error_msg); - enable(sb_btn); - } - }); - return false; -}); diff --git a/seahub/templates/sysadmin/sys_publink_admin.html b/seahub/templates/sysadmin/sys_publink_admin.html deleted file mode 100644 index 28924b7e27..0000000000 --- a/seahub/templates/sysadmin/sys_publink_admin.html +++ /dev/null @@ -1,118 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load i18n seahub_tags %} - -{% block cur_links %}tab-cur{% endblock %} - -{% block left_panel %}{{block.super}} -
- -
-{% endblock %} - -{% block right_panel %} - - -{% if publinks %} - - - - - - - - - - {% for publink in publinks %} - - - - - - - - - {% endfor %} -
{% trans "Name" %}{% trans "Token" %}{% trans "Owner" %}{% trans "Create At" %} {% if sort_by == 'time_down' %}{% elif sort_by == 'time_up' %}{% endif %}{% trans "Count" %} {% if sort_by == 'count_down' %}{% elif sort_by == 'count_up' %}{% endif %}
{{ publink.name }}{{ publink.token }}{{ publink.username|email2nickname }}{{ publink.ctime|translate_seahub_time }} {{ publink.view_cnt }} - {% trans "Remove" %} -
- -
- {% if current_page != 1 %} - {% trans "Previous" %} - {% endif %} - {% if page_next %} - {% trans "Next" %} - {% endif %} - {% if current_page != 1 or page_next %} - | - {% endif %} - {% trans "Per page: " %} - {% if per_page == 25 %} - 25 - {% else %} - 25 - {% endif %} - {% if per_page == 50 %} - 50 - {% else %} - 50 - {% endif %} - {% if per_page == 100 %} - 100 - {% else %} - 100 - {% endif %} -
-{% else %} -

{% trans "Empty" %}

-{% endif %} -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_statistic_file.html b/seahub/templates/sysadmin/sys_statistic_file.html deleted file mode 100644 index 4b3352d85c..0000000000 --- a/seahub/templates/sysadmin/sys_statistic_file.html +++ /dev/null @@ -1,307 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load seahub_tags i18n staticfiles %} - -{% block extra_style %} - -{% endblock %} - -{% block cur_statistic %}tab-cur{% endblock %} - -{% block right_panel %} - -{% with cur_tab='file' %} -{% include 'sysadmin/snippets/sys_statistic_nav.html' %} -{% endwith %} - -
-
- - - -
- -
- - - - - - -
-
- -
- - -

-
-{% endblock %} - -{% block extra_script %} - - - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_statistic_reports.html b/seahub/templates/sysadmin/sys_statistic_reports.html deleted file mode 100644 index 5d3fe0d3ac..0000000000 --- a/seahub/templates/sysadmin/sys_statistic_reports.html +++ /dev/null @@ -1,64 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load seahub_tags i18n staticfiles %} - -{% block cur_statistic %}tab-cur{% endblock %} - -{% block right_panel %} - -{% with cur_tab='report' %} -{% include 'sysadmin/snippets/sys_statistic_nav.html' %} -{% endwith %} - -
-

{% trans "Monthly User Traffic" %}

-
- - - -

-
-
- -
-

{% trans "User Storage" %}

-
- -
-
- -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_statistic_storage.html b/seahub/templates/sysadmin/sys_statistic_storage.html deleted file mode 100644 index e0613163d1..0000000000 --- a/seahub/templates/sysadmin/sys_statistic_storage.html +++ /dev/null @@ -1,296 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load seahub_tags i18n staticfiles %} - -{% block extra_style %} - -{% endblock %} - -{% block cur_statistic %}tab-cur{% endblock %} - -{% block right_panel %} - -{% with cur_tab='storage' %} -{% include 'sysadmin/snippets/sys_statistic_nav.html' %} -{% endwith %} - -
-
- - - -
- -
- - - - - - -
-
- -
- - -

-
-{% endblock %} - -{% block extra_script %} - - - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_statistic_traffic.html b/seahub/templates/sysadmin/sys_statistic_traffic.html deleted file mode 100644 index 201ebdf518..0000000000 --- a/seahub/templates/sysadmin/sys_statistic_traffic.html +++ /dev/null @@ -1,404 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load seahub_tags i18n staticfiles %} - -{% block extra_style %} - -{% endblock %} - -{% block cur_statistic %}tab-cur{% endblock %} - -{% block right_panel %} - -{% with cur_tab='traffic' %} -{% include 'sysadmin/snippets/sys_statistic_nav.html' %} -{% endwith %} - - - -
-
- - - -
- -
- - - - - - -
-
- -
- -
{# `
` is needed for ``, as the plugin requires. #} - -
-
- -
-
- -
-
- -
-

-
-{% endblock %} - -{% block extra_script %} - - - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_statistic_user.html b/seahub/templates/sysadmin/sys_statistic_user.html deleted file mode 100644 index 0cb8ef5db8..0000000000 --- a/seahub/templates/sysadmin/sys_statistic_user.html +++ /dev/null @@ -1,283 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load seahub_tags i18n staticfiles %} - -{% block extra_style %} - -{% endblock %} - -{% block cur_statistic %}tab-cur{% endblock %} - -{% block right_panel %} -{% with cur_tab='user' %} -{% include 'sysadmin/snippets/sys_statistic_nav.html' %} -{% endwith %} - -
-
- - - -
- -
- - - - - - -
-
- -
- - -

-
-{% endblock %} - -{% block extra_script %} - - - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_terms_admin.html b/seahub/templates/sysadmin/sys_terms_admin.html deleted file mode 100644 index 50cadf5ad2..0000000000 --- a/seahub/templates/sysadmin/sys_terms_admin.html +++ /dev/null @@ -1,166 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load i18n seahub_tags %} - -{% block cur_tc %}tab-cur{% endblock %} - -{% block right_panel %} -
-

{% trans "Terms and Conditions" %}

- -
- -{% if object_list %} - - - - - - - - - - - - - {% for tc in object_list %} - - - - - - - - - {% endfor %} - -
{% trans "Name" %}{% trans "Version" %}{% trans "Text" %}{% trans "Created" %}{% trans "Activated" %}
{{ tc.name }}{{ tc.version_number }}{{ tc.text|truncatechars:50 }}{{ tc.date_created|translate_seahub_time }} - {% if tc.date_active %} - {{ tc.date_active|translate_seahub_time }} - {% else %} - -- - {% endif %} - - - -
- -{% else %} -

{% trans "Empty" %}

-{% endif %} - -
{% csrf_token %} -

{% trans "Add Terms and Conditions" %}

- - -
-
- -
-
- -
-
- -
- - {% trans "On" %}
- - {% trans "Off" %}
- -

- -
- -
- -{% endblock %} - -{% block extra_script %} - - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_trafficadmin.html b/seahub/templates/sysadmin/sys_trafficadmin.html deleted file mode 100644 index 90713f06b2..0000000000 --- a/seahub/templates/sysadmin/sys_trafficadmin.html +++ /dev/null @@ -1,165 +0,0 @@ -{% extends "sysadmin/base.html" %} - -{% load seahub_tags i18n %} - -{% block cur_statistic %}tab-cur{% endblock %} - -{% block right_panel %} -{% with cur_tab='traffic' %} -{% include 'sysadmin/snippets/sys_statistic_nav.html' %} -{% endwith %} - - - -
- - - -
- - - - - - - - - - - - - - - - {% for info in traffic_info_list %} - - - - - - - - - - {% endfor %} - -
- {% if type == 'user' %} - {% trans "User" %} - {% else %} - {% trans "Organization" %} - {% endif %} - - - {% trans "Sync Upload" %} - - - - - {% trans "Sync Download" %} - - - - - {% trans "Web Upload" %} - - - - - {% trans "Web Download" %} - - - - - {% trans "Share link upload" %} - - - - - {% trans "Share link download" %} - - -
- {% if info.org_id > 0 %} - {{ info.org_name }} - {% elif info.user %} - {{ info.user|email2nickname }} - {% else %} - -- - {% endif %} - {{ info.sync_file_upload|filesizeformat }}{{ info.sync_file_download|filesizeformat }}{{ info.web_file_upload|filesizeformat }}{{ info.web_file_download|filesizeformat }}{{ info.link_file_upload|filesizeformat }}{{ info.link_file_download|filesizeformat }}
- -
- {% if current_page != 1 %} - {% trans "Previous" %} - {% endif %} - {% if page_next %} - {% trans "Next" %} - {% endif %} - {% if current_page != 1 or page_next %} - | - {% endif %} - {% trans "Per page: " %} - {% if per_page == 25 %} - 25 - {% else %} - 25 - {% endif %} - {% if per_page == 50 %} - 50 - {% else %} - 50 - {% endif %} - {% if per_page == 100 %} - 100 - {% else %} - 100 - {% endif %} -
- -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_upload_link_admin.html b/seahub/templates/sysadmin/sys_upload_link_admin.html deleted file mode 100644 index 7e312b2367..0000000000 --- a/seahub/templates/sysadmin/sys_upload_link_admin.html +++ /dev/null @@ -1,112 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load i18n seahub_tags %} - -{% block cur_links %}tab-cur{% endblock %} - -{% block right_panel %} - - -{% if uploadlinks %} - - - - - - - - - - {% for uploadlink in uploadlinks %} - - - - - - - - - {% endfor %} -
{% trans "Name" %}{% trans "Token" %}{% trans "Owner" %}{% trans "Create At" %} {% if sort_by == 'time' %}{% elif sort_by == '-time' %}{% endif %}{% trans "Visits" %} {% if sort_by == 'count' %}{% elif sort_by == '-count' %}{% endif %}
{{ uploadlink.path }}{{ uploadlink.token }}{{ uploadlink.username|email2nickname }}{{ uploadlink.ctime|translate_seahub_time }} {{ uploadlink.view_cnt }} - {% trans "Remove" %} -
- -
- {% if current_page != 1 %} - {% trans "Previous" %} - {% endif %} - {% if page_next %} - {% trans "Next" %} - {% endif %} - {% if current_page != 1 or page_next %} - | - {% endif %} - {% trans "Per page: " %} - {% if per_page == 25 %} - 25 - {% else %} - 25 - {% endif %} - {% if per_page == 50 %} - 50 - {% else %} - 50 - {% endif %} - {% if per_page == 100 %} - 100 - {% else %} - 100 - {% endif %} -
-{% else %} -

{% trans "Empty" %}

-{% endif %} -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_user_admin_ldap_imported.html b/seahub/templates/sysadmin/sys_user_admin_ldap_imported.html deleted file mode 100644 index b8f96b3a8d..0000000000 --- a/seahub/templates/sysadmin/sys_user_admin_ldap_imported.html +++ /dev/null @@ -1,74 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load seahub_tags i18n %} -{% block cur_users %}tab-cur{% endblock %} -{% block extra_style %} -{% endblock %} - -{% block left_panel %}{{block.super}} -
- -
-{% endblock %} - -{% block right_panel %} -
- - -
- -
-
- - {% if show_institution %} - - {% endif %} - -
-
- -{% if users %} -{% with is_admin_page=False %} -{% include "sysadmin/useradmin_table.html" %} -{% endwith %} -{% include "snippets/admin_paginator.html" %} -{% else %} -
-

{% trans "No LDAP users have been imported" %}

-
-{% endif %} - -
-

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

-
- -{% if show_institution %} -
-

{% trans "Set institution" %}

- -

- -
-{% endif %} - -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_useradmin.html b/seahub/templates/sysadmin/sys_useradmin.html deleted file mode 100644 index 09184dc513..0000000000 --- a/seahub/templates/sysadmin/sys_useradmin.html +++ /dev/null @@ -1,232 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load seahub_tags i18n %} -{% block cur_users %}tab-cur{% endblock %} - -{% block left_panel %}{{block.super}} -
- -
-{% endblock %} - -{% block right_panel %} -
- - -
- - - -
-
- - {% if show_institution %} - - {% endif %} - -
-
- -
{% csrf_token %} -

{% trans "Add user" %}

-
-
- -
-
- - {% if is_pro %} - -
- {% endif %} - -
- - - -
-
-
-

- -
- -
{% csrf_token %} -

{% trans "Import users from a .xlsx file" %}

- {% trans "Download an example file" %} -
- -
-

{% trans "Please choose a .xlsx file." %}

- -
- -{% with is_admin_page=False %} -{% include "sysadmin/useradmin_table.html" %} -{% endwith %} -{% include "snippets/admin_paginator.html" %} - -
-

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

-
- -{% if show_institution %} -
-

{% trans "Set institution" %}

- -

- -
-{% endif %} -{% endblock %} -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_useradmin_admins.html b/seahub/templates/sysadmin/sys_useradmin_admins.html deleted file mode 100644 index c941f823c8..0000000000 --- a/seahub/templates/sysadmin/sys_useradmin_admins.html +++ /dev/null @@ -1,131 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load seahub_tags i18n staticfiles %} - -{% block cur_users %}tab-cur{% endblock %} - -{% block left_panel %}{{block.super}} -
- -
-{% endblock %} - -{% block right_panel %} -
- - -
- -
-
- - -
-
- -
{% csrf_token %} -

{% trans "Add admins"%}

-
- -
-
-

{% trans "Tip: the emails should be the users already added."%}

-
-
-
-

- -
-
- -{% with is_admin_page=True%} -{% include "sysadmin/useradmin_table.html" %} -{% endwith %} - -
-

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

-
-{% endblock %} - -{% block extra_script %} - {# for tabs #} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_useradmin_ldap.html b/seahub/templates/sysadmin/sys_useradmin_ldap.html deleted file mode 100644 index c6cd186504..0000000000 --- a/seahub/templates/sysadmin/sys_useradmin_ldap.html +++ /dev/null @@ -1,54 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load seahub_tags i18n %} - -{% block cur_users %}tab-cur{% endblock %} - -{% block left_panel %}{{block.super}} -
- -
-{% endblock %} - -{% block right_panel %} -
- -
- - - - - - - - - {% for user in users %} - - - - - - {% endfor %} -
{% trans "Email" %}{% trans "Space Used / Quota" %}{% trans "Create At / Last Login" %}
{{ user.email }} - {{ user.space_usage|seahub_filesizeformat }} / - {% if user.space_quota > 0 %} - {{ user.space_quota|seahub_filesizeformat }} - {% else %} - -- - {% endif %} - -- / {% if user.last_login %}{{user.last_login|translate_seahub_time}} {% else %} -- {% endif %}
- -{% include "sysadmin/useradmin_paginator.html" %} -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/sys_useradmin_paid.html b/seahub/templates/sysadmin/sys_useradmin_paid.html deleted file mode 100644 index 5523549e2e..0000000000 --- a/seahub/templates/sysadmin/sys_useradmin_paid.html +++ /dev/null @@ -1,41 +0,0 @@ -{% 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/sys_virus_scan_records.html b/seahub/templates/sysadmin/sys_virus_scan_records.html deleted file mode 100644 index b10a6b9d01..0000000000 --- a/seahub/templates/sysadmin/sys_virus_scan_records.html +++ /dev/null @@ -1,40 +0,0 @@ -{% extends "sysadmin/base.html" %} - -{% load seahub_tags i18n %} - -{% block cur_virus_scan %}tab-cur{% endblock %} - -{% block right_panel %} -

{% trans "Virus Scan Records" %}

- - - - - - - - {% for r in records %} - - - - - - - {% endfor %} -
{% trans "Library" %}{% trans "Owner" %}{% trans "Virus File" %}{% trans "Operations" %}
{{ r.repo.name }}{{ r.repo.owner }}{{ r.file_path }} - {% if not r.has_handle %} - {% trans "Delete" %} - {% else %} - {% trans "Handled" %} - {% endif %} -
- -{% include "sysadmin/useradmin_paginator.html" %} - -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/user_freeze_email.html b/seahub/templates/sysadmin/user_freeze_email.html index 4e5e3fe361..6ce4a1aa17 100644 --- a/seahub/templates/sysadmin/user_freeze_email.html +++ b/seahub/templates/sysadmin/user_freeze_email.html @@ -12,7 +12,7 @@ {% blocktrans %}Account {{ user }} froze due to excessive failed logins. Please check at:{% endblocktrans%}

-{{ url_base }}{% url 'user_search' %}?email={{user|urlencode}} +{{ url_base }}{% url 'sys_search_users' %}?query={{user|urlencode}} {% endautoescape %} diff --git a/seahub/templates/sysadmin/user_search.html b/seahub/templates/sysadmin/user_search.html deleted file mode 100644 index bdfd38c9e4..0000000000 --- a/seahub/templates/sysadmin/user_search.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load seahub_tags i18n %} - -{% block cur_users %}tab-cur{% endblock %} - -{% block right_panel %} -

{% trans "Search User"%}

- -
-
-
- -
-
-

{% trans "Result"%}

-
- - -
-
-{% if users %} -{% include "sysadmin/useradmin_table.html"%} -{% else %} -

{% trans "No result" %}

-{% endif %} - -
-

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

-
- -{% endblock %} - -{% block extra_script %} - -{% endblock %} diff --git a/seahub/templates/sysadmin/useradmin_js.html b/seahub/templates/sysadmin/useradmin_js.html deleted file mode 100644 index 4b5fce6a7e..0000000000 --- a/seahub/templates/sysadmin/useradmin_js.html +++ /dev/null @@ -1,360 +0,0 @@ -{% load i18n%} -addConfirmTo($('.remove-user-btn'), { - 'title':"{% trans "Delete User" %}", - 'con':"{% trans "Are you sure you want to delete %s ?" %}", - 'post': true // post request -}); -addConfirmTo($('.reset-user-btn'), { - 'title':"{% trans "Password Reset" %}", - 'con':"{% trans "Are you sure you want to reset the password of %s ?" %}", - 'post': true // post request -}); -addConfirmTo($('.revoke-admin-btn'), { - 'title':"{% trans "Revoke Admin" %}", - 'con':"{% trans "Are you sure you want to revoke the admin permission of %s ?" %}", - 'post': true // post request -}); -addConfirmTo($('.unset-trial'), { - 'title': "Remove Trial", - 'con':"Are you sure you want to remove trial for %s ?", - 'post': true // post request -}); - -$('.user-status-edit-icon, .user-role-edit-icon, .user-institution-edit-icon, .admin-role-edit-icon').on('click', function() { - $(this).parent().addClass('hide'); - $(this).parent().next().removeClass('hide'); // show 'select' -}); -$('.user-status-select, .user-role-select, .user-institution-select').on('change', function() { - var select = $(this), - select_val = select.val(), - ajax_type = 'POST', - uid = select.parents('tr').attr('data-userid'), - $select_prev = $(this).prev('.user-status, .user-role, .user-institution'), // .user-status, .user-role, .user-institution - url, data; - - if (select.hasClass('user-status-select')) { - url = "{{ SITE_ROOT }}useradmin/toggle_status/" + uid + "/"; - data = {'s': select_val}; - } else if (select.hasClass('user-institution-select')){ - url = "{{ SITE_ROOT }}api2/accounts/" + uid + "/"; - data = {'institution': select_val}; - ajax_type = 'PUT'; - } else { - url = "{{ SITE_ROOT }}useradmin/toggle_role/" + uid + "/"; - data = {'r': select_val}; - } - - if (select.hasClass('user-status-select') && select_val == 1) { - // show activating popup - $('#activate-msg').modal(); - $('#simplemodal-container').css({'height':'auto'}); - } - $.ajax({ - url: url, - type: ajax_type, - dataType: 'json', - data: data, - cache: false, - beforeSend: prepareCSRFToken, - 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'); - } - $('.user-status-cur-value, .user-role-cur-value, .user-institution-cur-value', $select_prev).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(); - } - }); -}); - -// for 'select' -var $opForAll = $('.js-op-for-all'); -var $opForSelected = $('.js-op-for-selected'); -$('th [type="checkbox"]').on('click', function() { - var all_checked = $(this).prop('checked'); - if (all_checked) { - $('td [type="checkbox"]').prop('checked', true); - $opForAll.hide(); - $opForSelected.show(); - } else { - $('td [type="checkbox"]').prop('checked', false); - $opForAll.show(); - $opForSelected.hide(); - } -}); - -$('td [type="checkbox"]').on('click', function() { - if ($('td [type="checkbox"]:checked').length) { - $opForAll.hide(); - $opForSelected.show(); - } else { - $opForAll.show(); - $opForSelected.hide(); - } - - if ($('td [type="checkbox"]:checked').length == $('td [type="checkbox"]').length) { - $('th [type="checkbox"]').prop('checked', true); - } else { - $('th [type="checkbox"]').prop('checked', false); - } -}); - -$('#set-quota-btn').on('click', function() { - $('#set-quota-form').data({'batch': true}).modal(); - $('#simplemodal-container').css({'width':'auto', 'height':'auto'}); -}); - -{% if show_institution %} -$('#set-institution-btn').on('click', function() { - $('#batch-set-institution-form').modal({focus: false, minWidth: 280}); - $('#simplemodal-container').css({'height':'auto'}); -}); -$("#batch-set-institution-form").on('submit', function() { - var $form = $(this); - var $error = $('.error', $form); - var $submit = $('[type="submit"]', $form); - - var institution = $('[name="institution"]', $form).val(); - var emails = []; - $('td [type="checkbox"]:checked').closest('tr').each(function(index, item) { - emails.push($(item).attr('data-userid')); - }); - - disable($submit); - $.ajax({ - url: "{% url 'api-v2.1-admin-users-batch' %}", - type: "POST", - dataType: 'json', - cache: false, - data: { - 'operation': 'set-institution', - 'email': emails, - 'institution': institution - }, - traditional: true, - beforeSend: prepareCSRFToken, - success: function(data) { - if (data.success.length) { - var emails = []; - $(data.success).each(function(index, item) { - var $tr = $('tr[data-userid="' + item.email + '"]'); - $('.user-institution-cur-value', $tr).html(HTMLescape(item.institution)); - emails.push(item.email); - }); - var msg = "{% trans "Successfully set institution for {users}." %}".replace('{users}', HTMLescape(emails.join(', '))); - feedback(msg, 'success'); - } - if (data.failed.length) { - var err_msg = ''; - $(data.failed).each(function(index, item) { - err_msg += HTMLescape(item.email) + ': ' + item.error_msg + '
'; - }); - setTimeout(function() { feedback(err_msg, 'error'); }, 1500); - } - $.modal.close(); - }, - error: function(xhr, textStatus, errorThrown) { - var error_msg = prepareAjaxErrorMsg(xhr); - $error.html(error_msg).show(); - enable($submit); - } - }); - - return false; -}); -{% endif %} - -$('#delete-users-btn').on('click', function() { - var title = "{% trans "Delete User" %}"; - var content = "{% trans "Are you sure you want to delete the selected user(s) ?" %}"; - var yesCallback = function() { - var emails = []; - $('td [type="checkbox"]:checked').closest('tr').each(function(index, item) { - var email = $(item).attr('data-userid'); - if (email != "{{request.user.username|escapejs}}") { - emails.push(email); - } - }); - $.ajax({ - url: '{% url "api-v2.1-admin-users-batch" %}', - type: 'POST', - cache: false, - data: { - 'operation': 'delete-user', - 'email': emails - }, - traditional: true, - dataType: 'json', - beforeSend: prepareCSRFToken, - success: function(data) { - if (data.success.length) { - var emails = []; - $(data.success).each(function(index, item) { - $('tr[data-userid="' + item.email + '"]').remove(); - emails.push(item.email); - }); - var msg = "{% trans "Successfully deleted {users}." %}".replace('{users}', HTMLescape(emails.join(', '))); - feedback(msg, 'success'); - } - - // all selected items are deleted - if ($('td [type="checkbox"]:checked').length == 0) { - $opForAll.show(); - $opForSelected.hide(); - } - - if (data.failed.length) { - var err_msg = ''; - $(data.failed).each(function(index, item) { - err_msg += HTMLescape(item.email) + ': ' + item.error_msg + '
'; - }); - setTimeout(function() { feedback(err_msg, 'error'); }, 1500); - } - }, - error: ajaxErrorHandler, - complete: function() { - $.modal.close(); - } - }); - }; - showConfirm(title, content, yesCallback); -}); - -// edit quota -$('.quota-edit-icon').on('click', function() { - var email = $(this).closest('tr').attr('data-userid'); - var $spaceQuota = $(this).prev('.user-space-quota'); - $('#set-quota-form').data({'batch': false, 'email': email, '$spaceQuota': $spaceQuota}).modal(); - $('#simplemodal-container').css({'width':'auto', 'height':'auto'}); -}); - -$('#set-quota-form').on('submit', function() { - var space_quota = $.trim($('[name="space_quota"]', $(this)).val()); - var quota_int = parseInt(space_quota); - var $error = $('.error', $(this)); - - if (!space_quota) { - $error.html("{% trans "It is required." %}").show(); - return false; - } - - if (!(quota_int == space_quota && quota_int >= 0)) { - $error.html("{% trans "Invalid quota." %}").show(); - return false; - } - - var $submitBtn = $('[type="submit"]', $(this)); - disable($submitBtn); - - var batch = $(this).data('batch'); - var options = {}; - var getQuotaShown = function(quota) { - var quota_shown; - if (quota >= 0) { - quota_shown = quotaSizeFormat(parseInt(quota), 1); - } else if (quota == -2) { - quota_shown = '--'; - } else { - quota_shown = '{% trans "Error" %}'; - } - return quota_shown; - }; - - if (batch) { - var emails = []; - $('td [type="checkbox"]:checked').closest('tr').each(function(index, item) { - emails.push($(item).attr('data-userid')); - }); - options = { - url: '{% url "api-v2.1-admin-users-batch" %}', - type: 'POST', - data: { - 'operation': 'set-quota', - 'email': emails, - 'quota_total': space_quota - }, - traditional: true, - success: function(data) { - if (data.success.length) { - var emails = []; - $(data.success).each(function(index, item) { - var $tr = $('tr[data-userid="' + item.email + '"]'); - var $quota = $('.user-space-quota', $tr); - $quota.html(getQuotaShown(item.quota_total)); - emails.push(item.email); - }); - var msg = "{% trans "Successfully set quota for {users}." %}".replace('{users}', HTMLescape(emails.join(', '))); - feedback(msg, 'success'); - } - if (data.failed.length) { - var err_msg = ''; - $(data.failed).each(function(index, item) { - err_msg += HTMLescape(item.email) + ': ' + item.error_msg + '
'; - }); - setTimeout(function() { feedback(err_msg, 'error'); }, 1500); - } - $.modal.close(); - } - }; - } else { - var email = $(this).data('email'); - var $spaceQuota = $(this).data('$spaceQuota'); - options = { - url: '{{ SITE_ROOT }}api2/accounts/' + encodeURIComponent(email) + '/', - type: 'PUT', - data: {'storage': space_quota}, - success: function(data) { - $spaceQuota.html(getQuotaShown(data.total)); - var msg = "{% trans "Successfully set quota for {user}." %}".replace('{user}', HTMLescape(data.email)); - feedback(msg, 'success'); - $.modal.close(); - } - }; - } - - $.ajax($.extend({ - dataType: 'json', - cache: false, - beforeSend: prepareCSRFToken, - error: function(xhr, textStatus, errorThrown) { - var err_msg = prepareAjaxErrorMsg(xhr); - $error.html(err_msg).show(); - enable($submitBtn); - } - }, options)); - - return false; -}); - -// select shows, but the user doesn't select a value, or doesn't change the permission, click other place to hide the select -$(document).on('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'); - } - if (!$('.user-role-edit-icon, .user-role-select').is(target)) { - $('.user-role').removeClass('hide'); - $('.user-role-select').addClass('hide'); - } - if (!$('.user-institution-edit-icon, .user-institution-select').is(target)) { - $('.user-institution').removeClass('hide'); - $('.user-institution-select').addClass('hide'); - } - if (!$('.admin-role-edit-icon, .admin-role-select').is(target)) { - $('.admin-role').removeClass('hide'); - $('.admin-role-select').addClass('hide'); - } -}); diff --git a/seahub/templates/sysadmin/useradmin_paginator.html b/seahub/templates/sysadmin/useradmin_paginator.html deleted file mode 100644 index 1c38e9fb3a..0000000000 --- a/seahub/templates/sysadmin/useradmin_paginator.html +++ /dev/null @@ -1,28 +0,0 @@ -{% load i18n%} -
- {% if current_page != 1 %} - {% trans "Previous" %} - {% endif %} - {% if page_next %} - {% trans "Next" %} - {% endif %} - {% if current_page != 1 or page_next %} - | - {% endif %} - {% trans "Per page: " %} - {% if per_page == 25 %} - 25 - {% else %} - 25 - {% endif %} - {% if per_page == 50 %} - 50 - {% else %} - 50 - {% endif %} - {% if per_page == 100 %} - 100 - {% else %} - 100 - {% endif %} -
diff --git a/seahub/templates/sysadmin/useradmin_table.html b/seahub/templates/sysadmin/useradmin_table.html deleted file mode 100644 index d964d2b731..0000000000 --- a/seahub/templates/sysadmin/useradmin_table.html +++ /dev/null @@ -1,165 +0,0 @@ -{% load seahub_tags i18n %} - - - - {% if is_pro %} - - - - {% else %} - - - {% endif %} - {% if show_institution %} - - - - - {% else %} - - - - {% endif %} - - - {% for user in users %} - - - - - {% if is_pro %} - - {% endif %} - - - {% if show_institution %} - - {% endif %} - - - - - {% endfor %} -
ID / {% trans "Name" %} / {% trans "Contact Email" %}{% trans "Status" %}{% trans "Role" %}ID / {% trans "Name" %} / {% trans "Contact Email" %}{% trans "Status" %}{% trans "Space Used / Quota" %}{% trans "Institution" %}{% trans "Create At / Last Login" %}{% trans "Space Used / Quota" %}{% trans "Create At / Last Login" %}
- {{ user.email|email2nickname }} - {% if user.contact_email %}
{{ user.contact_email }}{% endif %} - {% if not is_admin_page %} - {% if user.org %} -

({{user.org.org_name}})

- {% endif %} - {% if user.trial_info %} -

(Trial  X)

- {% endif %} - {% endif %} -
-
- {% if user.is_active %} - {% trans "Active" %} - {% else %} - {% trans "Inactive" %} - {% endif %} - -
- -
- {% if not is_admin_page %} -
- {% if user.is_guest %} - {% trans "Guest" %} - {% elif user.is_default %} - {% trans "Default" %} - {% else %} - {{user.role}} - {% endif %} - -
- - - {% else %} {# else for `if not is_admin_page` #} -
- {% if user.admin_role == default_admin %} - {% trans "Default Admin" context "Default Administrator" %} - {% elif user.admin_role == system_admin %} - {% trans "System Admin" context "System Administrator" %} - {% elif user.admin_role == daily_admin %} - {% trans "Daily Admin" context "Daily Administrator" %} - {% elif user.admin_role == audit_admin %} - {% trans "Audit Admin" context "Audit Administrator" %} - {% else %} - {{user.admin_role}} - {% endif %} - -
- - {% endif %} -
- {{ user.space_usage|seahub_filesizeformat }} / - - {% if user.space_quota >= 0 %} - {{ user.space_quota|seahub_filesizeformat }} - {% elif user.space_quota == -2 %} - -- - {% else %} - {% trans "Error" %} - {% endif %} - - - -
- {{ user.institution }} - -
- -
- {% if user.source == "DB" %} - {{ user.ctime|tsstr_sec }} /
- {% else %} - -- / - {% endif %} - {% if user.last_login %}{{user.last_login|translate_seahub_time}} {% else %} -- {% endif %} -
- {% if not user.is_self %} - {% trans "Delete" %} -
- {% if user.source == "DB" %} - {% trans "ResetPwd" %} - {% endif %} -
- {% if is_admin_page %} - {% trans "Revoke Admin" %} - {% endif %} - {% endif %} -
- -
{% csrf_token %} -

{% trans "Set quota" %}

- MB -

- {% trans "An integer that is greater than or equal to 0." %}
- {% trans "Tip: 0 means default limit" %} -

-

- -
diff --git a/seahub/templates/sysadmin/userinfo.html b/seahub/templates/sysadmin/userinfo.html deleted file mode 100644 index af8d43dfb8..0000000000 --- a/seahub/templates/sysadmin/userinfo.html +++ /dev/null @@ -1,614 +0,0 @@ -{% extends "sysadmin/base.html" %} -{% load i18n avatar_tags seahub_tags staticfiles %} - - -{% block extra_style %} - - -{% endblock %} - - -{% block right_panel %} - -

- Users - / - {{ email|email2nickname }} -

- -
- - -
-
-
{% trans "Avatar" %}
-
{% avatar email 48 %}
- -
{% trans "Email" %}
-
{{ email }}
- - {% if org_name %} -
{% trans "Organization" %}
-
{{ org_name }}
- {% endif %} - -
{% trans "Name" context "true name" %}
-
- - {% if profile and profile.nickname %} - {{ profile.nickname }} - {% else %} - -- - {% endif %} - - -
- -
{% trans "Login ID" %}
-
- - {% if profile and profile.login_id %} - {{ profile.login_id }} - {% else %} - -- - {% endif %} - - -
- -
{% trans "Contact Email" %}
-
- - {% if profile and profile.contact_email %} - {{ profile.contact_email }} - {% else %} - -- - {% endif %} - - -
- -
{% trans "Reference ID" %}
-
- - {% if reference_id %} - {{ reference_id }} - {% else %} - -- - {% endif %} - - -
- - {% if d_profile and d_profile.telephone %} -
{% trans "Telephone" %}
-
{{ d_profile.telephone }}
- {% endif %} - -
{% trans "Space Used / Quota" %}
-
- {{ space_usage|seahub_filesizeformat }} / - - {% if space_quota >= 0 %} - {{ space_quota|seahub_filesizeformat }} - {% elif space_quota == -2 %} - -- - {% else %} - {% trans "Error" %} - {% endif %} - - -
- - {% if two_factor_auth_enabled %} -
{% trans "Two-Factor Authentication" %}
-
- {% if default_device %} -

{% trans "Status" %}: {% trans "enabled" %}

- - {% else %} - - {% endif %} - -
- {% endif %} - -
- -
{% csrf_token %} -

{% trans "Set user name" %}

-
-

- -
- -
{% csrf_token %} -

{% trans "Set user department" %}

-
-

- -
- -
{% csrf_token %} -

{% trans "Set user Login ID" %}

-
-

- -
- -
{% csrf_token %} -

{% trans "Set user contact email" %}

-
-

- -
- -
{% csrf_token %} -

{% trans "Set user Reference ID" %}

-
-

- -
- -
{% csrf_token %} -

{% trans "Set quota" %}

- MB -

- {% trans "An integer that is greater than or equal to 0." %}
- {% trans "Tip: 0 means default limit" %} -

-

- -
-
- -
- {% if owned_repos %} - - - - - - - - - - {% for repo in owned_repos %} - - {% if repo.encrypted %} - - {% else %} - - {% endif %} - - {% if not repo.name %} - - {% else %} - {% if repo.encrypted %} - - {% elif enable_sys_admin_view_repo %} - - {% else %} - - {% endif %} - {% endif %} - - - - - - {% endfor %} -
{% trans "Name" %}{% trans "Size"%}{% trans "Last Update"%}{% trans "Operations" %}
{% trans {% trans Broken ({{repo.id}}){{ repo.name }}{{ repo.name }}{{ repo.name }}{{ repo.size|filesizeformat }}{{ repo.last_modify|translate_seahub_time }} - -
- {% else %} -
-

{% trans "This user has not created any libraries" %}

-
- {% endif %} -
- -
- {% if in_repos %} - - - - - - - - - - {% for repo in in_repos %} - - {% if repo.encrypted %} - - {% elif repo.permission == 'r' %} - - {% else %} - - {% endif %} - {% if enable_sys_admin_view_repo %} - - {% else %} - - {% endif %} - - - - - {% endfor %} -
{% trans "Name" %}{% trans "Share From" %}{% trans "Size"%}{% trans "Last Update"%}
{% trans {% trans {% trans {{ repo.name }}{{ repo.name }}{{ repo.props.user|email2nickname }}{{ repo.size|filesizeformat }}{{ repo.last_modify|translate_seahub_time }}
- {% else %} -
-

{% trans "This user has no shared libraries" %}

-
- {% endif %} -
- - - -
- {% if personal_groups %} - - - - - - - - {% for group in personal_groups %} - - - - - - - {% endfor %} -
{% trans "Name" %}{% trans "Role" %}{% trans "Create At" %}{% trans "Operations" %}
{{ group.group_name }}{{ group.role }}{{ group.timestamp|tsstr_sec }}{% trans "Delete" %}
- {% else %} -
-

{% trans "This user has not created or joined any groups" %}

-
- {% endif %} -
-
- -{% include "sysadmin/repo_transfer_form.html" %} -{% endblock %} - - -{% block extra_script %} - {# for tabs #} - - -{% endblock %} diff --git a/seahub/urls.py b/seahub/urls.py index dcf2bd9108..11cb8845e0 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -16,7 +16,6 @@ from seahub.views.file import view_history_file, view_trash_file,\ view_media_file_via_public_wiki from seahub.views.repo import repo_history_view, repo_snapshot, view_shared_dir, \ view_shared_upload_link, view_lib_as_wiki -from .notifications.views import notification_list from seahub.api2.endpoints.smart_link import SmartLink, SmartLinkToken from seahub.api2.endpoints.groups import Groups, Group from seahub.api2.endpoints.all_groups import AllGroups @@ -609,63 +608,21 @@ urlpatterns = [ url(r'^api/v2.1/admin/work-weixin/departments/import/$', AdminWorkWeixinDepartmentsImport.as_view(), name='api-v2.1-admin-work-weixin-department-import'), ### system admin ### - url(r'^sys/settings/$', sys_settings, name='sys_settings'), - url(r'^sys/statistic/file/$', sys_statistic_file, name='sys_statistic_file'), - url(r'^sys/statistic/storage/$', sys_statistic_storage, name='sys_statistic_storage'), - url(r'^sys/statistic/user/$', sys_statistic_user, name='sys_statistic_user'), - url(r'^sys/statistic/traffic/$', sys_statistic_traffic, name='sys_statistic_traffic'), - url(r'^sys/statistic/reports/$', sys_statistic_reports, name='sys_statistic_reports'), - url(r'^sys/seafadmin/delete/(?P[-0-9a-f]{36})/$', sys_repo_delete, name='sys_repo_delete'), - url(r'^sys/useradmin/$', sys_user_admin, name='sys_useradmin'), url(r'^sys/useradmin/export-excel/$', sys_useradmin_export_excel, name='sys_useradmin_export_excel'), - url(r'^sys/useradmin/ldap/$', sys_user_admin_ldap, name='sys_useradmin_ldap'), - url(r'^sys/useradmin/ldap/imported$', sys_user_admin_ldap_imported, name='sys_useradmin_ldap_imported'), - url(r'^sys/useradmin/admins/$', sys_user_admin_admins, name='sys_useradmin_admins'), url(r'^sys/groupadmin/export-excel/$', sys_group_admin_export_excel, name='sys_group_admin_export_excel'), - 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+)/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'), - url(r'^sys/orgadmin/(?P\d+)/library/$', sys_org_info_library, name='sys_org_info_library'), - url(r'^sys/orgadmin/(?P\d+)/traffic/$', sys_org_info_traffic, name='sys_org_info_traffic'), - url(r'^sys/orgadmin/(?P\d+)/setting/$', sys_org_info_setting, name='sys_org_info_setting'), - url(r'^sys/instadmin/$', sys_inst_admin, name='sys_inst_admin'), - url(r'^sys/instadmin/(?P\d+)/remove/$', sys_inst_remove, name='sys_inst_remove'), - url(r'^sys/instadmin/(?P\d+)/users/$', sys_inst_info_user, name='sys_inst_info_users'), - url(r'^sys/instadmin/(?P\d+)/users/add/$', sys_inst_add_user, name='sys_inst_add_user'), - url(r'^sys/instadmin/(?P\d+)/users/search/$', sys_inst_search_user, name='sys_inst_search_user'), - url(r'^sys/instadmin/(?P\d+)/admins/$', sys_inst_info_admins, name='sys_inst_info_admins'), - url(r'^sys/instadmin/(?P\d+)/toggleadmin/(?P[^/]+)/$', sys_inst_toggle_admin, name='sys_inst_toggle_admin'), - url(r'^sys/instadmin/(?P\d+)/set_quota/$', sys_inst_set_quota, name='sys_inst_set_quota'), - url(r'^sys/publinkadmin/$', sys_publink_admin, name='sys_publink_admin'), - url(r'^sys/publink/remove/$', sys_publink_remove, name='sys_publink_remove'), - url(r'^sys/uploadlinkadmin/$', sys_upload_link_admin, name='sys_upload_link_admin'), - url(r'^sys/uploadlink/remove/$', sys_upload_link_remove, name='sys_upload_link_remove'), - url(r'^sys/link-search/$', sys_link_search, name="sys_link_search"), - url(r'^sys/notificationadmin/', notification_list, name='notification_list'), - url(r'^sys/invitationadmin/$', sys_invitation_admin, name='sys_invitation_admin'), - url(r'^sys/invitationadmin/remove/$', sys_invitation_remove, name='sys_invitation_remove'), url(r'^sys/sudo/', sys_sudo_mode, name='sys_sudo_mode'), url(r'^sys/check-license/', sys_check_license, name='sys_check_license'), url(r'^useradmin/add/$', user_add, name="user_add"), url(r'^useradmin/remove/(?P[^/]+)/$', user_remove, name="user_remove"), url(r'^useradmin/removetrial/(?P[^/]+)/$', remove_trial, name="remove_trial"), - url(r'^useradmin/search/$', user_search, name="user_search"), url(r'^useradmin/removeadmin/(?P[^/]+)/$', user_remove_admin, name='user_remove_admin'), - url(r'^useradmin/info/(?P[^/]+)/$', user_info, name='user_info'), - url(r'^useradmin/toggle_status/(?P[^/]+)/$', user_toggle_status, name='user_toggle_status'), url(r'^useradmin/toggle_role/(?P[^/]+)/$', user_toggle_role, name='user_toggle_role'), url(r'^useradmin/(?P[^/]+)/set_quota/$', user_set_quota, name='user_set_quota'), - url(r'^sys/termsadmin/$', sys_terms_admin, name='sys_terms_admin'), - url(r'^sys/termsadmin/delete/(?P[^/]+)/$', sys_delete_terms, name='sys_delete_terms'), url(r'^useradmin/password/reset/(?P[^/]+)/$', user_reset, name='user_reset'), url(r'^useradmin/batchmakeadmin/$', batch_user_make_admin, name='batch_user_make_admin'), - url(r'^useradmin/batchadduser/$', batch_add_user, name='batch_add_user'), url(r'^useradmin/batchadduser/example/$', batch_add_user_example, name='batch_add_user_example'), url(r'^sys/info/$', sysadmin_react_fake_view, name="sys_info"), @@ -764,27 +721,20 @@ if HAS_FILE_SEARCH: ] if getattr(settings, 'ENABLE_SYSADMIN_EXTRA', False): - from seahub_extra.sysadmin_extra.views import sys_login_admin, \ - sys_log_file_audit, sys_log_file_update, sys_log_perm_audit, \ + from seahub_extra.sysadmin_extra.views import \ sys_login_admin_export_excel, sys_log_file_audit_export_excel, \ - sys_log_file_update_export_excel, sys_log_perm_audit_export_excel, \ - sys_log_email_audit + sys_log_file_update_export_excel, sys_log_perm_audit_export_excel urlpatterns += [ url(r'^api/v2.1/admin/logs/login/$', LoginLogs.as_view(), name='api-v2.1-admin-logs-login'), - url(r'^sys/loginadmin/$', sys_login_admin, name='sys_login_admin'), url(r'^sys/loginadmin/export-excel/$', sys_login_admin_export_excel, name='sys_login_admin_export_excel'), url(r'^api/v2.1/admin/logs/file-audit/$', FileAudit.as_view(), name='api-v2.1-admin-logs-file-audit'), - url(r'^sys/log/fileaudit/$', sys_log_file_audit, name='sys_log_file_audit'), - url(r'^sys/log/emailaudit/$', sys_log_email_audit, name='sys_log_email_audit'), url(r'^sys/log/fileaudit/export-excel/$', sys_log_file_audit_export_excel, name='sys_log_file_audit_export_excel'), url(r'^api/v2.1/admin/logs/file-update/$', FileUpdate.as_view(), name='api-v2.1-admin-logs-file-update'), - url(r'^sys/log/fileupdate/$', sys_log_file_update, name='sys_log_file_update'), url(r'^sys/log/fileupdate/export-excel/$', sys_log_file_update_export_excel, name='sys_log_file_update_export_excel'), url(r'^api/v2.1/admin/logs/perm-audit/$', PermAudit.as_view(), name='api-v2.1-admin-logs-perm-audit'), - url(r'^sys/log/permaudit/$', sys_log_perm_audit, name='sys_log_perm_audit'), url(r'^sys/log/permaudit/export-excel/$', sys_log_perm_audit_export_excel, name='sys_log_perm_audit_export_excel'), ] diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py index 65131310b5..6f6a1e5f2c 100644 --- a/seahub/views/sysadmin.py +++ b/seahub/views/sysadmin.py @@ -139,93 +139,6 @@ def sysadmin_react_fake_view(request, **kwargs): 'enable_share_link_report_abuse': ENABLE_SHARE_LINK_REPORT_ABUSE, }) -@login_required -@sys_staff_required -def sys_statistic_file(request): - - return render(request, 'sysadmin/sys_statistic_file.html', { - }) - -@login_required -@sys_staff_required -def sys_statistic_storage(request): - - return render(request, 'sysadmin/sys_statistic_storage.html', { - }) - -@login_required -@sys_staff_required -def sys_statistic_user(request): - - return render(request, 'sysadmin/sys_statistic_user.html', { - }) - -@login_required -@sys_staff_required -def sys_statistic_traffic(request): - req_type = request.GET.get('type', None) - if not req_type: - return render(request, 'sysadmin/sys_statistic_traffic.html', {}) - - try: - current_page = int(request.GET.get('page', '1')) - per_page = int(request.GET.get('per_page', '100')) - except ValueError: - current_page = 1 - per_page = 100 - - month = request.GET.get('month', timezone.now().strftime('%Y%m')) - try: - month_dt = datetime.datetime.strptime(month, '%Y%m') - except ValueError: - month_dt = timezone.now() - - start = per_page * (current_page - 1) - limit = per_page + 1 - - order_by = request.GET.get('order_by', '') - filters = [ - 'user', 'org_id', - 'sync_file_upload', 'sync_file_download', - 'web_file_upload', 'web_file_download', - 'link_file_upload', 'link_file_download', - ] - if order_by not in filters and \ - order_by not in [x + '_desc' for x in filters]: - order_by = 'link_file_download_desc' - - if req_type == 'user': - traffic_info_list = seafevents_api.get_all_users_traffic_by_month( - month_dt, start, limit, order_by) - else: - traffic_info_list = seafevents_api.get_all_orgs_traffic_by_month( - month_dt, start, limit, order_by) - for e in traffic_info_list: - org = ccnet_api.get_org_by_id(e['org_id']) - e['org_name'] = org.org_name if org else '--' - - page_next = len(traffic_info_list) == limit - - return render(request, - 'sysadmin/sys_trafficadmin.html', { - 'type': req_type, - 'order_by': order_by, - 'traffic_info_list': traffic_info_list[:per_page], - 'month': month, - 'current_page': current_page, - 'prev_page': current_page-1, - 'next_page': current_page+1, - 'per_page': per_page, - 'page_next': page_next, - }) - -@login_required -@sys_staff_required -def sys_statistic_reports(request): - - return render(request, 'sysadmin/sys_statistic_reports.html', { - }) - def can_view_sys_admin_repo(repo): default_repo_id = get_system_default_repo_id() is_default_repo = True if repo.id == default_repo_id else False @@ -266,125 +179,6 @@ def _populate_user_quota_usage(user): user.space_usage = -1 user.space_quota = -1 -@login_required -@sys_staff_required -def sys_user_admin(request): - """List all users from database. - """ - - try: - from seahub_extra.plan.models import UserPlan - enable_user_plan = True - except Exception: - 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: - try: - u = User.objects.get(up.username) - except User.DoesNotExist: - continue - - _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(request, 'sysadmin/sys_useradmin_paid.html', { - 'users': users, - 'enable_user_plan': enable_user_plan, - }) - - ### List all users - # Make sure page request is an int. If not, deliver first page. - try: - current_page = int(request.GET.get('page', '1')) - per_page = int(request.GET.get('per_page', '25')) - except ValueError: - current_page = 1 - per_page = 25 - users_plus_one = seaserv.get_emailusers('DB', per_page * (current_page - 1), - per_page + 1) - if len(users_plus_one) == per_page + 1: - page_next = True - else: - page_next = False - - users = users_plus_one[:per_page] - last_logins = UserLastLogin.objects.filter(username__in=[x.email for x in users]) - if ENABLE_TRIAL_ACCOUNT: - trial_users = TrialAccount.objects.filter(user_or_org__in=[x.email for x in users]) - else: - trial_users = [] - - for user in users: - if user.email == request.user.email: - user.is_self = True - - populate_user_info(user) - _populate_user_quota_usage(user) - - # check user's role - user.is_guest = True if get_user_role(user) == GUEST_USER else False - user.is_default = True if get_user_role(user) == DEFAULT_USER else False - - # 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 - - user.trial_info = None - for trial_user in trial_users: - if trial_user.user_or_org == user.email: - user.trial_info = {'expire_date': trial_user.expire_date} - - platform = get_platform_name() - server_id = get_server_id() - pro_server = 1 if is_pro_version() else 0 - extra_user_roles = [x for x in get_available_roles() - if x not in get_basic_user_roles()] - - multi_institution = getattr(dj_settings, 'MULTI_INSTITUTION', False) - show_institution = False - institutions = None - if multi_institution: - show_institution = True - institutions = [inst.name for inst in Institution.objects.all()] - for user in users: - profile = Profile.objects.get_profile_by_user(user.email) - user.institution = profile.institution if profile else '' - - return render(request, - 'sysadmin/sys_useradmin.html', { - 'users': users, - 'current_page': current_page, - 'prev_page': current_page-1, - 'next_page': current_page+1, - 'per_page': per_page, - 'page_next': page_next, - 'have_ldap': get_ldap_info(), - 'platform': platform, - 'server_id': server_id[:8], - 'default_user': DEFAULT_USER, - 'guest_user': GUEST_USER, - 'is_pro': is_pro_version(), - 'pro_server': pro_server, - 'enable_user_plan': enable_user_plan, - 'extra_user_roles': extra_user_roles, - 'show_institution': show_institution, - 'institutions': institutions, - 'is_email_configured': IS_EMAIL_CONFIGURED, - 'send_email_on_adding_system_member': SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER, - }) - @login_required @sys_staff_required def sys_useradmin_export_excel(request): @@ -514,331 +308,6 @@ def sys_useradmin_export_excel(request): wb.save(response) return response -@login_required -@sys_staff_required -def sys_user_admin_ldap_imported(request): - """List all users from LDAP imported. - """ - - # Make sure page request is an int. If not, deliver first page. - try: - current_page = int(request.GET.get('page', '1')) - per_page = int(request.GET.get('per_page', '25')) - except ValueError: - current_page = 1 - per_page = 25 - users_plus_one = seaserv.get_emailusers('LDAPImport', - per_page * (current_page - 1), - per_page + 1) - if len(users_plus_one) == per_page + 1: - page_next = True - else: - page_next = False - - users = users_plus_one[:per_page] - last_logins = UserLastLogin.objects.filter(username__in=[x.email for x in users]) - for user in users: - if user.email == request.user.email: - user.is_self = True - - populate_user_info(user) - _populate_user_quota_usage(user) - - # check user's role - user.is_guest = True if get_user_role(user) == GUEST_USER else False - user.is_default = True if get_user_role(user) == DEFAULT_USER else False - - # 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 - - extra_user_roles = [x for x in get_available_roles() - if x not in get_basic_user_roles()] - - multi_institution = getattr(dj_settings, 'MULTI_INSTITUTION', False) - show_institution = False - institutions = None - if multi_institution: - show_institution = True - institutions = [inst.name for inst in Institution.objects.all()] - for user in users: - profile = Profile.objects.get_profile_by_user(user.email) - user.institution = profile.institution if profile else '' - - return render(request, - 'sysadmin/sys_user_admin_ldap_imported.html', { - 'users': users, - 'current_page': current_page, - 'prev_page': current_page-1, - 'next_page': current_page+1, - 'per_page': per_page, - 'page_next': page_next, - 'is_pro': is_pro_version(), - 'extra_user_roles': extra_user_roles, - 'default_user': DEFAULT_USER, - 'guest_user': GUEST_USER, - 'show_institution': show_institution, - 'institutions': institutions, - }) - -@login_required -@sys_staff_required -def sys_user_admin_ldap(request): - """List all users from LDAP. - """ - - # Make sure page request is an int. If not, deliver first page. - try: - current_page = int(request.GET.get('page', '1')) - per_page = int(request.GET.get('per_page', '25')) - except ValueError: - current_page = 1 - per_page = 25 - users_plus_one = seaserv.get_emailusers('LDAP', - per_page * (current_page - 1), - per_page + 1) - if len(users_plus_one) == per_page + 1: - page_next = True - else: - page_next = False - - users = users_plus_one[:per_page] - last_logins = UserLastLogin.objects.filter(username__in=[x.email for x in users]) - for user in users: - if user.email == request.user.email: - user.is_self = True - - _populate_user_quota_usage(user) - - # 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 - - return render(request, - 'sysadmin/sys_useradmin_ldap.html', { - 'users': users, - 'current_page': current_page, - 'prev_page': current_page-1, - 'next_page': current_page+1, - 'per_page': per_page, - 'page_next': page_next, - 'is_pro': is_pro_version(), - }) - -@login_required -@sys_staff_required -def sys_user_admin_admins(request): - """List all admins from database and ldap imported - """ - - db_users = ccnet_api.get_emailusers('DB', -1, -1) - ldap_imported_users = ccnet_api.get_emailusers('LDAPImport', -1, -1) - - admin_users = [] - not_admin_users = [] - - for user in db_users + ldap_imported_users: - if user.is_staff is True: - admin_users.append(user) - else: - not_admin_users.append(user) - - last_logins = UserLastLogin.objects.filter(username__in=[x.email for x in admin_users]) - - for user in admin_users: - if user.email == request.user.email: - user.is_self = True - - _populate_user_quota_usage(user) - - # check db user's role - if user.source == "DB": - if user.role == GUEST_USER: - user.is_guest = True - else: - user.is_guest = False - - # 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 - - try: - admin_role = AdminRole.objects.get_admin_role(user.email) - user.admin_role = admin_role.role - except AdminRole.DoesNotExist: - user.admin_role = DEFAULT_ADMIN - - extra_admin_roles = [x for x in get_available_admin_roles() - if x not in get_basic_admin_roles()] - - return render(request, - 'sysadmin/sys_useradmin_admins.html', { - 'users': admin_users, - 'not_admin_users': not_admin_users, - 'have_ldap': get_ldap_info(), - 'extra_admin_roles': extra_admin_roles, - 'default_admin': DEFAULT_ADMIN, - 'system_admin': SYSTEM_ADMIN, - 'daily_admin': DAILY_ADMIN, - 'audit_admin': AUDIT_ADMIN, - 'is_pro': is_pro_version(), - }) - -@login_required -@sys_staff_required -def user_info(request, email): - org_name = None - space_quota = space_usage = 0 - - org = ccnet_api.get_orgs_by_user(email) - if not org: - owned_repos = mute_seafile_api.get_owned_repo_list(email, - ret_corrupted=True) - in_repos = mute_seafile_api.get_share_in_repo_list(email, -1, -1) - space_usage = mute_seafile_api.get_user_self_usage(email) - space_quota = mute_seafile_api.get_user_quota(email) - else: - org_id = org[0].org_id - org_name = org[0].org_name - space_usage = seafile_api.get_org_user_quota_usage(org_id, email) - space_quota = seafile_api.get_org_user_quota(org_id, email) - owned_repos = seafile_api.get_org_owned_repo_list(org_id, email, - ret_corrupted=True) - in_repos = seafile_api.get_org_share_in_repo_list(org_id, email, -1, -1) - - owned_repos = [r for r in owned_repos if not r.is_virtual] - - # get user profile - profile = Profile.objects.get_profile_by_user(email) - d_profile = DetailedProfile.objects.get_detailed_profile_by_user(email) - - user_shared_links = [] - # download links - p_fileshares = [] - fileshares = list(FileShare.objects.filter(username=email)) - for fs in fileshares: - try: - r = seafile_api.get_repo(fs.repo_id) - if not r: - fs.delete() - continue - - if fs.is_file_share_link(): - if seafile_api.get_file_id_by_path(r.id, fs.path) is None: - fs.delete() - continue - - fs.filename = os.path.basename(fs.path) - path = fs.path.rstrip('/') # Normalize file path - obj_id = seafile_api.get_file_id_by_path(r.id, path) - fs.file_size = seafile_api.get_file_size(r.store_id, - r.version, obj_id) - else: - if seafile_api.get_dir_id_by_path(r.id, fs.path) is None: - fs.delete() - continue - - if fs.path == '/': - fs.filename = '/' - else: - fs.filename = os.path.basename(fs.path.rstrip('/')) - - path = fs.path - if path[-1] != '/': # Normalize dir path - path += '/' - # get dir size - dir_id = seafile_api.get_dir_id_by_commit_and_path(r.id, r.head_cmmt_id, path) - fs.dir_size = seafile_api.get_dir_size(r.store_id, r.version, dir_id) - - fs.is_download = True - p_fileshares.append(fs) - except SearpcError as e: - logger.error(e) - continue - p_fileshares.sort(key=lambda x: x.view_cnt, reverse=True) - user_shared_links += p_fileshares - - # upload links - uploadlinks = list(UploadLinkShare.objects.filter(username=email)) - p_uploadlinks = [] - for link in uploadlinks: - try: - r = seafile_api.get_repo(link.repo_id) - if not r: - link.delete() - continue - if seafile_api.get_dir_id_by_path(r.id, link.path) is None: - link.delete() - continue - - if link.path == '/': - link.dir_name = '/' - else: - link.dir_name = os.path.basename(link.path.rstrip('/')) - - link.is_upload = True - p_uploadlinks.append(link) - except SearpcError as e: - logger.error(e) - continue - p_uploadlinks.sort(key=lambda x: x.view_cnt, reverse=True) - user_shared_links += p_uploadlinks - - try: - personal_groups = seaserv.get_personal_groups_by_user(email) - except SearpcError as e: - logger.error(e) - personal_groups = [] - - for g in personal_groups: - try: - is_group_staff = seaserv.check_group_staff(g.id, email) - except SearpcError as e: - logger.error(e) - is_group_staff = False - - if email == g.creator_name: - g.role = _('Owner') - elif is_group_staff: - g.role = _('Admin') - else: - g.role = _('Member') - - try: - user = User.objects.get(email=email) - except User.DoesNotExist: - raise Http404 - - reference_id = user.reference_id - user_default_device = default_device(user) if has_two_factor_auth() else False - - force_2fa = UserOptions.objects.is_force_2fa(user.username) - - return render(request, - 'sysadmin/userinfo.html', { - 'owned_repos': owned_repos, - 'space_quota': space_quota, - 'space_usage': space_usage, - 'in_repos': in_repos, - 'email': email, - 'profile': profile, - 'd_profile': d_profile, - 'org_name': org_name, - 'user_shared_links': user_shared_links, - 'enable_sys_admin_view_repo': ENABLE_SYS_ADMIN_VIEW_REPO, - 'personal_groups': personal_groups, - 'two_factor_auth_enabled': has_two_factor_auth(), - 'default_device': user_default_device, - 'force_2fa': force_2fa, - 'reference_id': reference_id if reference_id else '', - }) - @login_required_ajax @sys_staff_required def user_set_quota(request, email): @@ -905,7 +374,7 @@ def sys_org_set_quota(request, org_id): def user_remove(request, email): """Remove user""" referer = request.META.get('HTTP_REFERER', None) - next_page = reverse('sys_useradmin') if referer is None else referer + next_page = reverse('sys_info') if referer is None else referer try: user = User.objects.get(email=email) @@ -943,7 +412,7 @@ def remove_trial(request, user_or_org): raise Http404 referer = request.META.get('HTTP_REFERER', None) - next_page = reverse('sys_useradmin') if referer is None else referer + next_page = reverse('sys_info') if referer is None else referer TrialAccount.objects.filter(user_or_org=user_or_org).delete() @@ -981,7 +450,7 @@ def user_remove_admin(request, email): messages.error(request, _('Failed to revoke admin: the user does not exist')) referer = request.META.get('HTTP_REFERER', None) - next_page = reverse('sys_useradmin') if referer is None else referer + next_page = reverse('sys_info') if referer is None else referer return HttpResponseRedirect(next_page) @@ -1028,48 +497,6 @@ def email_user_on_activation(user): send_html_email(_('Your account on %s is activated') % get_site_name(), 'sysadmin/user_activation_email.html', c, None, [user.email]) -@login_required_ajax -@sys_staff_required -@require_POST -def user_toggle_status(request, email): - content_type = 'application/json; charset=utf-8' - - if not is_valid_username(email): - return HttpResponse(json.dumps({'success': False}), status=400, - content_type=content_type) - - try: - user_status = int(request.POST.get('s', 0)) - except ValueError: - user_status = 0 - - try: - user = User.objects.get(email) - user.is_active = bool(user_status) - result_code = user.save() - if result_code == -1: - return HttpResponse(json.dumps({'success': False}), status=403, - content_type=content_type) - - if user.is_active is True: - try: - email_user_on_activation(user) - email_sent = True - except Exception as e: - logger.error(e) - email_sent = False - - return HttpResponse(json.dumps({'success': True, - 'email_sent': email_sent, - }), content_type=content_type) - - 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) - @login_required_ajax @sys_staff_required @require_POST @@ -1152,7 +579,7 @@ def user_reset(request, email): messages.error(request, msg) referer = request.META.get('HTTP_REFERER', None) - next_page = reverse('sys_useradmin') if referer is None else referer + next_page = reverse('sys_info') if referer is None else referer return HttpResponseRedirect(next_page) @@ -1282,201 +709,6 @@ def sys_group_admin_export_excel(request): wb.save(response) return response -@login_required -@sys_staff_required -def sys_org_admin(request): - # Make sure page request is an int. If not, deliver first page. - try: - current_page = int(request.GET.get('page', '1')) - per_page = int(request.GET.get('per_page', '25')) - except ValueError: - 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) - if not o: - continue - - 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(request, 'sysadmin/sys_org_admin.html', { - 'orgs': orgs, - 'enable_org_plan': enable_org_plan, - 'hide_paginator': True, - 'paid_page': True, - }) - - 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 = [] - - org_roles = OrgSettings.objects.get_by_orgs(orgs) - org_roles_dict = {} - for x in org_roles: - org_roles_dict[x.org_id] = x.role - - 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) - - 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 - - org.role = org_roles_dict.get(org.org_id, DEFAULT_ORG) - org.is_default_role = True if org.role == DEFAULT_ORG else False - - extra_org_roles = [x for x in get_available_roles() if x != DEFAULT_ORG] - - return render(request, 'sysadmin/sys_org_admin.html', { - 'orgs': orgs, - 'current_page': current_page, - 'prev_page': current_page-1, - 'next_page': current_page+1, - 'per_page': per_page, - 'page_next': page_next, - 'enable_org_plan': enable_org_plan, - 'all_page': True, - 'extra_org_roles': extra_org_roles, - 'default_org': DEFAULT_ORG, - }) - -@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) - - org_roles = OrgSettings.objects.get_by_orgs(orgs) - org_roles_dict = {} - for x in org_roles: - org_roles_dict[x.org_id] = x.role - - for org in orgs: - org.role = org_roles_dict.get(org.org_id, DEFAULT_ORG) - org.is_default_role = True if org.role == DEFAULT_ORG else False - - extra_org_roles = [x for x in get_available_roles() if x != DEFAULT_ORG] - - return render(request, - 'sysadmin/sys_org_search.html', { - 'orgs': orgs, - 'name': org_name, - 'creator': creator, - 'extra_org_roles': extra_org_roles, - 'default_org': DEFAULT_ORG, - }) - -@login_required -@sys_staff_required -def sys_org_rename(request, org_id): - - if request.method != 'POST': - raise Http404 - - referer = request.META.get('HTTP_REFERER', None) - next_page = reverse('sys_org_admin') if referer is None else referer - - new_name = request.POST.get('new_name', None) - if new_name: - try: - ccnet_threaded_rpc.set_org_name(int(org_id), new_name) - messages.success(request, _('Success')) - except Exception as e: - logger.error(e) - messages.error(request, _('Failed to rename organization')) - - return HttpResponseRedirect(next_page) - -@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, _('Successfully deleted.')) - - referer = request.META.get('HTTP_REFERER', None) - next_page = reverse('sys_org_admin') if referer is None else referer - return HttpResponseRedirect(next_page) - @login_required_ajax @sys_staff_required def sys_org_set_member_quota(request, org_id): @@ -1502,354 +734,6 @@ def sys_org_set_member_quota(request, org_id): return HttpResponse(json.dumps({ 'error': _('Input number should be greater than 0')}), status=400, content_type=content_type) -def sys_get_org_base_info(org_id): - - org = ccnet_threaded_rpc.get_org_by_id(org_id) - - # users - users = ccnet_threaded_rpc.get_org_emailusers(org.url_prefix, -1, -1) - users_count = len(users) - - # groups - groups = ccnet_threaded_rpc.get_org_groups(org_id, -1, -1) - groups_count = len(groups) - - # quota - total_quota = seafserv_threaded_rpc.get_org_quota(org_id) - quota_usage = seafserv_threaded_rpc.get_org_quota_usage(org_id) - - return { - "org": org, - "users": users, - "users_count": users_count, - "groups": groups, - "groups_count": groups_count, - "total_quota": total_quota, - "quota_usage": quota_usage, - } - -@login_required -@sys_staff_required -def sys_org_info_user(request, org_id): - - org_id = int(org_id) - - if not ccnet_api.get_org_by_id(org_id): - raise Http404 - - org_basic_info = sys_get_org_base_info(org_id) - users = org_basic_info["users"] - last_logins = UserLastLogin.objects.filter(username__in=[x.email for x in users]) - for user in users: - if user.email == request.user.email: - user.is_self = True - try: - user.self_usage = seafile_api.get_org_user_quota_usage(org_id, user.email) - user.quota = seafile_api.get_org_user_quota(org_id, user.email) - except SearpcError as e: - logger.error(e) - user.self_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 - - return render(request, 'sysadmin/sys_org_info_user.html', - org_basic_info) - - -@login_required -@sys_staff_required -def sys_org_info_group(request, org_id): - - org_id = int(org_id) - - if not ccnet_api.get_org_by_id(org_id): - raise Http404 - - org_basic_info = sys_get_org_base_info(org_id) - - return render(request, 'sysadmin/sys_org_info_group.html', - org_basic_info) - -@login_required -@sys_staff_required -def sys_org_info_library(request, org_id): - - org_id = int(org_id) - - if not ccnet_api.get_org_by_id(org_id): - raise Http404 - - org_basic_info = sys_get_org_base_info(org_id) - - # library - org_repos = seafserv_threaded_rpc.get_org_repo_list(org_id, -1, -1) - - for repo in org_repos: - try: - repo.owner = seafserv_threaded_rpc.get_org_repo_owner(repo.id) - except: - repo.owner = None - - org_basic_info["org_repos"] = org_repos - return render(request, 'sysadmin/sys_org_info_library.html', - org_basic_info) - -@login_required -@sys_staff_required -def sys_org_info_traffic(request, org_id): - - org_id = int(org_id) - - if not ccnet_api.get_org_by_id(org_id): - raise Http404 - - org_basic_info = sys_get_org_base_info(org_id) - - return render(request, 'sysadmin/sys_org_info_traffic.html', - org_basic_info) - -@login_required -@sys_staff_required -def sys_org_info_setting(request, org_id): - - org_id = int(org_id) - - if not ccnet_api.get_org_by_id(org_id): - raise Http404 - - org_basic_info = sys_get_org_base_info(org_id) - - if getattr(settings, 'ORG_MEMBER_QUOTA_ENABLED', False): - from seahub_extra.organizations.models import OrgMemberQuota - org_basic_info['org_member_quota'] = OrgMemberQuota.objects.get_quota(org_id) - else: - org_basic_info['org_member_quota'] = None - - return render(request, 'sysadmin/sys_org_info_setting.html', - org_basic_info) - -@login_required -@sys_staff_required -def sys_publink_admin(request): - # Make sure page request is an int. If not, deliver first page. - try: - current_page = int(request.GET.get('page', '1')) - per_page = int(request.GET.get('per_page', '100')) - except ValueError: - current_page = 1 - per_page = 100 - - offset = per_page * (current_page -1) - limit = per_page + 1 - sort_by = request.GET.get('sort_by', 'time_up') - - if sort_by == 'time_down': - publinks = FileShare.objects.all().order_by('ctime')[offset:offset+limit] - elif sort_by == 'count_up': - publinks = FileShare.objects.all().order_by('-view_cnt')[offset:offset+limit] - elif sort_by == 'count_down': - publinks = FileShare.objects.all().order_by('view_cnt')[offset:offset+limit] - else: - publinks = FileShare.objects.all().order_by('-ctime')[offset:offset+limit] - - if len(publinks) == per_page + 1: - page_next = True - else: - page_next = False - - for l in publinks: - if l.is_file_share_link(): - l.name = os.path.basename(l.path) - else: - l.name = os.path.dirname(l.path) - - return render(request, - 'sysadmin/sys_publink_admin.html', { - 'publinks': publinks, - 'current_page': current_page, - 'prev_page': current_page-1, - 'next_page': current_page+1, - 'per_page': per_page, - 'page_next': page_next, - 'per_page': per_page, - 'sort_by': sort_by, - }) - -@login_required -@sys_staff_required -def sys_upload_link_admin(request): - # Make sure page request is an int. If not, deliver first page. - try: - current_page = int(request.GET.get('page', '1')) - per_page = int(request.GET.get('per_page', '100')) - except ValueError: - current_page = 1 - per_page = 100 - - offset = per_page * (current_page -1) - limit = per_page + 1 - sort_by = request.GET.get('sort_by', '-time') - - if sort_by == 'time': - uploadlinks = UploadLinkShare.objects.all().order_by('ctime')[offset:offset+limit] - elif sort_by == '-count': - uploadlinks = UploadLinkShare.objects.all().order_by('-view_cnt')[offset:offset+limit] - elif sort_by == 'count': - uploadlinks = UploadLinkShare.objects.all().order_by('view_cnt')[offset:offset+limit] - else: - uploadlinks = UploadLinkShare.objects.all().order_by('-ctime')[offset:offset+limit] - - if len(uploadlinks) == per_page + 1: - page_next = True - else: - page_next = False - - return render(request, - 'sysadmin/sys_upload_link_admin.html', { - 'uploadlinks': uploadlinks, - 'current_page': current_page, - 'prev_page': current_page-1, - 'next_page': current_page+1, - 'per_page': per_page, - 'page_next': page_next, - 'per_page': per_page, - 'sort_by': sort_by - }) - -@login_required_ajax -@sys_staff_required -@require_POST -def sys_publink_remove(request): - """Remove share links. - """ - content_type = 'application/json; charset=utf-8' - result = {} - - token = request.POST.get('t') - if not token: - result = {'error': _("Argument missing")} - return HttpResponse(json.dumps(result), status=400, content_type=content_type) - - FileShare.objects.filter(token=token).delete() - result = {'success': True} - return HttpResponse(json.dumps(result), content_type=content_type) - -@login_required_ajax -@sys_staff_required -@require_POST -def sys_upload_link_remove(request): - """Remove shared upload links. - """ - content_type = 'application/json; charset=utf-8' - result = {} - - token = request.POST.get('t') - if not token: - result = {'error': _("Argument missing")} - return HttpResponse(json.dumps(result), status=400, content_type=content_type) - - UploadLinkShare.objects.filter(token=token).delete() - result = {'success': True} - return HttpResponse(json.dumps(result), content_type=content_type) - -@login_required -@sys_staff_required -def sys_link_search(request): - token = request.GET.get('token', '') - - if len(token) < 3: - publinks = [] - else: - publinks = FileShare.objects.filter(token__startswith=token) - - for l in publinks: - if l.is_file_share_link(): - l.name = os.path.basename(l.path) - else: - l.name = os.path.dirname(l.path) - - return render(request, - 'sysadmin/sys_link_search.html', { - 'publinks': publinks, - 'token': token - }) - -@login_required -@sys_staff_required -def user_search(request): - """Search a user. - """ - email = request.GET.get('email', '') - - user_emails = [] - # search user from ccnet db - users_from_ccnet = ccnet_api.search_emailusers('DB', email, -1, -1) - for user in users_from_ccnet: - user_emails.append(user.email) - - # search user from ccnet ldap - users_from_ldap = ccnet_api.search_emailusers('LDAP', email, -1, -1) - for user in users_from_ldap: - user_emails.append(user.email) - - # search user from profile - users_from_profile = Profile.objects.filter((Q(nickname__icontains=email)) | - Q(contact_email__icontains=email)) - for user in users_from_profile: - user_emails.append(user.user) - - # remove duplicate emails - user_emails = list({}.fromkeys(user_emails).keys()) - - users = [] - for user_email in user_emails: - try: - user_obj = User.objects.get(email=user_email) - except User.DoesNotExist: - continue - - users.append(user_obj) - - last_logins = UserLastLogin.objects.filter(username__in=[x.email for x in users]) - if ENABLE_TRIAL_ACCOUNT: - trial_users = TrialAccount.objects.filter(user_or_org__in=[x.email for x in users]) - else: - trial_users = [] - - for user in users: - _populate_user_quota_usage(user) - - # check user's role - user.is_guest = True if get_user_role(user) == GUEST_USER else False - user.is_default = True if get_user_role(user) == DEFAULT_USER else False - # 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 - - user.trial_info = None - for trial_user in trial_users: - if trial_user.user_or_org == user.email: - user.trial_info = {'expire_date': trial_user.expire_date} - - extra_user_roles = [x for x in get_available_roles() - if x not in get_basic_user_roles()] - - return render(request, 'sysadmin/user_search.html', { - 'users': users, - 'email': email, - 'default_user': DEFAULT_USER, - 'guest_user': GUEST_USER, - 'is_pro': is_pro_version(), - 'extra_user_roles': extra_user_roles, - }) - @login_required @sys_staff_required @require_POST @@ -1888,69 +772,6 @@ def sys_repo_delete(request, repo_id): messages.success(request, _('Successfully deleted.')) return HttpResponseRedirect(next_page) -@login_required -@sys_staff_required -def sys_virus_scan_records(request): - """List virus scan records. - """ - try: - current_page = int(request.GET.get('page', '1')) - per_page = int(request.GET.get('per_page', '100')) - except ValueError: - current_page = 1 - per_page = 100 - - records_all = get_virus_record(start=per_page * (current_page - 1), - limit=per_page + 1) - if len(records_all) == per_page + 1: - page_next = True - else: - page_next = False - - records = [] - for r in records_all[:per_page]: - try: - repo = seafile_api.get_repo(r.repo_id) - except SearpcError as e: - logger.error(e) - continue - - if not repo: - continue - - r.repo = repo - r.repo.owner = seafile_api.get_repo_owner(r.repo.repo_id) - records.append(r) - - return render(request, - 'sysadmin/sys_virus_scan_records.html', { - 'records': records, - 'current_page': current_page, - 'prev_page': current_page - 1, - 'next_page': current_page + 1, - 'per_page': per_page, - 'page_next': page_next, - }) - -@login_required -@sys_staff_required -@require_POST -def sys_delete_virus_scan_records(request, vid): - r = get_virus_record_by_id(vid) - parent_dir = os.path.dirname(r.file_path) - dirent_name = os.path.basename(r.file_path) - - try: - seafile_api.del_file(r.repo_id, parent_dir, dirent_name, - request.user.username) - handle_virus_record(vid) - messages.success(request, _('Successfully deleted.')) - except SearpcError as e: - logger.error(e) - messages.error(request, _('Failed to delete, please try again later.')) - - return HttpResponseRedirect(reverse('sys_virus_scan_records')) - @login_required_ajax @sys_staff_required def batch_user_make_admin(request): @@ -2013,107 +834,6 @@ def batch_add_user_example(request): wb.save(response) return response -@login_required -@sys_staff_required -def batch_add_user(request): - """ Batch add users. Import users from XLSX file. - """ - if request.method != 'POST': - raise Http404 - - next_page = request.META.get('HTTP_REFERER', reverse(sys_user_admin)) - - form = BatchAddUserForm(request.POST, request.FILES) - if form.is_valid(): - content = request.FILES['file'].read() - if str(request.FILES['file']).split('.')[-1].lower() != 'xlsx': - messages.error(request, _('Please choose a .xlsx file.')) - return HttpResponseRedirect(next_page) - - try: - fs = BytesIO(content) - wb = load_workbook(filename=fs, read_only=True) - except Exception as e: - logger.error(e) - messages.error(request, _('Internal Server Error')) - return HttpResponseRedirect(next_page) - - rows = wb.worksheets[0].rows - records = [] - # remove first row(head field). - next(rows) - for row in rows: - # value of email and password is not None - if row[0].value and row[1].value: - records.append([c.value for c in row]) - - if user_number_over_limit(new_users=len(records)): - messages.error(request, _('The number of users exceeds the limit.')) - return HttpResponseRedirect(next_page) - - for row in records: - try: - username = row[0].strip() - password = row[1].strip() - if not is_valid_username(username) or not password: - continue - except Exception as e: - logger.error(e) - continue - - try: - User.objects.get(email=username) - except User.DoesNotExist: - User.objects.create_user( - username, password, is_staff=False, is_active=True) - - if config.FORCE_PASSWORD_CHANGE: - UserOptions.objects.set_force_passwd_change(username) - - # then update the user's optional info - try: - nickname = row[2].strip() - if len(nickname) <= 64 and '/' not in nickname: - Profile.objects.add_or_update(username, nickname, '') - except Exception as e: - logger.error(e) - - try: - role = row[3].strip() - if is_pro_version() and role in get_available_roles(): - User.objects.update_role(username, role) - except Exception as e: - logger.error(e) - - try: - space_quota_mb = int(row[4]) - if space_quota_mb >= 0: - space_quota = int(space_quota_mb) * get_file_size_unit('MB') - seafile_api.set_user_quota(username, space_quota) - except Exception as e: - logger.error(e) - - send_html_email_with_dj_template( - username, dj_template='sysadmin/user_batch_add_email.html', - subject=_('You are invited to join %s') % get_site_name(), - context={ - 'user': email2nickname(request.user.username), - 'email': username, - 'password': password, - }) - - # send admin operation log signal - admin_op_detail = { - "email": username, - } - admin_operation.send(sender=None, admin_name=request.user.username, - operation=USER_ADD, detail=admin_op_detail) - messages.success(request, _('Import succeeded')) - else: - messages.error(request, _('Please choose a .xlsx file.')) - - return HttpResponseRedirect(next_page) - @login_required def sys_sudo_mode(request): if request.method not in ('GET', 'POST'): @@ -2123,7 +843,7 @@ def sys_sudo_mode(request): if not request.user.is_staff: raise Http404 - next_page = request.GET.get('next', reverse('sys_useradmin')) + next_page = request.GET.get('next', reverse('sys_info')) password_error = False if request.method == 'POST': password = request.POST.get('password') @@ -2159,79 +879,6 @@ def sys_sudo_mode(request): 'next': next_page, }) -@login_required -@sys_staff_required -def sys_settings(request): - """List and change seahub settings in admin panel. - """ - if not dj_settings.ENABLE_SETTINGS_VIA_WEB: - raise Http404 - - DIGIT_WEB_SETTINGS = [ - 'DISABLE_SYNC_WITH_ANY_FOLDER', 'ENABLE_SIGNUP', - 'ACTIVATE_AFTER_REGISTRATION', 'REGISTRATION_SEND_MAIL', - 'LOGIN_REMEMBER_DAYS', 'REPO_PASSWORD_MIN_LENGTH', - 'ENABLE_REPO_HISTORY_SETTING', 'USER_STRONG_PASSWORD_REQUIRED', - 'ENABLE_ENCRYPTED_LIBRARY', 'USER_PASSWORD_MIN_LENGTH', - 'USER_PASSWORD_STRENGTH_LEVEL', 'SHARE_LINK_PASSWORD_MIN_LENGTH', - 'ENABLE_USER_CREATE_ORG_REPO', 'FORCE_PASSWORD_CHANGE', - 'LOGIN_ATTEMPT_LIMIT', 'FREEZE_USER_ON_LOGIN_FAILED', - 'ENABLE_SHARE_TO_ALL_GROUPS', 'ENABLE_TWO_FACTOR_AUTH', - 'ENABLE_BRANDING_CSS', 'ENABLE_TERMS_AND_CONDITIONS', - 'ENABLE_USER_CLEAN_TRASH' - ] - - STRING_WEB_SETTINGS = ('SERVICE_URL', 'FILE_SERVER_ROOT', 'TEXT_PREVIEW_EXT', - 'SITE_NAME', 'SITE_TITLE', 'CUSTOM_CSS') - - if request.is_ajax() and request.method == "POST": - content_type = 'application/json; charset=utf-8' - result = {} - - key = request.POST.get('key', None) - value = request.POST.get('value', None) - - if key not in dir(config) or value is None: - result['error'] = _('Invalid setting') - return HttpResponse(json.dumps(result), status=400, content_type=content_type) - - if value.isdigit(): - if key in DIGIT_WEB_SETTINGS: - value = int(value) - else: - result['error'] = _('Invalid value') - return HttpResponse(json.dumps(result), status=400, content_type=content_type) - - if key == 'USER_PASSWORD_STRENGTH_LEVEL' and value not in (1, 2, 3, 4): - result['error'] = _('Invalid value') - return HttpResponse(json.dumps(result), status=400, content_type=content_type) - - else: - if key not in STRING_WEB_SETTINGS: - result['error'] = _('Invalid value') - return HttpResponse(json.dumps(result), status=400, content_type=content_type) - - try: - setattr(config, key, value) - result['success'] = True - return HttpResponse(json.dumps(result), content_type=content_type) - except AttributeError as e: - logger.error(e) - result['error'] = _('Internal server error') - return HttpResponse(json.dumps(result), status=500, content_type=content_type) - - config_dict = {} - for key in dir(config): - value = getattr(config, key) - config_dict[key] = value - - login_bg_image_path = get_login_bg_image_path() - - return render(request, 'sysadmin/settings.html', { - 'config_dict': config_dict, - 'login_bg_image_path': login_bg_image_path, - }) - @login_required_ajax @sys_staff_required def sys_check_license(request): @@ -2265,405 +912,3 @@ def sys_check_license(request): result['expiration_date'] = expiration return HttpResponse(json.dumps(result), content_type=content_type) - -@login_required -@sys_staff_required -def sys_inst_admin(request): - """List institutions. - """ - if request.method == "POST": - inst_name = request.POST.get('name').strip() - if not inst_name: - messages.error(request, 'Name is required.') - return HttpResponseRedirect(reverse('sys_inst_admin')) - - Institution.objects.create(name=inst_name) - messages.success(request, _('Success')) - - return HttpResponseRedirect(reverse('sys_inst_admin')) - - # Make sure page request is an int. If not, deliver first page. - try: - current_page = int(request.GET.get('page', '1')) - per_page = int(request.GET.get('per_page', '100')) - except ValueError: - current_page = 1 - per_page = 100 - - offset = per_page * (current_page - 1) - insts = Institution.objects.all()[offset:offset + per_page + 1] - - if len(insts) == per_page + 1: - page_next = True - else: - page_next = False - - return render(request, - 'sysadmin/sys_inst_admin.html', { - 'insts': insts[:per_page], - 'current_page': current_page, - 'prev_page': current_page - 1, - 'next_page': current_page + 1, - 'per_page': per_page, - 'page_next': page_next, - }) - -@login_required -@sys_staff_required -@require_POST -def sys_inst_add_user(request, inst_id): - content_type = 'application/json; charset=utf-8' - - emails = request.POST.get('emails', '') - email_list = [em.strip() for em in emails.split(',') if em.strip()] - if len(email_list) == 0: - return HttpResponse(json.dumps({'error': "Emails can't be empty"}), - status=400) - try: - inst = Institution.objects.get(pk=inst_id) - except Institution.DoesNotExist: - return HttpResponse(json.dumps({'error': "Institution does not exist"}), - status=400) - - for email in email_list: - try: - User.objects.get(email=email) - except Exception as e: - messages.error(request, 'Failed to add %s to the institution: user does not exist.' % email) - continue - - profile = Profile.objects.get_profile_by_user(email) - if not profile: - profile = Profile.objects.add_or_update(email, email) - if profile.institution: - messages.error(request, _("Failed to add %s to the institution: user already belongs to an institution") % email) - continue - else: - profile.institution = inst.name - profile.save() - messages.success(request, _('Successfully added %s to the institution.') % email) - - return HttpResponse(json.dumps({'success': True}), - content_type=content_type) - -@login_required -@sys_staff_required -@require_POST -def sys_inst_remove(request, inst_id): - """Delete an institution. - """ - try: - inst = Institution.objects.get(pk=inst_id) - except Institution.DoesNotExist: - raise Http404 - - inst_name = inst.name - inst.delete() - institution_deleted.send(sender=None, inst_name = inst_name) - messages.success(request, _('Success')) - - return HttpResponseRedirect(reverse('sys_inst_admin')) - -@login_required -@sys_staff_required -def sys_inst_info_user(request, inst_id): - """List institution members including admins. - """ - try: - inst = Institution.objects.get(pk=inst_id) - except Institution.DoesNotExist: - raise Http404 - - # Make sure page request is an int. If not, deliver first page. - try: - current_page = int(request.GET.get('page', '1')) - per_page = int(request.GET.get('per_page', '100')) - except ValueError: - current_page = 1 - per_page = 100 - - offset = per_page * (current_page - 1) - inst_admins = [x.user for x in InstitutionAdmin.objects.filter(institution=inst)] - usernames = [x.user for x in Profile.objects.filter(institution=inst.name)[offset:offset + per_page + 1]] - if len(usernames) == per_page + 1: - page_next = True - else: - page_next = False - users = [User.objects.get(x) for x in usernames[:per_page]] - - last_logins = UserLastLogin.objects.filter(username__in=[x.email for x in users]) - for u in users: - _populate_user_quota_usage(u) - - if u.username in inst_admins: - u.inst_admin = True - else: - u.inst_admin = False - - # populate user last login time - u.last_login = None - for last_login in last_logins: - if last_login.username == u.email: - u.last_login = last_login.last_login - - users_count = Profile.objects.filter(institution=inst.name).count() - space_quota = InstitutionQuota.objects.get_or_none(institution=inst) - space_usage = get_institution_space_usage(inst) - - return render(request, 'sysadmin/sys_inst_info_user.html', { - 'inst': inst, - 'users': users, - 'users_count': users_count, - 'current_page': current_page, - 'prev_page': current_page - 1, - 'next_page': current_page + 1, - 'per_page': per_page, - 'page_next': page_next, - 'space_usage': space_usage, - 'space_quota': space_quota, - }) - -@login_required -@sys_staff_required -def sys_inst_search_user(request, inst_id): - """Search institution members. - """ - try: - inst = Institution.objects.get(pk=inst_id) - except Institution.DoesNotExist: - raise Http404 - - q = request.GET.get('q', '').lower() - if not q: - return HttpResponseRedirect(reverse('sys_inst_info_users', args=[inst_id])) - - profiles = Profile.objects.filter(institution=inst.name) - usernames = [x.user for x in profiles if q in x.user] - users = [User.objects.get(x) for x in usernames] - - inst_admins = [x.user for x in InstitutionAdmin.objects.filter(institution=inst)] - last_logins = UserLastLogin.objects.filter(username__in=[x for x in users]) - for u in users: - _populate_user_quota_usage(u) - - if u.username in inst_admins: - u.inst_admin = True - else: - u.inst_admin = False - - # populate user last login time - u.last_login = None - for last_login in last_logins: - if last_login.username == u.email: - u.last_login = last_login.last_login - - users_count = Profile.objects.filter(institution=inst.name).count() - - return render(request, 'sysadmin/sys_inst_search_user.html', { - 'q': q, - 'inst': inst, - 'users': users, - 'users_count': users_count, - }) - -@login_required -@sys_staff_required -def sys_inst_info_admins(request, inst_id): - """List institution admins. - """ - try: - inst = Institution.objects.get(pk=inst_id) - except Institution.DoesNotExist: - raise Http404 - - inst_admins = [x.user for x in InstitutionAdmin.objects.filter(institution=inst)] - admins = [User.objects.get(x) for x in inst_admins] - - last_logins = UserLastLogin.objects.filter(username__in=[x.email for x in admins]) - for u in admins: - _populate_user_quota_usage(u) - - # populate user last login time - u.last_login = None - for last_login in last_logins: - if last_login.username == u.email: - u.last_login = last_login.last_login - - users_count = Profile.objects.filter(institution=inst.name).count() - - return render(request, 'sysadmin/sys_inst_info_admins.html', { - 'inst': inst, - 'admins': admins, - 'users_count': users_count, - }) - -@login_required -@sys_staff_required -@require_POST -def sys_inst_toggle_admin(request, inst_id, email): - """Set or revoke an institution admin. - """ - try: - inst = Institution.objects.get(pk=inst_id) - except Institution.DoesNotExist: - raise Http404 - - next_page = request.META.get('HTTP_REFERER', None) - if not next_page: - next_page = reverse('sys_inst_info_users', args=[inst.pk]) - - try: - u = User.objects.get(email=email) - except User.DoesNotExist: - assert False, 'TODO' - - if u.is_staff: - messages.error( - request, 'Can not assign institutional administration roles to global administrators') - return HttpResponseRedirect(next_page) - - res = InstitutionAdmin.objects.filter(institution=inst, user=email) - if len(res) == 0: - InstitutionAdmin.objects.create(institution=inst, user=email) - elif len(res) == 1: - res[0].delete() - # todo: expire user's session - else: - assert False - - messages.success(request, _('Success')) - return HttpResponseRedirect(next_page) - -@login_required -@sys_staff_required -@require_POST -def sys_inst_set_quota(request, inst_id): - """Set institution quota""" - try: - inst = Institution.objects.get(pk=inst_id) - except Institution.DoesNotExist: - raise Http404 - - next_page = request.META.get('HTTP_REFERER', None) - if not next_page: - next_page = reverse('sys_inst_info_users', args=[inst.pk]) - - quota_mb = int(request.POST.get('space_quota', '')) - quota = quota_mb * get_file_size_unit('MB') - - obj, created = InstitutionQuota.objects.update_or_create( - institution=inst, - defaults={'quota': quota}, - ) - content_type = 'application/json; charset=utf-8' - return HttpResponse(json.dumps({'success': True}), status=200, - content_type=content_type) - -@login_required -@sys_staff_required -def sys_invitation_admin(request): - """List all invitations . - """ - - if not ENABLE_GUEST_INVITATION: - raise Http404 - - # Make sure page request is an int. If not, deliver first page. - try: - current_page = int(request.GET.get('page', '1')) - per_page = int(request.GET.get('per_page', '100')) - except ValueError: - current_page = 1 - per_page = 100 - - offset = per_page * (current_page - 1) - limit = per_page + 1 - invitations = Invitation.objects.all().order_by('-invite_time')[offset:offset + limit] - - if len(invitations) == per_page + 1: - page_next = True - else: - page_next = False - - return render(request, - 'sysadmin/sys_invitations_admin.html', { - 'invitations': invitations, - 'current_page': current_page, - 'prev_page': current_page-1, - 'next_page': current_page+1, - 'per_page': per_page, - 'page_next': page_next, - }) - -@login_required -@sys_staff_required -def sys_invitation_remove(request): - """Delete an invitation. - """ - ct = 'application/json; charset=utf-8' - result = {} - - if not ENABLE_GUEST_INVITATION: - return HttpResponse(json.dumps({}), status=400, content_type=ct) - - inv_id = request.POST.get('inv_id', '') - if not inv_id: - result = {'error': "Argument missing"} - return HttpResponse(json.dumps(result), status=400, content_type=ct) - - inv = get_object_or_404(Invitation, pk=inv_id) - inv.delete() - - return HttpResponse(json.dumps({'success': True}), content_type=ct) - -@login_required -@sys_staff_required -def sys_terms_admin(request): - """List Terms and Conditions""" - if request.method == "POST": - content_type = 'application/json; charset=utf-8' - - form = TermsAndConditionsForm(request.POST) - if form.is_valid(): - name = form.cleaned_data['name'] - version_number = form.cleaned_data['version_number'] - text = form.cleaned_data['text'] - enabled = True if request.POST.get('status', '0') == '1' else False - if enabled: - date_active = timezone.now() - else: - date_active = None - pk = request.POST.get('pk', None) - if not pk: # create - t_c = TermsAndConditions.objects.create( - name=name, version_number=version_number, text=text, - date_active=date_active) - else: # update - t_c = TermsAndConditions.objects.get(pk=pk) - t_c.text = text - t_c.version_number = version_number - t_c.name = name - t_c.date_active = date_active - t_c.save() - - return HttpResponse(json.dumps({'success': True}), - content_type=content_type) - else: - return HttpResponse(json.dumps({ - 'error': str(list(form.errors.values())[0]) - }), status=400, content_type=content_type) - - tc_list = TermsAndConditions.objects.all().order_by('-date_created') - - return render(request, 'sysadmin/sys_terms_admin.html', { - 'object_list': tc_list, - }) - -@login_required -@sys_staff_required -@require_POST -def sys_delete_terms(request, pk): - TermsAndConditions.objects.filter(pk=pk).delete() - messages.success(request, _('Successfully deleted 1 item')) - - return HttpResponseRedirect(reverse('sys_terms_admin')) diff --git a/tests/api/test_auth.py b/tests/api/test_auth.py index 4b03aa2a53..e975b8e7b5 100644 --- a/tests/api/test_auth.py +++ b/tests/api/test_auth.py @@ -80,9 +80,9 @@ class AuthTest(ApiTestBase): def test_client_login_token_wont_enter_sudo_mode(self): url = self._get_client_login_url(admin=True) - url += '&next=/sys/useradmin' + url += '&next=/sys/info' r = requests.get(url) - assert r.url == urljoin(BASE_URL, '/sys/sudo/?next=/sys/useradmin/') + assert r.url == urljoin(BASE_URL, '/sys/sudo/?next=/sys/info/') def _desktop_login(self): data = { diff --git a/tests/seahub/notifications/management/commands/test_notify_admins_on_virus.py b/tests/seahub/notifications/management/commands/test_notify_admins_on_virus.py index 8147a45e01..39c79d2a16 100644 --- a/tests/seahub/notifications/management/commands/test_notify_admins_on_virus.py +++ b/tests/seahub/notifications/management/commands/test_notify_admins_on_virus.py @@ -6,10 +6,10 @@ from django.test import override_settings import seahub from seahub import urls from seahub.test_utils import BaseTestCase -from seahub.views.sysadmin import sys_virus_scan_records +from seahub.views.sysadmin import sysadmin_react_fake_view urlpatterns = seahub.urls.urlpatterns + [ - url(r'^sys/virus_scan_records/$', sys_virus_scan_records, name='sys_virus_scan_records'), + url(r'^sys/virus-scan-records/$', sysadmin_react_fake_view, name='sys_virus_scan_records'), ] @override_settings(ROOT_URLCONF=__name__) diff --git a/tests/seahub/views/sysadmin/test_link_search.py b/tests/seahub/views/sysadmin/test_link_search.py deleted file mode 100644 index ac1615b091..0000000000 --- a/tests/seahub/views/sysadmin/test_link_search.py +++ /dev/null @@ -1,65 +0,0 @@ -from django.core.urlresolvers import reverse - -from seahub.test_utils import BaseTestCase -from seahub.share.models import FileShare - - -class AdminSearchShareLinkText(BaseTestCase): - - def setUp(self): - self.repo_id = self.repo.id - self.file_path= self.file - self.folder_path= self.folder - self.invalid_token = '00000000000000000000' - - def tearDown(self): - self.remove_repo() - - def _add_file_share_link(self, password=None): - fs = FileShare.objects.create_file_link( - self.user.username, self.repo.id, self.file, password, None) - - return fs.token - - def _add_dir_share_link(self, password=None): - fs = FileShare.objects.create_dir_link( - self.user.username, self.repo.id, self.folder, password, None) - - return fs.token - - def test_search_file_share_link_info_by_token(self): - self.login_as(self.admin) - token = self._add_file_share_link() - - url = reverse('sys_link_search') + '?token=' + token - resp = self.client.get(url) - self.assertEqual(200, resp.status_code) - self.assertEqual(token, resp.context['publinks'][0].token) - - def test_search_file_share_link_info_by_part_of_token(self): - self.login_as(self.admin) - token = self._add_file_share_link() - - url = reverse('sys_link_search') + '?token=' + token[:3] - resp = self.client.get(url) - self.assertEqual(200, resp.status_code) - tokens = [] - for t in resp.context['publinks']: - tokens.append(t.token) - assert token in tokens - - def test_search_file_share_link_info_by_invalid_token(self): - self.login_as(self.admin) - - url = reverse('sys_link_search') + '?token=' + 'i am a invalid token' - resp = self.client.get(url) - self.assertEqual(200, resp.status_code) - self.assertEqual(0, len(resp.context['publinks'])) - - def test_search_file_share_link_info_by_short_token(self): - self.login_as(self.admin) - - url = reverse('sys_link_search') + '?token=' + 'i' - resp = self.client.get(url) - self.assertEqual(200, resp.status_code) - self.assertEqual(0, len(resp.context['publinks'])) diff --git a/tests/seahub/views/sysadmin/test_sys_inst_admin.py b/tests/seahub/views/sysadmin/test_sys_inst_admin.py deleted file mode 100644 index 842f031ee1..0000000000 --- a/tests/seahub/views/sysadmin/test_sys_inst_admin.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.core.urlresolvers import reverse - -from seahub.institutions.models import Institution -from seahub.test_utils import BaseTestCase - -class SysInstAdminTest(BaseTestCase): - def setUp(self): - self.login_as(self.admin) - self.url = reverse('sys_inst_admin') - - def test_can_add(self): - resp = self.client.post(self.url, { - 'name': 'inst1' - }) - - self.assertEqual(302, resp.status_code) - self.assertRedirects(resp, reverse('sys_inst_admin')) - - def test_can_list(self): - for i in range(4): - Institution.objects.create(name='inst %d' % i) - - resp = self.client.get(self.url + '?per_page=2') - - assert len(resp.context['insts']) == 2 - assert resp.context['page_next'] is True - self.assertEqual(200, resp.status_code) - self.assertTemplateUsed('sysadmin/sys_inst_admin.html') - - resp = self.client.get(self.url + '?per_page=2&page=2') - assert len(resp.context['insts']) == 2 - assert resp.context['page_next'] is False diff --git a/tests/seahub/views/sysadmin/test_sys_inst_info_admins.py b/tests/seahub/views/sysadmin/test_sys_inst_info_admins.py deleted file mode 100644 index ee109b2179..0000000000 --- a/tests/seahub/views/sysadmin/test_sys_inst_info_admins.py +++ /dev/null @@ -1,34 +0,0 @@ -from django.core.urlresolvers import reverse - -from seahub.institutions.models import Institution, InstitutionAdmin -from seahub.profile.models import Profile -from seahub.test_utils import BaseTestCase - -class SysInstInfoAdminsTest(BaseTestCase): - def setUp(self): - self.login_as(self.admin) - - self.inst = Institution.objects.create(name='inst_test') - self.url = reverse('sys_inst_info_users', args=[self.inst.pk]) - - assert len(Profile.objects.all()) == 0 - p = Profile.objects.add_or_update(self.user.username, '') - p.institution = self.inst.name - p.save() - - p = Profile.objects.add_or_update(self.admin.username, '') - p.institution = self.inst.name - p.save() - assert len(Profile.objects.all()) == 2 - - InstitutionAdmin.objects.create(institution=self.inst, - user=self.user.username) - InstitutionAdmin.objects.create(institution=self.inst, - user=self.admin.username) - - def test_can_list(self): - resp = self.client.get(self.url) - - self.assertTemplateUsed('sysadmin/sys_inst_info_admins.html') - assert resp.context['inst'] == self.inst - assert len(resp.context['users']) == 2 diff --git a/tests/seahub/views/sysadmin/test_sys_inst_info_user.py b/tests/seahub/views/sysadmin/test_sys_inst_info_user.py deleted file mode 100644 index 2260323185..0000000000 --- a/tests/seahub/views/sysadmin/test_sys_inst_info_user.py +++ /dev/null @@ -1,29 +0,0 @@ -from django.core.urlresolvers import reverse - -from seahub.institutions.models import Institution -from seahub.profile.models import Profile -from seahub.test_utils import BaseTestCase - -class SysInstInfoUserTest(BaseTestCase): - def setUp(self): - self.login_as(self.admin) - - self.inst = Institution.objects.create(name='inst_test') - self.url = reverse('sys_inst_info_users', args=[self.inst.pk]) - - assert len(Profile.objects.all()) == 0 - p = Profile.objects.add_or_update(self.user.username, '') - p.institution = self.inst.name - p.save() - - p = Profile.objects.add_or_update(self.admin.username, '') - p.institution = self.inst.name - p.save() - assert len(Profile.objects.all()) == 2 - - def test_can_list(self): - resp = self.client.get(self.url) - - self.assertTemplateUsed('sysadmin/sys_inst_info_users.html') - assert resp.context['inst'] == self.inst - assert len(resp.context['users']) == 2 diff --git a/tests/seahub/views/sysadmin/test_sys_inst_search_user.py b/tests/seahub/views/sysadmin/test_sys_inst_search_user.py deleted file mode 100644 index 47e4d5c111..0000000000 --- a/tests/seahub/views/sysadmin/test_sys_inst_search_user.py +++ /dev/null @@ -1,31 +0,0 @@ -from django.core.urlresolvers import reverse - -from seahub.institutions.models import Institution -from seahub.profile.models import Profile -from seahub.test_utils import BaseTestCase - - -class SysInstSearchUser(BaseTestCase): - def setUp(self): - self.inst = Institution.objects.create(name='test_inst') - - assert len(Profile.objects.all()) == 0 - p = Profile.objects.add_or_update(self.user.username, '') - p.institution = self.inst.name - p.save() - - p = Profile.objects.add_or_update(self.admin.username, '') - p.institution = self.inst.name - p.save() - assert len(Profile.objects.all()) == 2 - - self.url = reverse('sys_inst_search_user', args=[self.inst.id]) - - def test_can_search(self): - self.login_as(self.admin) - - resp = self.client.get(self.url + '?q=@') - self.assertEqual(200, resp.status_code) - - assert len(resp.context['users']) == 2 - assert resp.context['q'] == '@' diff --git a/tests/seahub/views/sysadmin/test_sys_inst_toggle_admin.py b/tests/seahub/views/sysadmin/test_sys_inst_toggle_admin.py deleted file mode 100644 index 864471b324..0000000000 --- a/tests/seahub/views/sysadmin/test_sys_inst_toggle_admin.py +++ /dev/null @@ -1,34 +0,0 @@ -from django.core.urlresolvers import reverse - -from seahub.institutions.models import Institution, InstitutionAdmin -from seahub.profile.models import Profile -from seahub.test_utils import BaseTestCase - -class SysInstInfoUserTest(BaseTestCase): - def setUp(self): - self.login_as(self.admin) - - self.inst = Institution.objects.create(name='inst_test') - - assert len(Profile.objects.all()) == 0 - p = Profile.objects.add_or_update(self.user.username, '') - p.institution = self.inst.name - p.save() - assert len(Profile.objects.all()) == 1 - - self.url = reverse('sys_inst_toggle_admin', args=[self.inst.pk, - self.user.username]) - - def test_can_set_and_revoke_admin(self): - assert len(InstitutionAdmin.objects.filter(institution=self.inst)) == 0 - resp = self.client.post(self.url) - self.assertEqual(302, resp.status_code) - assert 'Success' in resp.cookies['messages'].value - - assert len(InstitutionAdmin.objects.filter(institution=self.inst)) == 1 - - resp = self.client.post(self.url) - self.assertEqual(302, resp.status_code) - assert 'Success' in resp.cookies['messages'].value - - assert len(InstitutionAdmin.objects.filter(institution=self.inst)) == 0 diff --git a/tests/seahub/views/sysadmin/test_sys_invitation_admin.py b/tests/seahub/views/sysadmin/test_sys_invitation_admin.py deleted file mode 100644 index ac531ccc6a..0000000000 --- a/tests/seahub/views/sysadmin/test_sys_invitation_admin.py +++ /dev/null @@ -1,17 +0,0 @@ -from mock import patch - -from django.core.urlresolvers import reverse - -from seahub.test_utils import BaseTestCase - -@patch('seahub.views.sysadmin.ENABLE_GUEST_INVITATION') -class SysInvitationAdminTest(BaseTestCase): - def test_can_list(self, mock_enable_guest_invitation): - - mock_enable_guest_invitation.return_value = True - - self.login_as(self.admin) - - resp = self.client.get(reverse('sys_invitation_admin')) - self.assertEqual(resp.status_code, 200) - self.assertTemplateUsed('sysadmin/sys_invitations_admin.html') diff --git a/tests/seahub/views/sysadmin/test_sys_settings.py b/tests/seahub/views/sysadmin/test_sys_settings.py deleted file mode 100644 index 1d041d8947..0000000000 --- a/tests/seahub/views/sysadmin/test_sys_settings.py +++ /dev/null @@ -1,18 +0,0 @@ -from django.core.urlresolvers import reverse - -from seahub.test_utils import BaseTestCase - - -class SysSettingsTest(BaseTestCase): - def setUp(self): - self.url = reverse('sys_settings') - self.login_as(self.admin) - - def test_can_render(self): - resp = self.client.get(self.url) - self.assertEqual(200, resp.status_code) - - def test_can_not_render_if_setting_disabled(self): - with self.settings(ENABLE_SETTINGS_VIA_WEB=False): - resp = self.client.get(self.url) - self.assertEqual(404, resp.status_code) diff --git a/tests/seahub/views/sysadmin/test_sys_virus_scan_records.py b/tests/seahub/views/sysadmin/test_sys_virus_scan_records.py deleted file mode 100644 index d51071344e..0000000000 --- a/tests/seahub/views/sysadmin/test_sys_virus_scan_records.py +++ /dev/null @@ -1,55 +0,0 @@ -from mock import patch - -from django.conf.urls import url -from django.core.urlresolvers import reverse -from django.test import override_settings - -import seahub -from seahub import urls -from seahub.test_utils import BaseTestCase -from seahub.views.sysadmin import sys_virus_scan_records, sys_delete_virus_scan_records - -# http://stackoverflow.com/questions/4892210/django-urlresolver-adding-urls-at-runtime-for-testing -urlpatterns = seahub.urls.urlpatterns + [ - url(r'^sys/virus_scan_records/$', sys_virus_scan_records, name='sys_virus_scan_records'), - url(r'^sys/virus_scan_records/delete/(?P\d+)/$', sys_delete_virus_scan_records, name='sys_delete_virus_scan_records'), -] - - -class VirusScanRecord(object): - def __init__(self, repo_id): - self.repo_id = repo_id - - -@override_settings(ROOT_URLCONF=__name__) -class SysVirusScanRecordsTest(BaseTestCase): - @patch('seahub.views.sysadmin.get_virus_record') - def test_can_list_empty(self, mock_get_virus_record): - mock_get_virus_record.return_value = [] - - self.login_as(self.admin) - - resp = self.client.get(reverse('sys_virus_scan_records')) - self.assertEqual(200, resp.status_code) - self.assertTemplateUsed(resp, 'sysadmin/sys_virus_scan_records.html') - - def _get_virus_record(self, start, limit): - records = [] - for i in range(11): - record = VirusScanRecord(self.repo.id) - record.vid = i + 1 - record.has_handle = False - records.append(record) - - return records - - @patch('seahub.views.sysadmin.get_virus_record') - def test_can_list_records_num_more_than_10(self, mock_get_virus_record): - mock_get_virus_record.side_effect = self._get_virus_record - - self.login_as(self.admin) - - resp = self.client.get(reverse('sys_virus_scan_records')) - self.assertEqual(200, resp.status_code) - self.assertTemplateUsed(resp, 'sysadmin/sys_virus_scan_records.html') - assert len(resp.context['records']) >= 10 diff --git a/tests/seahub/views/sysadmin/test_sysadmin.py b/tests/seahub/views/sysadmin/test_sysadmin.py index 2b923cfef0..881902279a 100644 --- a/tests/seahub/views/sysadmin/test_sysadmin.py +++ b/tests/seahub/views/sysadmin/test_sysadmin.py @@ -15,39 +15,6 @@ pytestmark = pytest.mark.django_db from seaserv import ccnet_threaded_rpc -class UserToggleStatusTest(BaseTestCase): - def setUp(self): - self.login_as(self.admin) - - def test_can_activate(self): - old_passwd = self.user.enc_password - resp = self.client.post( - reverse('user_toggle_status', args=[self.user.username]), - {'s': 1}, - HTTP_X_REQUESTED_WITH='XMLHttpRequest' - ) - self.assertEqual(200, resp.status_code) - self.assertContains(resp, '"success": true') - - u = User.objects.get(email=self.user.username) - assert u.is_active is True - assert u.enc_password == old_passwd - - def test_can_deactivate(self): - old_passwd = self.user.enc_password - resp = self.client.post( - reverse('user_toggle_status', args=[self.user.username]), - {'s': 0}, - HTTP_X_REQUESTED_WITH='XMLHttpRequest' - ) - self.assertEqual(200, resp.status_code) - self.assertContains(resp, '"success": true') - - u = User.objects.get(email=self.user.username) - assert u.is_active is False - assert u.enc_password == old_passwd - - class BatchUserMakeAdminTest(BaseTestCase): def setUp(self): self.login_as(self.admin) @@ -125,7 +92,7 @@ class SudoModeTest(BaseTestCase): 'password': self.admin_password, }) self.assertEqual(302, resp.status_code) - self.assertRedirects(resp, reverse('sys_useradmin')) + self.assertRedirects(resp, reverse('sys_info')) class SysGroupAdminExportExcelTest(BaseTestCase): @@ -162,142 +129,6 @@ class SysUserAdminExportExcelTest(BaseTestCase): self.assertEqual(200, resp.status_code) assert 'application/ms-excel' in resp._headers['content-type'] - -class BatchAddUserTest(BaseTestCase): - def setUp(self): - self.clear_cache() - self.login_as(self.admin) - - from constance import config - self.config = config - - self.new_users = [] - self.excel_file = os.path.join(os.getcwd(), 'tests/seahub/views/sysadmin/batch_add_user.xlsx') - data_list = [] - data_list.append(['email', 'password', 'username', 'role', 'quota']) - for i in range(20): - username = "username@test" + str(i) +".com" - password = "password" - name = "name_test" + str(i) - if i < 10: - role = "guest" - else: - role = "default" - quota = "999" - data_list.append([username, password, name, role, quota]) - self.new_users.append(username) - wb = real_write_xls('test', data_list[0], data_list[1:]) - wb.save(self.excel_file) - - def tearDown(self): - for u in self.new_users: - self.remove_user(u) - - def test_can_batch_add(self): - for e in self.new_users: - try: - r = User.objects.get(e) - except User.DoesNotExist: - r = None - assert r is None - - with open(self.excel_file, 'rb') as f: - resp = self.client.post(reverse('batch_add_user'), { - 'file': f - }) - - self.assertEqual(302, resp.status_code) - assert 'Import succeeded' in resp.cookies['messages'].value - for e in self.new_users: - assert User.objects.get(e) is not None - - def test_can_batch_add_when_pwd_change_required(self): - self.config.FORCE_PASSWORD_CHANGE = 1 - - for e in self.new_users: - assert len(UserOptions.objects.filter( - email=e, option_key=KEY_FORCE_PASSWD_CHANGE)) == 0 - - for e in self.new_users: - try: - r = User.objects.get(e) - except User.DoesNotExist: - r = None - assert r is None - - with open(self.excel_file, 'rb') as f: - resp = self.client.post(reverse('batch_add_user'), { - 'file': f - }) - - self.assertEqual(302, resp.status_code) - assert 'Import succeeded' in resp.cookies['messages'].value - for e in self.new_users: - assert User.objects.get(e) is not None - assert UserOptions.objects.passwd_change_required(e) - - def test_can_batch_add_when_pwd_change_not_required(self): - self.config.FORCE_PASSWORD_CHANGE = 0 - - for e in self.new_users: - assert len(UserOptions.objects.filter( - email=e, option_key=KEY_FORCE_PASSWD_CHANGE)) == 0 - - for e in self.new_users: - try: - r = User.objects.get(e) - except User.DoesNotExist: - r = None - assert r is None - - with open(self.excel_file, 'rb') as f: - resp = self.client.post(reverse('batch_add_user'), { - 'file': f - }) - - self.assertEqual(302, resp.status_code) - assert 'Import succeeded' in resp.cookies['messages'].value - for e in self.new_users: - assert User.objects.get(e) is not None - assert not UserOptions.objects.passwd_change_required(e) - - @patch('seahub.views.sysadmin.user_number_over_limit') - def test_can_not_batch_add_if_user_over_limit(self, mock_user_number_over_limit): - - mock_user_number_over_limit.return_value = True - - for e in self.new_users: - try: - r = User.objects.get(e) - except User.DoesNotExist: - r = None - assert r is None - - with open(self.excel_file, 'rb') as f: - resp = self.client.post(reverse('batch_add_user'), { - 'file': f - }) - - self.assertEqual(302, resp.status_code) - assert 'users exceeds the limit' in resp.cookies['messages'].value - - def test_can_send_email(self): - self.assertEqual(0, len(Email.objects.all())) - - with open(self.excel_file, 'rb') as f: - resp = self.client.post(reverse('batch_add_user'), { - 'file': f - }) - - self.assertEqual(302, resp.status_code) - self.assertNotEqual(0, len(Email.objects.all())) - - email = Email.objects.all()[0] - assert self.new_users[0] == email.to[0] - assert "Email: %s" % self.new_users[0] in email.html_message - assert email.status == 2 - - class BatchAddUserHelpTest(BaseTestCase): def setUp(self): self.login_as(self.admin) diff --git a/tests/seahub/views/sysadmin/test_user_info.py b/tests/seahub/views/sysadmin/test_user_info.py deleted file mode 100644 index b7492c898a..0000000000 --- a/tests/seahub/views/sysadmin/test_user_info.py +++ /dev/null @@ -1,135 +0,0 @@ -import os -from django.core.urlresolvers import reverse - -from tests.common.utils import randstring - -from seahub.share.models import FileShare -from seahub.test_utils import BaseTestCase - -from seaserv import ccnet_threaded_rpc, seafile_api - - -class UserInfoTest(BaseTestCase): - - def setUp(self): - - self.login_as(self.admin) - - # create group for admin user - self.admin_group_1_name = randstring(6) - self.admin_group_1_id = ccnet_threaded_rpc.create_group(self.admin_group_1_name, - self.admin.email) - - # create another group for admin user - self.admin_group_2_name = randstring(6) - self.admin_group_2_id = ccnet_threaded_rpc.create_group(self.admin_group_2_name, - self.admin.email) - - # create repo for admin user - self.admin_repo_name = randstring(6) - r = seafile_api.get_repo(self.create_repo(name=self.admin_repo_name, - desc='', username=self.admin.email, passwd=None)) - self.admin_repo_id = r.id - - # set common user as staff in admin user's group - ccnet_threaded_rpc.group_add_member(self.admin_group_1_id, - self.admin.email, self.user.email) - ccnet_threaded_rpc.group_set_admin(self.admin_group_1_id, self.user.email) - - # add common user to admin user's another group - ccnet_threaded_rpc.group_add_member(self.admin_group_2_id, - self.admin.email, self.user.email) - - # share admin user's repo to common user - seafile_api.share_repo(self.admin_repo_id, self.admin.email, - self.user.email, 'rw') - - def tearDown(self): - - # remove common user's repo and group - self.remove_group() - self.remove_repo() - - # remove admin user's group - ccnet_threaded_rpc.remove_group(self.admin_group_1_id, self.admin.email) - - # remove admin user's another group - ccnet_threaded_rpc.remove_group(self.admin_group_2_id, self.admin.email) - - # remove amdin user's repo - seafile_api.remove_repo(self.admin_repo_id) - - def test_can_render(self): - - resp = self.client.get(reverse('user_info', kwargs={'email': self.user.email})) - self.assertEqual(200, resp.status_code) - self.assertTemplateUsed('sysadmin/userinfo.html') - self.assertContains(resp, 'id="owned"') - self.assertContains(resp, 'id="shared"') - self.assertContains(resp, 'id="shared-links"') - self.assertContains(resp, 'id="user-admin-groups"') - - def test_can_list_owned_repos(self): - - repo_id = self.repo.id - resp = self.client.get(reverse('user_info', kwargs={'email': self.user.email})) - self.assertEqual(200, resp.status_code) - self.assertTemplateUsed('sysadmin/userinfo.html') - self.assertContains(resp, repo_id) - - def test_can_list_shared_repos(self): - - resp = self.client.get(reverse('user_info', kwargs={'email': self.user.email})) - self.assertEqual(200, resp.status_code) - self.assertTemplateUsed('sysadmin/userinfo.html') - self.assertContains(resp, self.admin_repo_name) - - def test_can_list_shared_links(self): - - repo_id = self.repo.id - file_path = self.file - dir_path = self.folder - file_name = os.path.basename(file_path) - dir_name = os.path.basename(dir_path) - - # create dir shared link for common user - share_info = { - 'username': self.user.email, - 'repo_id': repo_id, - 'path': dir_path, - 'password': None, - 'expire_date': None, - } - FileShare.objects.create_dir_link(**share_info) - - # create file shared link for common user - share_info = { - 'username': self.user.email, - 'repo_id': repo_id, - 'path': file_path, - 'password': None, - 'expire_date': None, - } - FileShare.objects.create_file_link(**share_info) - - resp = self.client.get(reverse('user_info', kwargs={'email': self.user.email})) - self.assertEqual(200, resp.status_code) - self.assertTemplateUsed('sysadmin/userinfo.html') - self.assertContains(resp, dir_name) - self.assertContains(resp, file_name) - - def test_can_list_groups(self): - - group_name = self.group.group_name - resp = self.client.get(reverse('user_info', kwargs={'email': self.user.email})) - self.assertEqual(200, resp.status_code) - self.assertTemplateUsed('sysadmin/userinfo.html') - - self.assertContains(resp, 'Owned') - self.assertContains(resp, group_name) - - self.assertContains(resp, 'Admin') - self.assertContains(resp, self.admin_group_1_name) - - self.assertContains(resp, 'Member') - self.assertContains(resp, self.admin_group_2_name) diff --git a/tests/seahub/views/sysadmin/test_user_search.py b/tests/seahub/views/sysadmin/test_user_search.py deleted file mode 100644 index 060d23f7a9..0000000000 --- a/tests/seahub/views/sysadmin/test_user_search.py +++ /dev/null @@ -1,61 +0,0 @@ -from django.core.urlresolvers import reverse - -from seahub.profile.models import Profile -from seahub.test_utils import BaseTestCase - -class UserSearchTest(BaseTestCase): - def setUp(self): - self.user_name = self.user.username - - def test_can_search_user_from_ccnet(self): - self.login_as(self.admin) - - q = self.user_name[:3] - resp = self.client.get(reverse('user_search') + '?email=%s' % q) - self.assertEqual(200, resp.status_code) - self.assertTemplateUsed('sysadmin/user_search.html') - self.assertContains(resp, self.user_name) - - def test_can_search_user_from_profile_by_name(self): - self.login_as(self.admin) - - nickname = 'nickname' - p = Profile.objects.add_or_update(self.user_name, nickname=nickname) - p.save() - - resp = self.client.get(reverse('user_search') + '?email=%s' % nickname) - self.assertEqual(200, resp.status_code) - self.assertTemplateUsed('sysadmin/user_search.html') - self.assertContains(resp, self.user_name) - - def test_can_search_user_from_profile_by_contact_email(self): - self.login_as(self.admin) - - contact_email= 'contact@email.com' - p = Profile.objects.add_or_update(self.user_name, nickname='nickname') - p.contact_email = contact_email - p.save() - - resp = self.client.get(reverse('user_search') + - '?email=%s' % contact_email) - - self.assertEqual(200, resp.status_code) - self.assertTemplateUsed('sysadmin/user_search.html') - self.assertContains(resp, self.user_name) - - def test_search_user_with_invalid_user_permission(self): - self.login_as(self.user) - - resp = self.client.get(reverse('user_search') + - '?email=%s' % self.user_name) - - self.assertEqual(404, resp.status_code) - - def test_search_invalid_user(self): - self.login_as(self.admin) - - invalid_user = 'some_invalid_user@a.com' - resp = self.client.get(reverse('user_search') + '?email=%s' % invalid_user) - self.assertEqual(200, resp.status_code) - self.assertTemplateUsed('sysadmin/user_search.html') - self.assertContains(resp, invalid_user)