-{% 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 %}
-
-{% 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 %}
-
-{% 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}}
-
-{% 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 %}
-
-
-
-{% 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 %}
-
-
-
- {% trans "7 Days" %}
- {% trans "30 Days" %}
- {% trans "1 Year" %}
-
-
-
-
-
-
-{% 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" %}
- {% trans "Add" %}
-
-
-{% if object_list %}
-
-
-
- {% trans "Name" %}
- {% trans "Version" %}
- {% trans "Text" %}
- {% trans "Created" %}
- {% trans "Activated" %}
-
-
-
-
- {% for tc in object_list %}
-
- {{ 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 %}
-
-
-
-
-
-
- {% endfor %}
-
-
-
-{% else %}
-
{% trans "Empty" %}
-{% endif %}
-
-
-
-
-
-{% 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 %}
-
-
-
-
-
- {% trans "Month:" %}
-
-
-
-
-
-
- {% 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 %}
-
-
-
- {% 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 %}
-
-
-
-
- {% trans "Export Excel" %}
-
-
- {% trans "Set quota" %}
- {% if show_institution %}
- {% trans "Set institution" %}
- {% endif %}
- {% trans "Delete users" %}
-
-
-
-{% 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" %}
-
-
- {% for inst in institutions %}
- {{inst}}
- {% endfor %}
-
-
- {% trans "Submit" %}
-
-{% 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 %}
-
-
-
-
- {% trans "Import users" %}
- {% trans "Add user" %}
- {% trans "Export Excel" %}
-
-
- {% trans "Set quota" %}
- {% if show_institution %}
- {% trans "Set institution" %}
- {% endif %}
- {% trans "Delete users" %}
-
-
-
-
{% csrf_token %}
- {% trans "Add user" %}
- {% trans "Email" %}
-
-
- {% trans "Name(optional)" %}
-
-
- {% if is_pro %}
- {% trans "Role"%}
-
- {% trans "Default"%}
- {% trans "Guest"%}
- {% for role in extra_user_roles %}
- {{ role }}
- {% endfor %}
-
- {% endif %}
- {% trans "Password" %}
-
-
-
-
-
- {% trans "Confirm Password" %}
-
-
- {% trans "Submit" %}
-
-
-
{% csrf_token %}
- {% trans "Import users from a .xlsx file" %}
- {% trans "Download an example file" %}
-
-
-
- {% trans "Please choose a .xlsx file." %}
- {% trans "Submit" %}
-
-
-{% 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" %}
-
-
- {% for inst in institutions %}
- {{inst}}
- {% endfor %}
-
-
- {% trans "Submit" %}
-
-{% 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 %}
-
-
-
-
- {% trans "Add admin" %}
-
-
- {% trans "Set quota" %}
- {% trans "Delete users" %}
-
-
-
-
-
-{% 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 %}
-
-
-
-
- {% trans "Email" %}
- {% trans "Space Used / Quota" %}
- {% trans "Create At / Last Login" %}
-
-
- {% for user in users %}
-
- {{ 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 %}
-
- {% endfor %}
-
-
-{% 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" %}
-
-
- {% trans "Library" %}
- {% trans "Owner" %}
- {% trans "Virus File" %}
- {% trans "Operations" %}
-
- {% for r in records %}
-
- {{ r.repo.name }}
- {{ r.repo.owner }}
- {{ r.file_path }}
-
- {% if not r.has_handle %}
- {% trans "Delete" %}
- {% else %}
- {% trans "Handled" %}
- {% endif %}
-
-
- {% endfor %}
-
-
-{% 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 "Email" %}
-
-
-
-
-
{% trans "Result"%}
-
- {% trans "Set quota" %}
- {% trans "Delete users" %}
-
-
-{% 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 %}
- ID / {% trans "Name" %} / {% trans "Contact Email" %}
- {% trans "Status" %}
- {% trans "Role" %}
- {% else %}
- ID / {% trans "Name" %} / {% trans "Contact Email" %}
- {% trans "Status" %}
- {% endif %}
- {% if show_institution %}
- {% trans "Space Used / Quota" %}
- {% trans "Institution" %}
- {% trans "Create At / Last Login" %}
-
- {% else %}
- {% trans "Space Used / Quota" %}
- {% trans "Create At / Last Login" %}
-
- {% endif %}
-
-
- {% for user in users %}
-
-
-
- {{ 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 %}
-
-
-
- {% trans "Active" %}
- {% trans "Inactive"%}
-
-
- {% if is_pro %}
-
- {% if not is_admin_page %}
-
- {% if user.is_guest %}
- {% trans "Guest" %}
- {% elif user.is_default %}
- {% trans "Default" %}
- {% else %}
- {{user.role}}
- {% endif %}
-
-
-
- {% trans "Default" %}
- {% trans "Guest"%}
- {% for role in extra_user_roles %}
- {{ role }}
- {% endfor %}
-
-
- {% 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 %}
-
-
-
- {% trans "Default Admin" context "Default Administrator" %}
- {% trans "System Admin" context "System Administrator" %}
- {% trans "Daily Admin" context "Daily Administrator" %}
- {% trans "Audit Admin" context "Audit Administrator" %}
- {% for role in extra_admin_roles %}
- {{ role }}
- {% endfor %}
-
- {% 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 %}
-
-
-
-
- {% if show_institution %}
-
-
- {{ user.institution }}
-
-
-
-
- {% for inst in institutions %}
- {{inst}}
- {% endfor %}
-
-
- {% endif %}
-
-
- {% 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 %}
-
-
- {% endfor %}
-
-
-
{% 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 }}
-
-
-
-
-
-
-
-
- {% if owned_repos %}
-
-
-
- {% trans "Name" %}
- {% trans "Size"%}
- {% trans "Last Update"%}
- {% trans "Operations" %}
-
-
- {% for repo in owned_repos %}
-
- {% if repo.encrypted %}
-
- {% else %}
-
- {% endif %}
-
- {% if not repo.name %}
- Broken ({{repo.id}})
- {% else %}
- {% if repo.encrypted %}
- {{ repo.name }}
- {% elif enable_sys_admin_view_repo %}
- {{ repo.name }}
- {% else %}
- {{ repo.name }}
- {% endif %}
- {% endif %}
-
- {{ repo.size|filesizeformat }}
- {{ repo.last_modify|translate_seahub_time }}
-
-
-
-
- {% endfor %}
-
- {% else %}
-
-
{% trans "This user has not created any libraries" %}
-
- {% endif %}
-
-
-
- {% if in_repos %}
-
-
-
- {% trans "Name" %}
- {% trans "Share From" %}
- {% trans "Size"%}
- {% trans "Last Update"%}
-
-
- {% for repo in in_repos %}
-
- {% if repo.encrypted %}
-
- {% elif repo.permission == 'r' %}
-
- {% else %}
-
- {% endif %}
- {% if enable_sys_admin_view_repo %}
- {{ repo.name }}
- {% else %}
- {{ repo.name }}
- {% endif %}
- {{ repo.props.user|email2nickname }}
- {{ repo.size|filesizeformat }}
- {{ repo.last_modify|translate_seahub_time }}
-
- {% endfor %}
-
- {% else %}
-
-
{% trans "This user has no shared libraries" %}
-
- {% endif %}
-
-
-
- {% if user_shared_links%}
-
-
-
- {% trans "Name"%}
- {% trans "Size"%}
- {% trans "Type"%}
- {% trans "Visits"%}
- {% trans "Operations"%}
-
- {% for link in user_shared_links %}
-
- {% if link.is_download %}
- {% if link.is_file_share_link %}
-
- {{ link.filename }}
- {{ link.file_size|filesizeformat}}
- {% else %}
-
- {{ link.filename }}
- {{ link.dir_size|filesizeformat}}
- {% endif %}
- {% trans "Download" %}
- {{ link.view_cnt }}
-
- {% trans "Remove"%}
-
- {% else %}
-
- {{ link.dir_name }}
- --
- {% trans "Upload" %}
- {{ link.view_cnt }}
-
- {% trans "Remove"%}
-
- {% endif %}
-
- {% endfor %}
-
- {% else %}
-
-
{% trans "This user has not created any shared links" %}
-
- {% endif %}
-
-
-
- {% if personal_groups %}
-
-
- {% trans "Name" %}
- {% trans "Role" %}
- {% trans "Create At" %}
- {% trans "Operations" %}
-
- {% for group in personal_groups %}
-
- {{ group.group_name }}
- {{ group.role }}
- {{ group.timestamp|tsstr_sec }}
- {% trans "Delete" %}
-
- {% endfor %}
-
- {% 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)