diff --git a/seahub/forms.py b/seahub/forms.py index 2e62c3d51d..51a4ad48f7 100644 --- a/seahub/forms.py +++ b/seahub/forms.py @@ -197,3 +197,8 @@ class SharedLinkPasswordForm(forms.Form): return self.cleaned_data +class BatchAddUserForm(forms.Form): + """ + Form for importing users from CSV file. + """ + file = forms.FileField() diff --git a/seahub/templates/sysadmin/sys_useradmin.html b/seahub/templates/sysadmin/sys_useradmin.html index 67b9e10ce8..ade88124eb 100644 --- a/seahub/templates/sysadmin/sys_useradmin.html +++ b/seahub/templates/sysadmin/sys_useradmin.html @@ -33,13 +33,11 @@ -
{% csrf_token %} -

{% trans "Add user from local file" %}


+{% csrf_token %} +

{% trans "Import user from CSV file" %}



-

{% trans "1. please upload a 'csv' format file;"%}

-

{% trans "2. row 1, column 1 for username title;"%}

-

{% trans "3. row 1, column 2 for password title;"%}

- +

{% trans "CSV file format: user@mail.com, password"%}

+
{% include "sysadmin/useradmin_table.html"%} @@ -122,7 +120,7 @@ $('#add-user-form').submit(function() { return false; }); $('#upload-file-btn').click(function () { - $('#upload-file-form').modal(); + $('#upload-csv-form').modal(); }); {% include "sysadmin/useradmin_js.html" %} diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py index 128c2ce12e..13d7838d92 100644 --- a/seahub/views/sysadmin.py +++ b/seahub/views/sysadmin.py @@ -23,9 +23,9 @@ 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, is_valid_email +from seahub.utils import IS_EMAIL_CONFIGURED, string2list, is_valid_username from seahub.views import get_system_default_repo_id -from seahub.forms import SetUserQuotaForm, AddUserForm +from seahub.forms import SetUserQuotaForm, AddUserForm, BatchAddUserForm from seahub.profile.models import Profile, DetailedProfile from seahub.share.models import FileShare @@ -854,62 +854,43 @@ def batch_user_make_admin(request): @login_required @sys_staff_required def batch_add_user(request): - + """Batch add users. Import users from CSV file. + """ 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() + form = BatchAddUserForm(request.POST, request.FILES) + if form.is_valid(): + content = request.FILES['file'].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 = {} + reader = csv.reader(filestream) 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' + if not row: + continue - 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])) + username = row[0].strip() + password = row[1].strip() + + if not is_valid_username(username): + continue + + if password == '': + continue + + try: + User.objects.get(email=username) + continue + except User.DoesNotExist: + User.objects.create_user(username, password, is_staff=False, + is_active=True) + messages.success(request, _('Success')) else: messages.error(request, _(u'Please select a csv file first.')) + next = request.META.get('HTTP_REFERER', reverse(sys_user_admin)) return HttpResponseRedirect(next)