1 # -*- encoding: utf-8 -*-
4 from auf
.django
.references
.models
import Etablissement
5 from django
.conf
import settings
6 from django
.contrib
.auth
import REDIRECT_FIELD_NAME
7 from django
.contrib
.auth
import login
as auth_login
8 from django
.contrib
.auth
import authenticate
9 from django
.contrib
.auth
.decorators
import login_required
10 from django
.contrib
.auth
.forms
import PasswordChangeForm
11 from django
.contrib
.sites
.models
import RequestSite
, Site
12 from django
.core
.urlresolvers
import reverse
as url
13 from django
.core
.mail
import send_mail
14 from django
.http
import HttpResponse
, Http404
15 from django
.shortcuts
import render
, get_object_or_404
, redirect
16 from django
.template
import Context
17 from django
.template
.loader
import get_template
18 from django
.utils
import simplejson
19 from django
.utils
.http
import int_to_base36
, base36_to_int
20 from django
.views
.decorators
.cache
import never_cache
21 from django
.views
.decorators
.csrf
import csrf_protect
23 from chercheurs
.decorators
import chercheur_required
24 from chercheurs
.forms
import \
25 ChercheurSearchForm
, SetPasswordForm
, ChercheurFormGroup
, \
26 AuthenticationForm
, GroupeSearchForm
, MessageForm
27 from chercheurs
.models
import \
28 Chercheur
, Groupe
, Message
, AdhesionGroupe
, AuthLDAP
29 from chercheurs
.utils
import \
30 get_django_user_for_email
, create_ldap_hash
, check_ldap_hash
31 from savoirs
.models
import PageStatique
36 Répertoire des chercheurs
38 search_form
= ChercheurSearchForm(request
.GET
)
39 if search_form
.is_valid():
40 search
= search_form
.save(commit
=False)
43 chercheurs
= search
.run().select_related('etablissement')
44 sort
= request
.GET
.get('tri')
45 if sort
is not None and sort
.endswith('_desc'):
51 chercheurs
= chercheurs
.order_by_nom(direction
)
52 elif sort
== 'etablissement':
53 chercheurs
= chercheurs
.order_by_etablissement(direction
)
55 chercheurs
= chercheurs
.order_by_pays(direction
)
57 chercheurs
= chercheurs
.order_by('-date_modification')
60 p
= PageStatique
.objects
.get(id='repertoire')
62 except PageStatique
.DoesNotExist
:
63 entete
= u
'<h1>Répertoire des chercheurs</h1>'
65 nb_chercheurs
= chercheurs
.count()
67 return render(request
, "chercheurs/index.html", {
68 'chercheurs': chercheurs
,
69 'nb_chercheurs': nb_chercheurs
,
70 'search_form': search_form
,
75 def inscription(request
):
76 if request
.method
== 'POST':
77 forms
= ChercheurFormGroup(request
.POST
)
79 chercheur
= forms
.save()
80 id_base36
= int_to_base36(chercheur
.id)
81 token
= chercheur
.activation_token()
82 template
= get_template('chercheurs/activation_email.txt')
83 domain
= RequestSite(request
).domain
84 message
= template
.render(Context({
85 'chercheur': chercheur
,
86 'id_base36': id_base36
,
91 'Votre inscription à Savoirs en partage',
92 message
, None, [chercheur
.courriel
]
94 return redirect('chercheurs-inscription-faite')
96 forms
= ChercheurFormGroup()
98 return render(request
, "chercheurs/inscription.html", {
103 def activation(request
, id_base36
, token
):
104 """Activation d'un chercheur"""
105 id = base36_to_int(id_base36
)
106 chercheur
= get_object_or_404(Chercheur
.all_objects
, id=id)
107 if token
== chercheur
.activation_token():
109 if request
.method
== 'POST':
110 form
= SetPasswordForm(request
.POST
)
112 password
= form
.cleaned_data
['password']
113 email
= chercheur
.courriel
114 chercheur
.actif
= True
115 user
= get_django_user_for_email(email
)
116 user
.set_password(password
)
118 chercheur
.user
= user
123 request
, authenticate(username
=email
, password
=password
)
125 return redirect('chercheurs.views.perso')
127 form
= SetPasswordForm()
131 return render(request
, 'chercheurs/activation.html', {
133 'validlink': validlink
139 def password_change(request
,
140 template_name
='registration/password_change_form.html',
141 post_change_redirect
=None,
142 password_change_form
=PasswordChangeForm
):
143 if post_change_redirect
is None:
144 post_change_redirect
= url(
145 'django.contrib.auth.views.password_change_done'
147 if request
.method
== "POST":
148 form
= password_change_form(user
=request
.user
, data
=request
.POST
)
152 # Mot de passe pour LDAP
153 username
= request
.user
.email
154 authldap
, created
= \
155 AuthLDAP
.objects
.get_or_create(username
=username
)
156 password
= form
.cleaned_data
.get('new_password1')
157 authldap
.ldap_hash
= create_ldap_hash(password
)
160 return redirect(post_change_redirect
)
162 form
= password_change_form(user
=request
.user
)
163 return render(request
, template_name
, {'form': form
})
167 def desinscription(request
):
168 """Désinscription du chercheur"""
169 chercheur
= request
.chercheur
170 if request
.method
== 'POST':
171 if request
.POST
.get('confirmer'):
172 chercheur
.actif
= False
174 request
.flash
['message'] = \
175 "Vous avez été désinscrit du répertoire des chercheurs."
176 return redirect('django.contrib.auth.views.logout')
178 request
.flash
['message'] = "Opération annulée."
179 return redirect('chercheurs.views.perso')
180 return render(request
, "chercheurs/desinscription.html")
186 """Edition d'un chercheur"""
187 chercheur
= request
.chercheur
188 if request
.method
== 'POST':
189 forms
= ChercheurFormGroup(request
.POST
, chercheur
=chercheur
)
192 request
.flash
['message'] = "Votre fiche a bien été enregistrée."
193 return redirect('chercheurs.views.perso')
195 forms
= ChercheurFormGroup(chercheur
=chercheur
)
197 return render(request
, "chercheurs/edit.html", {
199 'chercheur': chercheur
205 """Espace chercheur (espace personnel du chercheur)"""
206 chercheur
= request
.chercheur
207 modification
= request
.GET
.get('modification')
208 return render(request
, "chercheurs/perso.html", {
209 'chercheur': chercheur
,
210 'modification': modification
214 def retrieve(request
, id):
215 """Fiche du chercheur"""
216 chercheur
= get_object_or_404(Chercheur
, id=id)
217 return render(request
, "chercheurs/retrieve.html", {
218 'chercheur': chercheur
222 def conversion(request
):
223 return render(request
, "chercheurs/conversion.html")
226 def etablissements_autocomplete(request
, pays
=None):
227 term
= request
.GET
.get('term')
229 noms
= Etablissement
.objects
.all().filter(membre
=True, actif
=True)
230 for word
in term
.split():
231 noms
= noms
.filter(nom__icontains
=word
)
233 noms
= noms
.filter(pays
=pays
)
234 noms
= list(noms
.values_list('nom', flat
=True)[:20])
237 json
= simplejson
.dumps(noms
)
238 return HttpResponse(json
, mimetype
='application/json')
241 def login(request
, template_name
='registration/login.html',
242 redirect_field_name
=REDIRECT_FIELD_NAME
):
243 "The Django login view, but using a custom form."
244 redirect_to
= request
.REQUEST
.get(redirect_field_name
, '')
246 if request
.method
== "POST":
247 form
= AuthenticationForm(data
=request
.POST
)
249 # Light security check -- make sure redirect_to isn't garbage.
250 if not redirect_to
or ' ' in redirect_to
:
251 redirect_to
= settings
.LOGIN_REDIRECT_URL
253 # Heavier security check -- redirects to http://example.com
254 # should not be allowed, but things like
255 # /view/?param=http://example.com should be allowed. This regex
256 # checks if there is a '//' *before* a question mark.
257 elif '//' in redirect_to
and re
.match(r
'[^\?]*//', redirect_to
):
258 redirect_to
= settings
.LOGIN_REDIRECT_URL
260 # Mot de passe pour LDAP
261 username
= form
.cleaned_data
.get('username')
262 password
= form
.cleaned_data
.get('password')
263 authldap
, created
= \
264 AuthLDAP
.objects
.get_or_create(username
=username
)
265 if created
or not check_ldap_hash(authldap
.ldap_hash
, password
):
266 authldap
.ldap_hash
= create_ldap_hash(password
)
269 # Okay, security checks complete. Log the user in.
270 auth_login(request
, form
.get_user())
272 if request
.session
.test_cookie_worked():
273 request
.session
.delete_test_cookie()
275 return redirect(redirect_to
)
278 form
= AuthenticationForm(request
)
279 request
.session
.set_test_cookie()
281 if Site
._meta
.installed
:
282 current_site
= Site
.objects
.get_current()
284 current_site
= RequestSite(request
)
286 return render(request
, template_name
, {
288 redirect_field_name
: redirect_to
,
289 'site': current_site
,
290 'site_name': current_site
.name
,
292 login
= never_cache(login
)
296 def groupe_index(request
):
297 search_form
= GroupeSearchForm(request
.GET
)
298 search
= search_form
.save(commit
=False)
299 groupes
= search
.run()
300 nb_resultats
= groupes
.count()
302 p
= PageStatique
.objects
.get(id='groupes')
304 except PageStatique
.DoesNotExist
:
305 entete
= '<h1>Liste des groupes</h1>'
307 est_chercheur
, mesgroupes
, messages
= False, None, None
308 if request
.user
.is_authenticated():
310 chercheur
= Chercheur
.objects
.get(courriel
=request
.user
.email
)
311 mesgroupes
= chercheur
.groupes
.filter(
312 membership__statut
='accepte', groupe_chercheur
=True
314 messages
= Message
.objects
.all().filter(groupe__in
=mesgroupes
)[:10]
316 except Chercheur
.DoesNotExist
:
319 return render(request
, "chercheurs/groupe_index.html", {
320 'search_form': search_form
,
321 'groupes': groupes
.order_by('nom'),
322 'nb_resultats': nb_resultats
,
324 'mesgroupes': mesgroupes
,
325 'messages': messages
,
326 'est_chercheur': est_chercheur
,
330 def groupe_adhesion(request
, id):
332 groupe
= get_object_or_404(Groupe
, id=id)
333 chercheur
= Chercheur
.objects
.get(courriel
=request
.user
.email
)
334 adhesion
, created
= AdhesionGroupe
.objects
.get_or_create(
335 chercheur
=chercheur
, groupe
=groupe
343 return redirect('groupe_retrieve', id=id)
346 def groupe_retrieve(request
, id):
347 groupe
= get_object_or_404(Groupe
, id=id)
348 membres
= groupe
.membership
.all() \
349 .filter(statut
='accepte').order_by('-date_modification')
350 plus_que_20
= True if membres
.count() > 20 else False
351 membres_20
= membres
[:20]
352 messages
= groupe
.message_set
.all()[:5]
354 est_chercheur
, est_membre
, est_membre_actif
= False, False, False
355 if request
.user
.is_authenticated():
357 chercheur
= Chercheur
.objects
.get(courriel
=request
.user
.email
)
359 est_membre
= chercheur
in groupe
.membres
.all()
360 est_membre_actif
= bool(len(groupe
.membership
.filter(
361 chercheur
=chercheur
, statut
='accepte'
363 except Chercheur
.DoesNotExist
:
366 return render(request
, "chercheurs/groupe_retrieve.html", {
368 'membres': membres_20
,
369 'plus_que_20': plus_que_20
,
370 'messages': messages
,
371 'est_chercheur': est_chercheur
,
372 'est_membre': est_membre
,
373 'est_membre_actif': est_membre_actif
,
377 def groupe_membres(request
, id):
378 groupe
= get_object_or_404(Groupe
, id=id)
379 membres
= groupe
.membership
.all() \
380 .filter(statut
='accepte').order_by('chercheur__nom')
382 return render(request
, "chercheurs/groupe_membres.html", {
388 def groupe_messages(request
, id):
389 groupe
= get_object_or_404(Groupe
, id=id)
391 est_chercheur
, est_membre
, est_membre_actif
= False, False, False
392 if request
.user
.is_authenticated():
394 chercheur
= Chercheur
.objects
.get(courriel
=request
.user
.email
)
396 est_membre
= chercheur
in groupe
.membres
.all()
397 est_membre_actif
= bool(len(groupe
.membership
.filter(
398 chercheur
=chercheur
, statut
='accepte'
400 except Chercheur
.DoesNotExist
:
403 if est_membre_actif
and request
.method
== 'POST':
404 form
= MessageForm(request
.POST
)
406 message
= form
.save(commit
=False)
407 message
.groupe
= groupe
408 message
.chercheur
= chercheur
416 messages
= groupe
.message_set
.all()
418 return render(request
, "chercheurs/groupe_message.html", {
420 'messages': messages
,
422 'est_chercheur': est_chercheur
,
423 'est_membre': est_membre
,
424 'est_membre_actif': est_membre_actif
,