pfidp/users_admin: csv import

This commit is contained in:
Thomas NOËL 2014-01-17 15:58:46 +01:00
parent 6eeb61de5c
commit 55ef6d1ffe
3 changed files with 41 additions and 9 deletions

View File

@ -1,2 +1,2 @@
"login","nom complet","expiration","mot de passe"{% for user in users %}
"{{ user.name|addslashes }}","{{ user.descr|safe|addslashes }} ","{{ user.expires|date:"c" }}","{{ user.password|default_if_none:"-"|safe|addslashes }} "{% endfor %}
"{{ user.name|addslashes }}","{{ user.descr|safe|addslashes }} ","{{ user.expires|date:"c" }}","{{ user.password|default_if_none:"-"|safe|addslashes }}"{% endfor %}

Can't render this file because it contains an unexpected character in line 1 and column 49.

View File

@ -186,7 +186,7 @@ def activate(username):
def delete(username):
return call('delete', name=username)
def update(username, password, expires, disabled, descr, multiple):
def update(username, password, expires, disabled=False, descr='', multiple=False):
if isinstance(expires, datetime.date):
expires_str = expires.strftime('%m/%d/%Y')
else:

View File

@ -1,6 +1,9 @@
# views for user admin
# -*- encoding: utf-8 -*-
import datetime
import csv
from django.conf import settings
from django.shortcuts import render_to_response, redirect
from django.contrib.auth.decorators import user_passes_test
@ -10,7 +13,6 @@ from django.http import HttpResponse
import pfusers
from .forms import UserForm, NewUserForm, ConfirmForm, UploadFileForm
import datetime
@user_passes_test(lambda user: user.is_staff, login_url='/logout')
def index(request):
@ -249,7 +251,7 @@ def multiple(request):
return render_to_response('users_admin/read-list.html',
{ 'users': users, }, context_instance=RequestContext(request))
if action == "csv":
return csv(users)
return csv_export(users)
request.session['univnautes_idpua_action'] = action
request.session['univnautes_idpua_names'] = names
form = ConfirmForm()
@ -290,7 +292,7 @@ def multiple(request):
return redirect('.')
def csv(users):
def csv_export(users):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="users.csv"'
t = loader.get_template('users_admin/users.csv')
@ -304,11 +306,12 @@ def csv_import(request):
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
try:
new_users = import_csv_file(request.FILES['file'])
created_users, updated_users = import_csv_file(request.FILES['file'])
except Exception as e:
messages.error(request, u'Import du fichier impossible, erreur : %s' % e)
else:
messages.success(request, u'%d utilisateurs importés' % new_users)
messages.success(request, u'%d utilisateurs créés, %d mis à jour' % \
(created_users, updated_users))
return redirect('.')
else:
form = UploadFileForm()
@ -321,5 +324,34 @@ def import_csv_file(f):
with open(filename, 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
raise Exception("TBD")
return 0
csvfile = open(filename, 'rb')
dialect = csv.Sniffer().sniff(csvfile.read(1024))
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
created_users = []
updated_users = []
all_pfusers = pfusers.get_all_pfusers()
# analyse all the file, then create (if no exception)
headers = reader.next()
for row in reader:
user = {
'username': row[0].strip(),
'descr': row[1].strip(),
'expires': datetime.datetime.strptime(row[2],'%Y-%m-%d').date(),
'password': row[3].strip() or None
}
if user['username'] in all_pfusers:
updated_users.append(user)
else:
created_users.append(user)
csvfile.close()
for user in created_users:
pfusers.create(**user)
for user in updated_users:
pfusers.update(**user)
return len(created_users), len(updated_users)