Responsables devient Gestionnaire de communauté
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / chercheurs / views.py
CommitLineData
588d6b93 1# -*- encoding: utf-8 -*-
518d0b44 2from chercheurs.decorators import chercheur_required
fd6352ea 3from chercheurs.forms import ChercheurSearchForm, SetPasswordForm, ChercheurFormGroup, AuthenticationForm, GroupeSearchForm, MessageForm
18407f73 4from chercheurs.models import Chercheur, Groupe, Message, AdhesionGroupe
695930dd 5from chercheurs.utils import get_django_user_for_email
fdcf5874 6from datamaster_modeles.models import Etablissement, Region
fa6a2a07 7from django.conf import settings
932eef9a 8from django.shortcuts import render_to_response
fdcf5874 9from django.http import HttpResponseRedirect, HttpResponse, HttpResponseForbidden, HttpResponseNotFound
932eef9a 10from django.template import Context, RequestContext
e427f068 11from django.template.loader import get_template
51515982 12from django.core.urlresolvers import reverse as url
0e9597af 13from django.core.mail import send_mail
fa6a2a07
EMS
14from django.contrib.auth import REDIRECT_FIELD_NAME
15from django.contrib.auth import login as auth_login
fdcf5874 16from django.contrib.auth.decorators import login_required
fa6a2a07 17from django.contrib.sites.models import RequestSite, Site
219710da 18from django.utils import simplejson
43ed73e7 19from django.utils.http import int_to_base36, base36_to_int
a7b16ec9 20from django.views.decorators.cache import never_cache
72923b8e 21from django.contrib.auth import authenticate, login
3eb00212 22from django.shortcuts import get_object_or_404
fdcf5874 23from savoirs.models import PageStatique, Discipline
510b5321 24
9aa1d783 25
f0692c02 26def index(request):
f8c16b3d 27 """Répertoire des chercheurs"""
fdcf5874
EMS
28 search_form = ChercheurSearchForm(request.GET)
29 search = search_form.save(commit=False)
30 chercheurs = search.run().select_related('etablissement')
7020ea3d
EMS
31 sort = request.GET.get('tri')
32 if sort is not None and sort.endswith('_desc'):
33 sort = sort[:-5]
34 direction = '-'
35 else:
36 direction = ''
37 if sort == 'nom':
acd5cd8f 38 chercheurs = chercheurs.order_by_nom(direction)
7020ea3d 39 elif sort == 'etablissement':
acd5cd8f 40 chercheurs = chercheurs.order_by_etablissement(direction)
7020ea3d 41 elif sort == 'pays':
acd5cd8f 42 chercheurs = chercheurs.order_by_pays(direction)
7020ea3d
EMS
43 else:
44 chercheurs = chercheurs.order_by('-date_modification')
f09bc1c6
EMS
45
46 try:
47 p = PageStatique.objects.get(id='repertoire')
48 entete = p.contenu
49 except PageStatique.DoesNotExist:
50 entete = u'<h1>Répertoire des chercheurs</h1>'
7020ea3d 51
9f7c169e 52 nb_chercheurs = chercheurs.count()
fdcf5874 53
3efbacbe 54 return render_to_response("chercheurs/index.html",
f09bc1c6
EMS
55 dict(chercheurs=chercheurs, nb_chercheurs=nb_chercheurs,
56 search_form=search_form, entete=entete),
3efbacbe 57 context_instance=RequestContext(request))
588d6b93 58
f0692c02 59def inscription(request):
932eef9a 60 if request.method == 'POST':
a7b16ec9
EMS
61 forms = ChercheurFormGroup(request.POST)
62 if forms.is_valid():
43ed73e7
EMS
63 chercheur = forms.save()
64 id_base36 = int_to_base36(chercheur.id)
65 token = chercheur.activation_token()
66 template = get_template('chercheurs/activation_email.txt')
67 domain = RequestSite(request).domain
68 message = template.render(Context(dict(chercheur=chercheur, id_base36=id_base36, token=token, domain=domain)))
69 send_mail('Votre inscription à Savoirs en partage', message, None, [chercheur.courriel])
70 return HttpResponseRedirect(url('chercheurs-inscription-faite'))
932eef9a 71 else:
a7b16ec9 72 forms = ChercheurFormGroup()
932eef9a 73
a7b16ec9
EMS
74 return render_to_response("chercheurs/inscription.html",
75 dict(forms=forms),
76 context_instance=RequestContext(request))
9af73c99 77
43ed73e7
EMS
78def activation(request, id_base36, token):
79 """Activation d'un chercheur"""
80 id = base36_to_int(id_base36)
3e556e66 81 chercheur = get_object_or_404(Chercheur.all_objects, id=id)
43ed73e7
EMS
82 if token == chercheur.activation_token():
83 validlink = True
84 if request.method == 'POST':
85 form = SetPasswordForm(request.POST)
86 if form.is_valid():
87 password = form.cleaned_data['password']
88 email = chercheur.courriel
89 chercheur.actif = True
90 chercheur.save()
695930dd
EMS
91 user = get_django_user_for_email(email)
92 user.set_password(password)
93 user.save()
43ed73e7
EMS
94
95 # Auto-login
3e556e66 96 auth_login(request, authenticate(username=email, password=password))
43ed73e7
EMS
97 return HttpResponseRedirect(url('chercheurs.views.perso'))
98 else:
99 form = SetPasswordForm()
100 else:
101 form = None
102 validlink = False
103 return render_to_response('chercheurs/activation.html', dict(form=form, validlink=validlink),
104 context_instance=RequestContext(request))
105
518d0b44 106@chercheur_required
8baa2a56
EMS
107def desinscription(request):
108 """Désinscription du chercheur"""
518d0b44 109 chercheur = request.chercheur
8baa2a56
EMS
110 if request.method == 'POST':
111 if request.POST.get('confirmer'):
13ec4813
EMS
112 chercheur.actif = False
113 chercheur.save()
8baa2a56
EMS
114 request.flash['message'] = "Vous avez été désinscrit du répertoire des chercheurs."
115 return HttpResponseRedirect(url('django.contrib.auth.views.logout'))
116 else:
117 request.flash['message'] = "Opération annulée."
118 return HttpResponseRedirect(url('chercheurs.views.perso'))
119 return render_to_response("chercheurs/desinscription.html", {},
120 context_instance=RequestContext(request))
121
518d0b44 122@chercheur_required
a7b16ec9 123@never_cache
f0692c02 124def edit(request):
b3e1079e 125 """Edition d'un chercheur"""
518d0b44 126 chercheur = request.chercheur
b3e1079e 127 if request.method == 'POST':
a7b16ec9
EMS
128 forms = ChercheurFormGroup(request.POST, chercheur=chercheur)
129 if forms.is_valid():
130 forms.save()
91112855
EMS
131 request.flash['message'] = "Votre fiche a bien été enregistrée."
132 return HttpResponseRedirect(url('chercheurs.views.perso'))
b3e1079e 133 else:
a7b16ec9 134 forms = ChercheurFormGroup(chercheur=chercheur)
b3e1079e 135
a7b16ec9
EMS
136 return render_to_response("chercheurs/edit.html",
137 dict(forms=forms, chercheur=chercheur),
595ab4d6 138 context_instance=RequestContext(request))
b3e1079e 139
518d0b44 140@chercheur_required
f0692c02 141def perso(request):
0d9d1c4d 142 """Espace chercheur (espace personnel du chercheur)"""
518d0b44 143 chercheur = request.chercheur
2a36714f 144 modification = request.GET.get('modification')
e4d01d1d
EMS
145 return render_to_response("chercheurs/perso.html",
146 dict(chercheur=chercheur, modification=modification),
518d0b44 147 context_instance=RequestContext(request))
da091176 148
f0692c02 149def retrieve(request, id):
da091176 150 """Fiche du chercheur"""
3eb00212 151 chercheur = get_object_or_404(Chercheur, id=id)
e4d01d1d
EMS
152 return render_to_response("chercheurs/retrieve.html",
153 dict(chercheur=chercheur),
c1b134f8 154 context_instance=RequestContext(request))
d9885bf7 155
f0692c02 156def conversion(request):
c1b134f8
EMS
157 return render_to_response("chercheurs/conversion.html", {},
158 context_instance=RequestContext(request))
8baa2a56 159
e836f6f7 160def etablissements_autocomplete(request, pays=None):
219710da 161 term = request.GET.get('term')
e76f8899 162 noms = Etablissement.objects.all().filter(membre=True, actif=True)
e836f6f7
EMS
163 for word in term.split():
164 noms = noms.filter(nom__icontains=word)
165 if pays:
166 noms = noms.filter(pays=pays)
167 noms = list(noms.values_list('nom', flat=True)[:20])
219710da
EMS
168 json = simplejson.dumps(noms)
169 return HttpResponse(json, mimetype='application/json')
fa6a2a07
EMS
170
171def login(request, template_name='registration/login.html', redirect_field_name=REDIRECT_FIELD_NAME):
172 "The Django login view, but using a custom form."
173 redirect_to = request.REQUEST.get(redirect_field_name, '')
174
175 if request.method == "POST":
176 form = AuthenticationForm(data=request.POST)
177 if form.is_valid():
178 # Light security check -- make sure redirect_to isn't garbage.
179 if not redirect_to or ' ' in redirect_to:
180 redirect_to = settings.LOGIN_REDIRECT_URL
181
182 # Heavier security check -- redirects to http://example.com should
183 # not be allowed, but things like /view/?param=http://example.com
184 # should be allowed. This regex checks if there is a '//' *before* a
185 # question mark.
186 elif '//' in redirect_to and re.match(r'[^\?]*//', redirect_to):
187 redirect_to = settings.LOGIN_REDIRECT_URL
188
189 # Okay, security checks complete. Log the user in.
190 auth_login(request, form.get_user())
191
192 if request.session.test_cookie_worked():
193 request.session.delete_test_cookie()
194
195 return HttpResponseRedirect(redirect_to)
196
197 else:
198 form = AuthenticationForm(request)
199 request.session.set_test_cookie()
200
201 if Site._meta.installed:
202 current_site = Site.objects.get_current()
203 else:
204 current_site = RequestSite(request)
205
206 return render_to_response(template_name, {
207 'form': form,
208 redirect_field_name: redirect_to,
209 'site': current_site,
210 'site_name': current_site.name,
211 }, context_instance=RequestContext(request))
212login = never_cache(login)
cdaadee3
PP
213
214# groupes
215def groupe_index(request):
216 search_form = GroupeSearchForm(request.GET)
217 search = search_form.save(commit=False)
218 groupes = search.run()
219 nb_resultats = groupes.count()
220 try:
221 p = PageStatique.objects.get(id='groupes')
222 entete = p.contenu
223 except PageStatique.DoesNotExist:
381cc09a
PP
224 entete = '<h1>Liste des groupes</h1>'
225
96316da7 226 est_chercheur, mesgroupes, messages = False, None, None
381cc09a 227 if request.user.is_authenticated():
6115dba0
PP
228 try:
229 chercheur = Chercheur.objects.get(courriel=request.user.email)
61c05759 230 mesgroupes = chercheur.groupes.all().filter(membership__statut='accepte')
96316da7
PP
231 messages = Message.objects.all().filter(groupe__in=mesgroupes)[:10]
232 est_chercheur = True
6115dba0 233 except Chercheur.DoesNotExist:
96316da7
PP
234 pass
235
236 return render_to_response("chercheurs/groupe_index.html", {
237 'search_form': search_form,
238 'groupes': groupes.order_by('nom'),
239 'nb_resultats': nb_resultats,
240 'entete': entete,
241 'mesgroupes': mesgroupes,
242 'messages': messages,
243 'est_chercheur': est_chercheur,
244 }, context_instance=RequestContext(request))
cdaadee3 245
0eb2476e
PP
246def groupe_adhesion(request, id):
247 try:
248 groupe = get_object_or_404(Groupe, id=id)
249 chercheur = Chercheur.objects.get(courriel=request.user.email)
18407f73 250 adhesion, created = AdhesionGroupe.objects.get_or_create(chercheur=chercheur, groupe=groupe)
0eb2476e 251 if created:
18407f73
PP
252 adhesion.actif = 0
253 adhesion.save()
0eb2476e
PP
254 except:
255 pass
256
257 return HttpResponseRedirect(url('groupe_retrieve', kwargs={'id': id}))
258
cdaadee3
PP
259def groupe_retrieve(request, id):
260 groupe = get_object_or_404(Groupe, id=id)
61c05759 261 membres = groupe.membership.all().filter(statut='accepte').order_by('-date_modification')
ddf7e62e
PP
262 plus_que_20 = True if membres.count() > 20 else False
263 membres_20 = membres[:20]
fd6352ea 264 messages = groupe.message_set.all()[:5]
0c0d997c 265
0eb2476e
PP
266 est_chercheur, est_membre, est_membre_actif = False, False, False
267 if request.user.is_authenticated():
268 try:
269 chercheur = Chercheur.objects.get(courriel=request.user.email)
270 est_chercheur = True
271 est_membre = chercheur in groupe.membres.all()
61c05759 272 est_membre_actif = bool(len(groupe.membership.filter(chercheur=chercheur, statut='accepte')))
0eb2476e
PP
273 except Chercheur.DoesNotExist:
274 pass
275
cdaadee3 276 return render_to_response(
0c0d997c
PP
277 "chercheurs/groupe_retrieve.html", {
278 'groupe': groupe,
ddf7e62e
PP
279 'membres': membres_20,
280 'plus_que_20': plus_que_20,
c8d6b979 281 'messages': messages,
0eb2476e
PP
282 'est_chercheur': est_chercheur,
283 'est_membre': est_membre,
284 'est_membre_actif': est_membre_actif,
0c0d997c 285 }, context_instance=RequestContext(request)
cdaadee3 286 )
c8d6b979 287
ddf7e62e
PP
288def groupe_membres(request, id):
289 groupe = get_object_or_404(Groupe, id=id)
61c05759 290 membres = groupe.membership.all().filter(statut='accepte').order_by('chercheur__nom')
ddf7e62e
PP
291
292 return render_to_response(
293 "chercheurs/groupe_membres.html", {
294 'groupe': groupe,
295 'membres': membres,
296 }, context_instance=RequestContext(request)
297 )
298
c8d6b979 299def groupe_messages(request, id):
fd6352ea
PP
300
301 groupe = get_object_or_404(Groupe, id=id)
302
9aa1d783
PP
303 est_chercheur, est_membre, est_membre_actif = False, False, False
304 if request.user.is_authenticated():
305 try:
306 chercheur = Chercheur.objects.get(courriel=request.user.email)
307 est_chercheur = True
308 est_membre = chercheur in groupe.membres.all()
61c05759 309 est_membre_actif = bool(len(groupe.membership.filter(chercheur=chercheur, statut='accepte')))
9aa1d783
PP
310 except Chercheur.DoesNotExist:
311 pass
312
313 if est_membre_actif and request.method == 'POST':
fd6352ea
PP
314 form = MessageForm(request.POST)
315 if form.is_valid():
fd6352ea
PP
316 message = form.save(commit=False)
317 message.groupe = groupe
318 message.chercheur = chercheur
319 message.save()
320
321 form = MessageForm()
322
323 else:
324 form = MessageForm()
325
326 messages = groupe.message_set.all()
327
328 return render_to_response(
329 "chercheurs/groupe_message.html", {
330 'groupe': groupe,
331 'messages': messages,
332 'form': form,
9aa1d783
PP
333 'est_chercheur': est_chercheur,
334 'est_membre': est_membre,
335 'est_membre_actif': est_membre_actif,
fd6352ea
PP
336 }, context_instance=RequestContext(request)
337 )