pfidp/users_admin: csv import, first draft (tbd)
This commit is contained in:
parent
eb1506988a
commit
4488d6a119
|
@ -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 %}
|
|
@ -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">
|
||||
|
|
|
@ -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'}))
|
||||
|
|
|
@ -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)),
|
||||
)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Reference in New Issue