Commit | Line | Data |
---|---|---|
932eef9a | 1 | # -*- encoding: utf-8 -*- |
a7b16ec9 | 2 | import hashlib |
932eef9a | 3 | from django import forms |
fa6a2a07 | 4 | from django.contrib.auth.forms import AuthenticationForm as DjangoAuthenticationForm |
3efbacbe | 5 | from django.db.models import Q |
ee8b3a49 | 6 | from django.forms.models import inlineformset_factory |
fbcbdde0 | 7 | from itertools import chain |
932eef9a | 8 | from models import * |
13146d99 | 9 | |
e229761e | 10 | OUI_NON_CHOICES = ((True, 'Oui'), (False, 'Non')) |
c073c94d | 11 | |
932eef9a | 12 | class ChercheurForm(forms.ModelForm): |
a7b16ec9 | 13 | """Formulaire d'édition d'un chercheur.""" |
13ec4813 | 14 | genre = forms.ChoiceField(widget=forms.RadioSelect(), choices=GENRE_CHOICES) |
165da916 EMS |
15 | afficher_courriel = forms.ChoiceField( |
16 | label="Afficher mon courriel publiquement sur ce site", | |
17 | choices=OUI_NON_CHOICES, widget=forms.RadioSelect() | |
18 | ) | |
a7b16ec9 | 19 | membre_instance_auf = forms.ChoiceField( |
a7b16ec9 | 20 | label="Êtes-vous (ou avez-vous déjà été) membre d'une instance de l'AUF?", |
c073c94d | 21 | choices=OUI_NON_CHOICES, widget=forms.RadioSelect() |
a7b16ec9 | 22 | ) |
bc15119b EMS |
23 | membre_instance_auf_nom = forms.ChoiceField( |
24 | choices = (('', '---------'),) + Chercheur.INSTANCE_AUF_CHOICES, | |
25 | label="Préciser laquelle", required=False | |
26 | ) | |
27 | membre_instance_auf_fonction = forms.CharField(label="Préciser votre fonction", required=False) | |
a7b16ec9 | 28 | membre_instance_auf_dates = forms.CharField(label="Préciser les dates", required=False) |
614b3269 EMS |
29 | expert_oif = forms.ChoiceField(label="Avez-vous déjà été sollicité par l'OIF?", choices=OUI_NON_CHOICES, widget=forms.RadioSelect()) |
30 | expert_oif_details = forms.CharField(label="Préciser à quel titre", required=False, | |
31 | help_text="Fonction dans l'organisation, participation à une étude ou à une action, etc.") | |
32 | expert_oif_dates = forms.CharField(label="Préciser les dates", required=False) | |
c073c94d EMS |
33 | membre_association_francophone = forms.ChoiceField( |
34 | label="Êtes-vous membre d'une association ou d'une société savante francophone?", | |
35 | help_text="e.g. FIPF, Collège international de philosophie, AISLF, etc.", | |
36 | choices=OUI_NON_CHOICES, widget=forms.RadioSelect() | |
37 | ) | |
38 | membre_association_francophone_details = forms.CharField(label="Préciser laquelle", required=False) | |
39 | membre_reseau_institutionnel = forms.ChoiceField( | |
9553bf2d | 40 | label="Êtes-vous (ou avez-vous déjà été) membre des instances d'un réseau institutionnel de l'AUF?", |
c073c94d EMS |
41 | choices=OUI_NON_CHOICES, widget=forms.RadioSelect() |
42 | ) | |
bc15119b EMS |
43 | membre_reseau_institutionnel_nom = forms.ChoiceField( |
44 | label="Préciser le réseau institutionnel", | |
45 | choices=(('', '---------'),) + Chercheur.RESEAU_INSTITUTIONNEL_CHOICES, | |
46 | required=False | |
47 | ) | |
48 | membre_reseau_institutionnel_fonction = forms.CharField(required=False, label="Préciser votre fonction") | |
c073c94d EMS |
49 | membre_reseau_institutionnel_dates = forms.CharField(required=False, label="Préciser les dates") |
50 | ||
e836f6f7 | 51 | pays_etablissement = forms.ModelChoiceField(label="Pays de l'établissement", queryset=Pays.objects.all(), required=True) |
593412b3 EMS |
52 | etablissement = forms.CharField( |
53 | label="Nom de l'établissement", required=True, | |
54 | help_text="Après avoir sélectionné un pays, une liste d'établissement apparaît dès la saisie partielle du nom de l'établissement." | |
55 | ) | |
a7b16ec9 | 56 | |
1d6fac5f EMS |
57 | pas_de_sollicitation_expertises = forms.BooleanField( |
58 | required=False, | |
59 | label="Je ne souhaite pas être sollicité par l'AUF pour des missions d'expertise" | |
cb591fb3 EMS |
60 | ) |
61 | ||
332975c3 EMS |
62 | theme_recherche = forms.CharField( |
63 | max_length=1000, label='Thèmes de recherche', help_text='1000 signes maximum', | |
70534a94 | 64 | error_messages=dict(max_length="Veuillez entrer au maximum %(limit_value)d signes (vous en avez entré %(show_value)d)."), |
332975c3 EMS |
65 | widget=forms.Textarea() |
66 | ) | |
0874e7d1 EMS |
67 | attestation = forms.BooleanField( |
68 | required=True, | |
69 | label="J'atteste sur l'honneur l'exactitude des renseignements fournis sur le formulaire d'inscription et j'accepte leur publication en ligne." | |
70 | ) | |
593412b3 EMS |
71 | discipline = forms.ModelChoiceField( |
72 | label="Discipline", required=True, | |
73 | queryset=Discipline.objects.all(), | |
74 | help_text="La liste des disciplines procède d'un choix fait par le conseil scientifique de l'AUF." | |
75 | ) | |
35b0778c PP |
76 | equipe_recherche = forms.CharField( |
77 | max_length=255, label='Équipe de recherche', required=False, | |
78 | help_text="Indiquer l'appartenance à une équipe de recherche universitaire ou laboratoire ou groupement inter-universitaire" | |
593412b3 EMS |
79 | ) |
80 | url_site_web = forms.URLField( | |
81 | label='Adresse site Internet', required=False, | |
82 | help_text="Si vous le souhaitez, vous pouvez y indiquer le lien qui renvoie vers une page personnelle (sur le site de votre établissement par exemple) plus complète." | |
83 | ) | |
332975c3 | 84 | |
932eef9a AJ |
85 | class Meta: |
86 | model = Chercheur | |
a00480ad | 87 | fields = ('nom', 'prenom', 'genre', 'courriel', 'afficher_courriel', 'adresse_postale', 'telephone', |
0a379c77 | 88 | 'statut', 'diplome', |
35b0778c | 89 | 'discipline', 'theme_recherche', 'equipe_recherche', |
bc15119b EMS |
90 | 'mots_cles', 'url_site_web', 'url_blog', |
91 | 'url_reseau_social', 'attestation', 'membre_instance_auf', | |
92 | 'membre_instance_auf_nom', 'membre_instance_auf_fonction', | |
219710da EMS |
93 | 'membre_instance_auf_dates', 'expert_oif', |
94 | 'expert_oif_details', 'expert_oif_dates', | |
614b3269 EMS |
95 | 'membre_association_francophone', |
96 | 'membre_association_francophone_details', | |
219710da | 97 | 'membre_reseau_institutionnel', |
bc15119b EMS |
98 | 'membre_reseau_institutionnel_nom', |
99 | 'membre_reseau_institutionnel_fonction', | |
1d6fac5f | 100 | 'membre_reseau_institutionnel_dates') |
7c596de2 | 101 | |
219710da EMS |
102 | def __init__(self, data=None, prefix=None, instance=None): |
103 | if instance is not None: | |
104 | initial = {} | |
105 | if instance.etablissement: | |
106 | initial['etablissement'] = instance.etablissement.nom | |
107 | initial['pays_etablissement'] = instance.etablissement.pays_id | |
108 | else: | |
109 | initial['etablissement'] = instance.etablissement_autre_nom | |
110 | initial['pays_etablissement'] = instance.etablissement_autre_pays_id | |
1d6fac5f | 111 | initial['pas_de_sollicitation_expertises'] = not instance.expertises_auf |
219710da EMS |
112 | else: |
113 | initial = None | |
114 | super(ChercheurForm, self).__init__(data=data, prefix=prefix, instance=instance, initial=initial) | |
115 | ||
116 | def save(self): | |
117 | nom_etablissement = self.cleaned_data['etablissement'] | |
118 | pays_etablissement = self.cleaned_data['pays_etablissement'] | |
e76f8899 EMS |
119 | etablissements = Etablissement.objects.filter(nom=nom_etablissement, pays=pays_etablissement, actif=True) |
120 | if etablissements.count() > 0: | |
121 | self.instance.etablissement = etablissements[0] | |
219710da EMS |
122 | self.instance.etablissement_autre = '' |
123 | self.instance.etablissement_autre_pays = None | |
e76f8899 | 124 | else: |
219710da EMS |
125 | self.instance.etablissement = None |
126 | self.instance.etablissement_autre_nom = nom_etablissement | |
127 | self.instance.etablissement_autre_pays = pays_etablissement | |
1d6fac5f | 128 | self.instance.expertises_auf = not self.cleaned_data['pas_de_sollicitation_expertises'] |
219710da EMS |
129 | super(ChercheurForm, self).save() |
130 | ||
13ec4813 EMS |
131 | def clean_courriel(self): |
132 | """On veut s'assurer qu'il n'y ait pas d'autre utilisateur actif | |
133 | avec le même courriel.""" | |
134 | courriel = self.cleaned_data['courriel'] | |
135 | existing = Chercheur.objects.filter(courriel=courriel, actif=True) | |
136 | if self.instance and self.instance.id: | |
137 | existing = existing.exclude(id=self.instance.id) | |
b9b3e6ba PP |
138 | |
139 | else: | |
140 | # Nouveau chercheur | |
141 | user = User.objects.filter(is_active=True, email=courriel) | |
142 | if user.count(): | |
143 | raise forms.ValidationError('Il existe déjà une fiche pour cette adresse électronique') | |
144 | ||
13ec4813 EMS |
145 | if existing.count(): |
146 | raise forms.ValidationError('Il existe déjà une fiche pour cette adresse électronique') | |
147 | return courriel | |
165da916 EMS |
148 | |
149 | def clean_afficher_courriel(self): | |
e229761e | 150 | return self.cleaned_data['afficher_courriel'] == 'True' |
165da916 | 151 | |
c073c94d | 152 | def clean_membre_instance_auf(self): |
e229761e | 153 | return self.cleaned_data['membre_instance_auf'] == 'True' |
c073c94d | 154 | |
bc15119b | 155 | def clean_membre_instance_auf_nom(self): |
614b3269 | 156 | membre = self.cleaned_data.get('membre_instance_auf') |
bc15119b EMS |
157 | nom = self.cleaned_data.get('membre_instance_auf_nom') |
158 | if membre and not nom: | |
614b3269 | 159 | raise forms.ValidationError('Veuillez préciser') |
bc15119b EMS |
160 | return nom |
161 | ||
162 | def clean_membre_instance_auf_fonction(self): | |
163 | membre = self.cleaned_data.get('membre_instance_auf') | |
164 | fonction = self.cleaned_data.get('membre_instance_auf_fonction') | |
165 | if membre and not fonction: | |
166 | raise forms.ValidationError('Veuillez préciser') | |
167 | return fonction | |
614b3269 | 168 | |
c073c94d EMS |
169 | def clean_membre_instance_auf_dates(self): |
170 | membre = self.cleaned_data.get('membre_instance_auf') | |
171 | dates = self.cleaned_data.get('membre_instance_auf_dates') | |
172 | if membre and not dates: | |
173 | raise forms.ValidationError('Veuillez préciser les dates') | |
174 | return dates | |
175 | ||
176 | def clean_expert_oif(self): | |
e229761e | 177 | return self.cleaned_data['expert_oif'] == 'True' |
c073c94d | 178 | |
614b3269 EMS |
179 | def clean_expert_oif_details(self): |
180 | expert = self.cleaned_data.get('expert_oif') | |
181 | details = self.cleaned_data.get('expert_oif_details') | |
182 | if expert and not details: | |
183 | raise forms.ValidationError('Veuillez préciser') | |
184 | return details | |
185 | ||
186 | def clean_expert_oif_dates(self): | |
187 | expert = self.cleaned_data.get('expert_oif') | |
188 | dates = self.cleaned_data.get('expert_oif_dates') | |
189 | if expert and not dates: | |
190 | raise forms.ValidationError('Veuillez préciser les dates') | |
191 | return dates | |
192 | ||
c073c94d | 193 | def clean_membre_association_francophone(self): |
e229761e | 194 | return self.cleaned_data['membre_association_francophone'] == 'True' |
c073c94d EMS |
195 | |
196 | def clean_membre_association_francophone_details(self): | |
197 | membre = self.cleaned_data.get('membre_association_francophone') | |
198 | details = self.cleaned_data.get('membre_association_francophone_details') | |
199 | if membre and not details: | |
200 | raise forms.ValidationError('Veuillez préciser') | |
201 | return details | |
202 | ||
203 | def clean_membre_reseau_institutionnel(self): | |
e229761e | 204 | return self.cleaned_data['membre_reseau_institutionnel'] == 'True' |
c073c94d | 205 | |
bc15119b | 206 | def clean_membre_reseau_institutionnel_nom(self): |
c073c94d | 207 | membre = self.cleaned_data.get('membre_reseau_institutionnel') |
bc15119b EMS |
208 | nom = self.cleaned_data.get('membre_reseau_institutionnel_nom') |
209 | if membre and not nom: | |
c073c94d | 210 | raise forms.ValidationError('Veuillez préciser') |
bc15119b EMS |
211 | return nom |
212 | ||
213 | def clean_membre_reseau_institutionnel_fonction(self): | |
214 | membre = self.cleaned_data.get('membre_reseau_institutionnel') | |
215 | fonction = self.cleaned_data.get('membre_reseau_institutionnel_fonction') | |
216 | if membre and not fonction: | |
217 | raise forms.ValidationError('Veuillez préciser') | |
218 | return fonction | |
c073c94d EMS |
219 | |
220 | def clean_membre_reseau_institutionnel_dates(self): | |
221 | membre = self.cleaned_data.get('membre_reseau_institutionnel') | |
222 | dates = self.cleaned_data.get('membre_reseau_institutionnel_dates') | |
223 | if membre and not dates: | |
224 | raise forms.ValidationError('Veuillez préciser les dates') | |
225 | return dates | |
226 | ||
13ec4813 | 227 | class ChercheurInscriptionForm(ChercheurForm): |
13ec4813 EMS |
228 | |
229 | class Meta(ChercheurForm.Meta): | |
a00480ad PP |
230 | pass |
231 | #fields = ChercheurForm.Meta.fields + ('courriel',) | |
13ec4813 | 232 | |
a7b16ec9 | 233 | class GroupesForm(forms.Form): |
5b55252d PP |
234 | """Formulaire qui associe des domaines de recherche et groupe de chercheur à un chercheur.""" |
235 | domaines_recherche = forms.ModelMultipleChoiceField( | |
236 | queryset=Groupe.domaine_recherche_objects.all(), | |
e4d01d1d | 237 | label='Domaines de recherche', required=False, |
593412b3 | 238 | help_text="Ce champ est proposé à titre d'indication complémentaire, mais il n'est pas obligatoire. Maintenez appuyé « Ctrl », ou « Commande (touche pomme) » sur un Mac, pour en sélectionner plusieurs." |
e4d01d1d | 239 | ) |
a7b16ec9 | 240 | |
261fd840 PP |
241 | #groupes_chercheur = forms.ModelMultipleChoiceField( |
242 | # queryset=Groupe.groupe_chercheur_objects.all(), | |
243 | # label='Communautés de chercheurs', required=False, | |
244 | # help_text="Adhérez à un ou plusieurs communautés de chercheurs. Votre demande doit être approuvée par le gestionnaire de communauté.<br><br>Ce champ est proposé à titre d'indication complémentaire, mais il n'est pas obligatoire. Maintenez appuyé « Ctrl », ou « Commande (touche pomme) » sur un Mac, pour en sélectionner plusieurs." | |
245 | #) | |
5b55252d | 246 | |
a7b16ec9 EMS |
247 | def __init__(self, data=None, prefix=None, chercheur=None): |
248 | self.chercheur = chercheur | |
249 | initial = {} | |
250 | if chercheur: | |
5b55252d | 251 | initial['domaines_recherche'] = chercheur.domaines_recherche.values_list('id', flat=True) |
261fd840 | 252 | #initial['groupes_chercheur'] = chercheur.groupes_chercheur.values_list('id', flat=True) |
a7b16ec9 EMS |
253 | super(GroupesForm, self).__init__(data=data, prefix=prefix, initial=initial) |
254 | ||
255 | def save(self): | |
256 | if self.is_valid(): | |
5b55252d | 257 | domaines_recherche = self.cleaned_data['domaines_recherche'] |
18407f73 | 258 | AdhesionGroupe.objects.filter(chercheur=self.chercheur).exclude(groupe__groupe_chercheur=True).exclude(groupe__in=domaines_recherche).delete() |
5b55252d | 259 | for dr in domaines_recherche: |
18407f73 | 260 | adhesion, created = AdhesionGroupe.objects.get_or_create(chercheur=self.chercheur, groupe=dr) |
d1fec99c | 261 | if created: |
18407f73 PP |
262 | adhesion.actif = 1 |
263 | adhesion.save() | |
5b55252d | 264 | |
261fd840 PP |
265 | #groupes_chercheur = self.cleaned_data['groupes_chercheur'] |
266 | #AdhesionGroupe.objects.filter(chercheur=self.chercheur).exclude(groupe__groupe_chercheur=False).exclude(groupe__in=groupes_chercheur).delete() | |
267 | #for gc in groupes_chercheur: | |
268 | # adhesion, created = AdhesionGroupe.objects.get_or_create(chercheur=self.chercheur, groupe=gc) | |
269 | # if created: | |
270 | # adhesion.actif = 0 | |
271 | # adhesion.save() | |
a7b16ec9 | 272 | |
00755d9b AJ |
273 | class PublicationForm(forms.ModelForm): |
274 | class Meta: | |
275 | model = Publication | |
3eb41a6d | 276 | fields = ('auteurs', 'titre', 'revue', 'annee', 'editeur', 'lieu_edition', 'nb_pages', 'url') |
f810842d | 277 | |
595ab4d6 EMS |
278 | PublicationFormSet = inlineformset_factory(Chercheur, Publication, form=PublicationForm, extra=1) |
279 | ||
280 | class TheseForm(forms.ModelForm): | |
e8e9e4fd | 281 | class Meta: |
595ab4d6 EMS |
282 | model = These |
283 | fields = ('titre', 'annee', 'directeur', 'etablissement', 'nb_pages', 'url') | |
2a36714f | 284 | |
5b9abc81 | 285 | class ExpertiseForm(forms.ModelForm): |
c073c94d EMS |
286 | organisme_demandeur_visible = forms.ChoiceField( |
287 | label="Voulez-vous que l'organisme demandeur soit visible sur votre fiche?", | |
288 | choices=OUI_NON_CHOICES, widget=forms.RadioSelect(), required=False | |
289 | ) | |
e229761e EMS |
290 | nom = forms.CharField(label="Objet de l'expertise", required=False) |
291 | ||
5b9abc81 AJ |
292 | class Meta: |
293 | model = Expertise | |
294 | fields = ('nom', 'date', 'organisme_demandeur', 'organisme_demandeur_visible') | |
dab519fa | 295 | |
b16bcbaf | 296 | def clean_organisme_demandeur_visible(self): |
6504a7e5 | 297 | value = self.cleaned_data['organisme_demandeur_visible'] |
e229761e | 298 | return value == 'True' |
b16bcbaf | 299 | |
ee8b3a49 EMS |
300 | ExpertiseFormSet = inlineformset_factory(Chercheur, Expertise, form=ExpertiseForm, extra=1) |
301 | ||
a7b16ec9 EMS |
302 | class ChercheurFormGroup(object): |
303 | """Groupe de formulaires nécessaires pour l'inscription et l'édition | |
304 | d'un chercheur.""" | |
00755d9b | 305 | |
a7b16ec9 | 306 | def __init__(self, data=None, chercheur=None): |
e61eecfe EMS |
307 | try: |
308 | these = chercheur and chercheur.these | |
309 | except These.DoesNotExist: | |
310 | these = These() | |
43ed73e7 | 311 | chercheur_form_class = ChercheurInscriptionForm if chercheur is None else ChercheurForm |
13ec4813 | 312 | self.chercheur = chercheur_form_class(data=data, prefix='chercheur', instance=chercheur) |
a7b16ec9 | 313 | self.groupes = GroupesForm(data=data, prefix='chercheur', chercheur=chercheur) |
ee8b3a49 | 314 | self.expertises = ExpertiseFormSet(data=data, prefix='expertise', instance=chercheur) |
e61eecfe | 315 | self.these = TheseForm(data=data, prefix='these', instance=these) |
595ab4d6 | 316 | self.publications = PublicationFormSet(data=data, prefix='publication', instance=chercheur) |
a7b16ec9 EMS |
317 | |
318 | @property | |
319 | def has_errors(self): | |
13ec4813 EMS |
320 | return bool(self.chercheur.errors or self.groupes.errors or |
321 | self.these.errors or self.publications.errors or | |
322 | self.expertises.errors) | |
a7b16ec9 EMS |
323 | |
324 | def is_valid(self): | |
13ec4813 EMS |
325 | return self.chercheur.is_valid() and self.groupes.is_valid() and \ |
326 | self.these.is_valid() and self.publications.is_valid() and \ | |
327 | self.expertises.is_valid() | |
a7b16ec9 EMS |
328 | |
329 | def save(self): | |
330 | if self.is_valid(): | |
331 | ||
13ec4813 | 332 | # Enregistrer d'abord le chercheur lui-même. |
a7b16ec9 EMS |
333 | self.chercheur.save() |
334 | ||
595ab4d6 EMS |
335 | # Puis les objets qui ont des clés étrangères vers nous |
336 | # puisqu'on a besoin d'un id. | |
13ec4813 | 337 | chercheur = self.chercheur.instance |
a7b16ec9 EMS |
338 | self.groupes.chercheur = chercheur |
339 | self.groupes.save() | |
595ab4d6 EMS |
340 | self.these.instance.chercheur = chercheur |
341 | self.these.save() | |
342 | self.publications.instance = chercheur | |
343 | self.publications.save() | |
3820b46e | 344 | self.expertises.instance = chercheur |
e229761e EMS |
345 | for expertise in self.expertises.save(commit=False): |
346 | if expertise.nom: | |
347 | expertise.save() | |
348 | elif expertise.id: | |
349 | expertise.delete() | |
43ed73e7 | 350 | return self.chercheur.instance |
5b9abc81 | 351 | |
cdaadee3 PP |
352 | class GroupeSearchForm(forms.ModelForm): |
353 | """Formulaire de recherche pour les groupes.""" | |
354 | ||
355 | class Meta: | |
356 | model = GroupeSearch | |
357 | fields = ['q'] | |
358 | ||
fdcf5874 EMS |
359 | class ChercheurSearchForm(forms.ModelForm): |
360 | """Formulaire de recherche pour les chercheurs.""" | |
361 | ||
362 | class Meta: | |
363 | model = ChercheurSearch | |
79a90694 | 364 | fields = ['q', 'nom_chercheur', 'domaine', |
35b0778c PP |
365 | 'statut', 'discipline', 'pays', 'region', 'nord_sud', |
366 | 'activites_francophonie', 'genre'] | |
fdcf5874 EMS |
367 | |
368 | class ChercheurSearchEditForm(ChercheurSearchForm): | |
369 | """Formulaire d'édition d'une recherche sauvegardée.""" | |
370 | ||
371 | class Meta(ChercheurSearchForm.Meta): | |
4b89a7df | 372 | fields = ['nom', 'alerte_courriel'] + ChercheurSearchForm.Meta.fields |
fdcf5874 | 373 | |
0e9597af | 374 | class SendPasswordForm(forms.Form): |
89da853e | 375 | email = forms.EmailField(required=True, label="Adresse électronique") |
0e9597af AJ |
376 | def clean_email(self): |
377 | cleaned_data = self.cleaned_data | |
378 | email = cleaned_data.get("email") | |
379 | if email: | |
380 | try: | |
13ec4813 | 381 | Personne.objects.get(courriel=email) |
0e9597af | 382 | except: |
89da853e | 383 | raise forms.ValidationError("Cette adresse n'existe pas dans notre base de données.") |
e427f068 AJ |
384 | return email |
385 | ||
43ed73e7 | 386 | class SetPasswordForm(forms.Form): |
e427f068 | 387 | password = forms.CharField(widget=forms.PasswordInput(), required=True, label="Mot de passe") |
43ed73e7 | 388 | password_repeat = forms.CharField(widget=forms.PasswordInput(), required=True, label="Confirmez votre mot de passe") |
92990258 | 389 | |
e427f068 AJ |
390 | def clean_password_repeat(self): |
391 | cleaned_data = self.cleaned_data | |
392 | password = cleaned_data.get("password") | |
393 | password_repeat = cleaned_data.get("password_repeat") | |
394 | if password and password_repeat: | |
395 | if password != password_repeat: | |
396 | raise forms.ValidationError("Les mots de passe ne concordent pas") | |
397 | return password_repeat | |
fa6a2a07 EMS |
398 | |
399 | class AuthenticationForm(DjangoAuthenticationForm): | |
400 | username = forms.CharField(label='Courriel') | |
fdcf5874 | 401 | |
fd6352ea PP |
402 | |
403 | class MessageForm(forms.ModelForm): | |
404 | ||
405 | class Meta: | |
406 | model = Message | |
407 | exclude = ('chercheur', 'groupe') | |
1fd4a630 PP |
408 | |
409 | # Admin views | |
410 | ||
411 | class CGStatutForm(forms.Form): | |
412 | statut = forms.ChoiceField(choices=CG_STATUT_CHOICES) | |
413 |