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