diff --git a/seahub/templates/sysadmin/sys_useradmin.html b/seahub/templates/sysadmin/sys_useradmin.html
index e8d2213057..67b9e10ce8 100644
--- a/seahub/templates/sysadmin/sys_useradmin.html
+++ b/seahub/templates/sysadmin/sys_useradmin.html
@@ -18,6 +18,7 @@
{% trans "Admins" %}
+
+
+
{% include "sysadmin/useradmin_table.html"%}
{% include "snippets/admin_paginator.html" %}
@@ -111,6 +121,9 @@ $('#add-user-form').submit(function() {
});
return false;
});
+$('#upload-file-btn').click(function () {
+ $('#upload-file-form').modal();
+});
{% include "sysadmin/useradmin_js.html" %}
{% endblock %}
diff --git a/seahub/urls.py b/seahub/urls.py
index f50a56ebda..5cdb9dde5c 100644
--- a/seahub/urls.py
+++ b/seahub/urls.py
@@ -195,7 +195,7 @@ urlpatterns = patterns('',
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'),
)
if settings.SERVE_STATIC:
diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py
index 71045cbe70..128c2ce12e 100644
--- a/seahub/views/sysadmin.py
+++ b/seahub/views/sysadmin.py
@@ -6,6 +6,7 @@ import logging
import simplejson as json
import re
import datetime
+import csv, chardet, StringIO
from django.core.urlresolvers import reverse
from django.contrib import messages
@@ -22,7 +23,7 @@ from seahub.base.accounts import User
from seahub.base.models import UserLastLogin
from seahub.base.decorators import sys_staff_required
from seahub.auth.decorators import login_required
-from seahub.utils import IS_EMAIL_CONFIGURED, string2list
+from seahub.utils import IS_EMAIL_CONFIGURED, string2list, is_valid_email
from seahub.views import get_system_default_repo_id
from seahub.forms import SetUserQuotaForm, AddUserForm
from seahub.profile.models import Profile, DetailedProfile
@@ -849,3 +850,66 @@ def batch_user_make_admin(request):
result['success'] = True
return HttpResponse(json.dumps(result), content_type=content_type)
+
+@login_required
+@sys_staff_required
+def batch_add_user(request):
+
+ if request.method != 'POST':
+ raise Http404
+
+ next = request.META.get('HTTP_REFERER', None)
+ if not next:
+ next = reverse(sys_user_admin)
+
+ if request.FILES.has_key('file'):
+ f = request.FILES['file']
+
+ if f.name[-3:] != "csv":
+ messages.error(request, _(u'Failed! Please upload a csv format file.'))
+ return HttpResponseRedirect(next)
+
+ content = f.read()
+ encoding = chardet.detect(content)['encoding']
+ if encoding != 'utf-8':
+ content = content.decode(encoding, 'replace').encode('utf-8')
+
+ filestream = StringIO.StringIO(content)
+
+ lines_of_csv = filestream.read().splitlines()
+ dialect = csv.Sniffer().sniff(content)
+ reader = csv.DictReader(lines_of_csv, dialect=dialect)
+
+ username_title = lines_of_csv[0].split(',')[0]
+ password_title = lines_of_csv[0].split(',')[1]
+
+ if username_title == password_title or username_title == "" or password_title == "":
+ messages.error(request, _(u'Failed! wrong csv format.'))
+ return HttpResponseRedirect(next)
+
+ failed = {}
+
+ for row in reader:
+ email = row[username_title]
+ password = row[password_title]
+ if is_valid_email(email):
+ try:
+ User.objects.get(email=email)
+ failed[email] = 'Already exist'
+ continue
+ except User.DoesNotExist:
+ if password != '':
+ User.objects.create_user(email, password, is_staff=False,
+ is_active=True)
+ else:
+ failed[email] = 'Has no password'
+ else:
+ failed[email] = 'Unvalid email address'
+
+ failed = sorted(failed.items(),key=lambda e:e[1],reverse=True)
+ for item in failed:
+ messages.error(request, _(u"%s: add '%s' failed.") % (item[1], item[0]))
+ else:
+ messages.error(request, _(u'Please select a csv file first.'))
+
+ return HttpResponseRedirect(next)