diff --git a/media/css/seahub.css b/media/css/seahub.css
index d67a55c1ec..d12959ba96 100644
--- a/media/css/seahub.css
+++ b/media/css/seahub.css
@@ -110,6 +110,7 @@ input.submit {
margin-top:8px;
}
input[type=submit]:hover,
+input[type=reset]:hover,
input[type=button]:hover,
button:hover,
.fileinput-button:hover {
@@ -2536,7 +2537,8 @@ textarea:-moz-placeholder {/* for FF */
font-size:16px;
color:#aaa;
}
-#search-form {
+#search-form,
+#search-user-form{
padding:7px 5px;
height:auto;
background:#f7f7f8;
diff --git a/seahub/templates/sysadmin/sys_useradmin.html b/seahub/templates/sysadmin/sys_useradmin.html
index ce33828c45..57a4b1e052 100644
--- a/seahub/templates/sysadmin/sys_useradmin.html
+++ b/seahub/templates/sysadmin/sys_useradmin.html
@@ -1,12 +1,13 @@
{% extends "admin_base.html" %}
{% load seahub_tags i18n %}
-{% load url from future %}
{% block nav_useradmin_class %}class="cur"{% endblock %}
{% block main_panel %}
{% trans "All Members" %}
+
+
+{% trans "User List"%}
+{% if users %}
+
+
+ {% trans "Email" %} |
+ {% trans "Status" %} |
+ {% trans "Space Used" %} |
+ {% trans "Create At" %} |
+ {% trans "Operations" %} |
+
+
+ {% for user in users %}
+
+ {{ user.email }} |
+ {% if user.props.is_active %}
+ {% trans "Activated" %} |
+ {% else %}
+ {% trans "Active" %} |
+ {% endif %}
+
+ {% if CALC_SHARE_USAGE %}
+ {{ user.self_usage|filesizeformat }} + {{ user.share_usage|filesizeformat }} {% if user.quota > 0 %} / {{ user.quota|filesizeformat }} {% endif %}
+ {% else %}
+ {{ user.self_usage|filesizeformat }} {% if user.quota > 0 %} / {{ user.quota|filesizeformat }} {% endif %}
+ {% endif %}
+ |
+ {{ user.ctime|tsstr_sec }} |
+
+ {% if not user.is_self %}
+ {% trans "Delete" %}
+ {% trans "ResetPwd" %}
+ {% if user.is_staff %}
+ {% trans "Revoke Admin" %}
+ {% else %}
+ {% trans "Set Admin" %}
+ {% endif %}
+ {% endif %}
+ |
+
+ {% endfor %}
+
+{% else %}
+{% trans "Empty" %}
+{% endif %}
+
+
+ {% 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/urls.py b/seahub/urls.py
index 79d1157cd4..a2dec4677a 100644
--- a/seahub/urls.py
+++ b/seahub/urls.py
@@ -15,7 +15,7 @@ from share.views import user_share_list, gen_private_file_share, \
from seahub.views.wiki import personal_wiki, personal_wiki_pages, \
personal_wiki_create, personal_wiki_page_new, personal_wiki_page_edit, \
personal_wiki_page_delete
-from seahub.views.sysadmin import sys_repo_admin, sys_user_admin, \
+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
from seahub.views.ajax import *
@@ -148,6 +148,7 @@ urlpatterns = patterns('',
url(r'^sys/notificationadmin/', notification_list, name='notification_list'),
url(r'^useradmin/add/$', user_add, name="user_add"),
(r'^useradmin/remove/(?P[^/]+)/$', user_remove),
+ url(r'^useradmin/search/$', user_search, name="user_search"),
url(r'^useradmin/makeadmin/(?P[^/]+)/$', user_make_admin, name='user_make_admin'),
url(r'^useradmin/removeadmin/(?P[^/]+)/$', user_remove_admin, name='user_remove_admin'),
url(r'^useradmin/info/(?P[^/]+)/$', user_info, name='user_info'),
diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py
index 516f8f273b..8ec10a47ae 100644
--- a/seahub/views/sysadmin.py
+++ b/seahub/views/sysadmin.py
@@ -418,3 +418,38 @@ def sys_publink_admin(request):
'page_next': page_next,
},
context_instance=RequestContext(request))
+
+@login_required
+@sys_staff_required
+def user_search(request):
+ """Search a user.
+ """
+ email = request.GET.get('email', '')
+ email_patt = email.replace('*', '%')
+
+ # 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
+ users_plus_one = ccnet_threaded_rpc.search_emailusers(
+ email_patt, 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]
+
+ return render_to_response('sysadmin/user_search.html', {
+ 'users': users,
+ 'email': email,
+ 'current_page': current_page,
+ 'prev_page': current_page-1,
+ 'next_page': current_page+1,
+ 'per_page': per_page,
+ 'page_next': page_next,
+ }, context_instance=RequestContext(request))
+