pfidp/users_admin: csv import, first draft (tbd)

This commit is contained in:
Thomas NOËL 2014-01-16 18:21:34 +01:00
parent eb1506988a
commit 4488d6a119
5 changed files with 80 additions and 3 deletions

View File

@ -0,0 +1,46 @@
{% extends "users_admin/base.html" %}
{% load i18n %}
{% load staticfiles %}
{% block title %}Importer des utilisateus{% endblock %}
{% block content %}
<h1>Importer des utilisateurs</h1>
<br />
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
<table>
{{ form.as_table }}
</table>
<div class="row">
<div class="span12">
<h3>Format du fichier attendu : CSV</h3>
<ul>
<li>4 colonnes : login, nom complet, date d'expiration, mot de passe ;</li>
<li>date au format AAAA-MM-DD ;</li>
<li>si le mot de passe n'est pas fourni, un mot de passe sera généré ;</li>
<li>si l'utilisateur existe déjà, il sera mis à jour ;</li>
<li>séparateur : la virgule ;</li>
<li>codage UTF-8 ;</li>
<li>la première ligne ne sera pas prise en compte.</li>
</ul>
<h3>Exemple</h3>
<pre class="span6">
"login","nom complet","expiration","mot de passe"
"joe","Joseph","2016-01-01","GxLGFP2"
"bar","Anne Honyme","2010-01-01",""
"team","","2014-07-22",""
</pre>
</div></div>
<div class="form-actions">
<input type="submit" value="Importer" class="btn btn-primary" />
<a href="./" class="btn"><i class="icon-remove"></i> Annuler</a>
</div>
</form>
{% endblock %}

View File

@ -5,7 +5,8 @@
{% block title %}Accueil{% endblock %}
{% block nav %}
<li><a href="create">Créer des utilisateurs</a></li>
<li><a href="create"><i class="icon-plus"></i> Créer des utilisateurs</a></li>
<li><a href="import"><i class="icon-download"></i> Importer des utilisateurs</a></li>
{% endblock %}
{% block title_content %}
@ -80,7 +81,8 @@
<div class="form-actions">
<a href="create" class="btn">Créer des utilisateurs</a>
<a href="create" class="btn"><i class="icon-plus"></i> Créer des utilisateurs</a>
<a href="import" class="btn"><i class="icon-download"></i> Importer des utilisateurs</a>
<div class=" pull-right">
<input type="submit" value="Ok" class="btn pull-right" />
<select name="action" class="pull-right">

View File

@ -8,6 +8,9 @@ import pfusers
class ConfirmForm(forms.Form):
pass
class UploadFileForm(forms.Form):
file = forms.FileField(label=u"Fichier", required=True)
class UserForm(forms.Form):
name = forms.RegexField(label=u"Nom d'utilisateur (login)", regex='^[a-z0-9\.\-_]+$', min_length=3, max_length=16, required=True,
widget=forms.TextInput(attrs={'readonly': True, 'size':'16', 'autocomplete':'off', 'class':'span2'}))

View File

@ -12,5 +12,6 @@ urlpatterns = patterns('',
(r'^desactivate/(?P<name>[a-z0-9\.\-_]+)$', login_required(views.desactivate)),
(r'^activate/(?P<name>[a-z0-9\.\-_]+)$', login_required(views.activate)),
(r'^multiple$', login_required(views.multiple)),
(r'^import$', login_required(views.csv_import)),
)

View File

@ -9,7 +9,7 @@ from django.contrib import messages
from django.http import HttpResponse
import pfusers
from forms import UserForm, NewUserForm, ConfirmForm
from .forms import UserForm, NewUserForm, ConfirmForm, UploadFileForm
import datetime
@user_passes_test(lambda user: user.is_staff, login_url='/logout')
@ -294,3 +294,28 @@ def csv(users):
response.write(t.render(c))
return response
@user_passes_test(lambda user: user.is_staff, login_url='/logout')
def csv_import(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
try:
new_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)
return redirect('.')
else:
form = UploadFileForm()
return render_to_response('users_admin/import.html',
{'form': form},
context_instance=RequestContext(request))
def import_csv_file(f):
filename = '/var/tmp/users-import.csv'
with open(filename, 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
raise Exception("TBD")
return 0