Afficher "oui" à côté du champ "Expert de l'OIF" sur la fiche du chercheur.
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / chercheurs / forms.py
CommitLineData
932eef9a 1# -*- encoding: utf-8 -*-
a7b16ec9 2import hashlib
932eef9a 3from django import forms
3efbacbe 4from django.db.models import Q
ee8b3a49 5from django.forms.models import inlineformset_factory
fbcbdde0 6from itertools import chain
932eef9a 7from models import *
13146d99 8
932eef9a 9class PersonneForm(forms.ModelForm):
c18af6bd 10 genre = forms.ChoiceField(widget=forms.RadioSelect(), choices=GENRE_CHOICES)
e4d01d1d 11
932eef9a 12 class Meta:
dab519fa 13 model = Utilisateur
e4d01d1d
EMS
14 fields = ('nom', 'prenom', 'courriel', 'genre')
15
16class PersonneInscriptionForm(PersonneForm):
17 password = forms.CharField(widget=forms.PasswordInput(), label="Mot de passe")
18
19 class Meta(PersonneForm.Meta):
dab519fa 20 fields = ('nom', 'prenom', 'courriel', 'password', 'genre')
5ecd9e43 21
a7b16ec9
EMS
22 def clean_password(self):
23 """Encrypter le mot de passe avant de le mettre dans la BD."""
24 return hashlib.md5(self.cleaned_data['password']).hexdigest()
932eef9a
AJ
25
26class ChercheurForm(forms.ModelForm):
a7b16ec9
EMS
27 """Formulaire d'édition d'un chercheur."""
28 OUI_NON_CHOICES = ((1, 'Oui'), (0, 'Non'))
1de0a686 29 ETABLISSEMENT_CHOICES = ((id, nom if len(nom) < 80 else nom[:80] + '...')
d84e8b50 30 for id, nom in Etablissement.objects.filter(membre=True).values_list('id', 'nom'))
a7b16ec9
EMS
31
32 membre_instance_auf = forms.ChoiceField(
33 choices=OUI_NON_CHOICES,
34 label="Êtes-vous (ou avez-vous déjà été) membre d'une instance de l'AUF?",
35 help_text="e.g. conseil scientifique, conseil associatif, commission régionale d'experts",
36 widget=forms.RadioSelect()
37 )
38 membre_instance_auf_dates = forms.CharField(label="Préciser les dates", required=False)
39 expert_oif = forms.ChoiceField(choices=OUI_NON_CHOICES,
40 label="Êtes-vous expert de l'OIF?",
41 widget=forms.RadioSelect())
42 membre_fipf = forms.ChoiceField(choices=OUI_NON_CHOICES,
43 label="Êtes-vous membre de la FIPF?",
44 widget=forms.RadioSelect())
45 membre_fipf_association = forms.CharField(label="Préciser le nom de votre association", required=False)
fbcbdde0 46 etablissement = forms.ChoiceField(label='Etablissement', required=False, choices=chain([('', '---------')], ETABLISSEMENT_CHOICES))
a7b16ec9 47
932eef9a
AJ
48 class Meta:
49 model = Chercheur
a7b16ec9
EMS
50 fields = ('statut', 'diplome', 'etablissement',
51 'etablissement_autre_nom', 'etablissement_autre_pays',
0b0fbbd7 52 'discipline', 'theme_recherche', 'groupe_recherche', 'mots_cles',
a7b16ec9
EMS
53 'url_site_web', 'url_blog', 'url_reseau_social',
54 'membre_instance_auf', 'membre_instance_auf_dates',
55 'expert_oif', 'membre_fipf', 'membre_fipf_association')
7c596de2 56
1de0a686 57 def clean_etablissement(self):
fbcbdde0
EMS
58 etablissement = self.cleaned_data['etablissement']
59 if etablissement:
60 return Etablissement.objects.get(id=etablissement)
1de0a686 61
a7b16ec9
EMS
62 def clean(self):
63 etablissement = self.cleaned_data['etablissement']
64 etablissement_autre_nom = self.cleaned_data['etablissement_autre_nom']
65 etablissement_autre_pays = self.cleaned_data['etablissement_autre_pays']
66 if not etablissement:
67 if not etablissement_autre_nom:
68 self._errors['etablissement'] = self.error_class([u"Vous devez renseigner l'établissement"])
69 elif not etablissement_autre_pays:
70 self._errors['etablissement_autre_pays'] = self.error_class([u"Vous devez renseigner le pays de l'établissement"])
71 return self.cleaned_data
72
73 def clean_membre_instance_auf(self):
74 """Transforme la valeur du champ en booléen"""
75 return bool(int(self.cleaned_data['membre_instance_auf']))
76
77 def clean_expert_oif(self):
78 """Transforme la valeur du champ en booléen"""
79 return bool(int(self.cleaned_data['expert_oif']))
80
81 def clean_membre_fipf(self):
82 """Transforme la valeur du champ en booléen"""
83 return bool(int(self.cleaned_data['membre_fipf']))
84
85class GroupesForm(forms.Form):
86 """Formulaire qui associe des groupes à un chercheur."""
e4d01d1d
EMS
87 groupes = forms.ModelMultipleChoiceField(
88 queryset=Groupe.objects.all(),
89 label='Domaines de recherche', required=False,
90 help_text="Maintenez appuyé « Ctrl », ou « Commande (touche pomme) » sur un Mac, pour en sélectionner plusieurs."
91 )
a7b16ec9
EMS
92
93 def __init__(self, data=None, prefix=None, chercheur=None):
94 self.chercheur = chercheur
95 initial = {}
96 if chercheur:
97 initial['groupes'] = chercheur.groupes.values_list('id', flat=True)
98 super(GroupesForm, self).__init__(data=data, prefix=prefix, initial=initial)
99
100 def save(self):
101 if self.is_valid():
102 groupes = self.cleaned_data['groupes']
103 ChercheurGroupe.objects.filter(chercheur=self.chercheur).exclude(groupe__in=groupes).delete()
104 for g in groupes:
105 ChercheurGroupe.objects.get_or_create(chercheur=self.chercheur, groupe=g, actif=1)
106
00755d9b
AJ
107class PublicationForm(forms.ModelForm):
108 class Meta:
109 model = Publication
5fb54817 110 fields = ('titre', 'revue', 'annee', 'editeur', 'lieu_edition', 'nb_pages', 'url')
f810842d
AJ
111
112class TheseForm(PublicationForm):
2a36714f 113 titre = forms.CharField(required=True, label="Titre de la thèse ou du mémoire")
a4e383ac 114 annee = forms.IntegerField(required=True, label="Année de soutenance (réalisée ou prévue)")
29f922e0
EMS
115 editeur = forms.CharField(required=True, label="Directeur de thèse")
116 lieu_edition = forms.CharField(required=True, label="Établissement de soutenance")
e8e9e4fd
AJ
117 class Meta:
118 model = Publication
2a36714f
AJ
119 fields = ('titre', 'annee', 'editeur', 'lieu_edition', 'nb_pages', 'url')
120
5b9abc81 121class ExpertiseForm(forms.ModelForm):
b16bcbaf
EMS
122 OUI_NON_CHOICES = ((1, 'Oui'), (0, 'Non'))
123 organisme_demandeur_visible = forms.ChoiceField(choices=OUI_NON_CHOICES,
6504a7e5 124 required=False,
b16bcbaf
EMS
125 label="Voulez-vous que l'organisme demandeur soit visible sur votre fiche?",
126 widget=forms.RadioSelect())
5b9abc81
AJ
127 class Meta:
128 model = Expertise
129 fields = ('nom', 'date', 'organisme_demandeur', 'organisme_demandeur_visible')
dab519fa 130
b16bcbaf
EMS
131 def clean_organisme_demandeur_visible(self):
132 """Transforme la valeur du champ en booléen"""
6504a7e5
EMS
133 value = self.cleaned_data['organisme_demandeur_visible']
134 return bool(int(value)) if value else False
b16bcbaf 135
ee8b3a49
EMS
136ExpertiseFormSet = inlineformset_factory(Chercheur, Expertise, form=ExpertiseForm, extra=1)
137
a7b16ec9
EMS
138class ChercheurFormGroup(object):
139 """Groupe de formulaires nécessaires pour l'inscription et l'édition
140 d'un chercheur."""
00755d9b 141
a7b16ec9 142 def __init__(self, data=None, chercheur=None):
e4d01d1d 143 personne_form_class = PersonneInscriptionForm if chercheur is None else PersonneForm
a7b16ec9
EMS
144 self.chercheur = ChercheurForm(data=data, prefix='chercheur', instance=chercheur)
145 self.groupes = GroupesForm(data=data, prefix='chercheur', chercheur=chercheur)
146 self.personne = personne_form_class(data=data, prefix='personne', instance=chercheur and chercheur.personne)
147 self.publication1 = PublicationForm(data=data, prefix='publication1', instance=chercheur and chercheur.publication1)
148 self.publication2 = PublicationForm(data=data, prefix='publication2', instance=chercheur and chercheur.publication2)
149 self.publication3 = PublicationForm(data=data, prefix='publication3', instance=chercheur and chercheur.publication3)
150 self.publication4 = PublicationForm(data=data, prefix='publication4', instance=chercheur and chercheur.publication4)
151 self.these = TheseForm(data=data, prefix='these', instance=chercheur and chercheur.these)
ee8b3a49 152 self.expertises = ExpertiseFormSet(data=data, prefix='expertise', instance=chercheur)
a7b16ec9
EMS
153
154 @property
155 def has_errors(self):
156 return bool(self.chercheur.errors or self.personne.errors or self.groupes.errors or
157 self.publication1.errors or self.publication2.errors or self.publication3.errors or
ee8b3a49 158 self.publication4.errors or self.these.errors or self.expertises.errors)
a7b16ec9
EMS
159
160 def is_valid(self):
161 return self.chercheur.is_valid() and self.personne.is_valid() and self.groupes.is_valid() and \
162 self.publication1.is_valid() and self.publication2.is_valid() and \
163 self.publication3.is_valid() and self.publication4.is_valid() and \
ee8b3a49 164 self.these.is_valid() and self.expertises.is_valid()
a7b16ec9
EMS
165
166 def save(self):
167 if self.is_valid():
168
169 chercheur = self.chercheur.instance
170
171 # Enregistrer d'abord les clés étrangères car on doit les stocker dans
172 # l'objet chercheur.
173 chercheur.personne = self.personne.save()
174 if self.publication1.cleaned_data['titre']:
175 chercheur.publication1 = self.publication1.save()
176 if self.publication2.cleaned_data['titre']:
177 chercheur.publication2 = self.publication2.save()
178 if self.publication3.cleaned_data['titre']:
179 chercheur.publication3 = self.publication3.save()
180 if self.publication4.cleaned_data['titre']:
181 chercheur.publication4 = self.publication4.save()
182 chercheur.these = self.these.save()
ee8b3a49 183 self.expertises.save()
a7b16ec9
EMS
184
185 # Puis enregistrer le chercheur lui-même.
186 self.chercheur.save()
187
188 # Puis les many-to-many puisqu'on a besoin d'un id.
189 self.groupes.chercheur = chercheur
190 self.groupes.save()
5b9abc81 191
13146d99 192class RepertoireSearchForm (forms.Form):
c56d992d 193 mots_cles = forms.CharField(required=False, label="Rechercher dans tous les champs")
3efbacbe 194 nom = forms.CharField(required=False, label="Nom")
0e9597af
AJ
195 discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Tous")
196 domaine = forms.ModelChoiceField(queryset=Groupe.objects.all(), required=False, label="Domaine de recherche", empty_label="Tous")
d087521a 197 groupe_recherche = forms.CharField(required=False, label="Groupe de recherche")
6bd49ff1 198 statut = forms.ChoiceField(choices=(('','Tous'),)+STATUT_CHOICES+(('expert','Expert'),), required=False, label="Statut")
62eece34
EMS
199 pays = forms.ModelChoiceField(queryset=Pays.objects.all(), required=False, label="Pays", empty_label="Tous")
200 region = forms.ModelChoiceField(queryset=Region.objects.all(), required=False, label="Région", empty_label="Toutes")
201 nord_sud = forms.ChoiceField(choices=(('', 'Tous'), ('Nord', 'Nord'), ('Sud', 'Sud')), required=False, label="Nord/Sud")
e9b0d630
EMS
202 membre_instance_auf = forms.BooleanField(required=False, label="Membre d'une instance de l'AUF")
203 expert_oif = forms.BooleanField(required=False, label="Expert de l'OIF")
204 membre_fipf = forms.BooleanField(required=False, label="Membre de la FIPF")
0e9597af 205
3efbacbe
EMS
206 def get_query_set(self):
207 qs = Chercheur.objects.all()
208 if self.is_valid():
209 nom = self.cleaned_data['nom']
210 if nom:
211 qs = qs.search_nom(nom)
3efbacbe
EMS
212 discipline = self.cleaned_data["discipline"]
213 if discipline:
214 qs = qs.filter(discipline=discipline)
215 domaine = self.cleaned_data["domaine"]
216 if domaine:
217 qs = qs.filter(groupes=domaine)
d087521a
EMS
218 groupe_recherche = self.cleaned_data['groupe_recherche']
219 if groupe_recherche:
220 for word in groupe_recherche.split():
221 qs = qs.filter(groupe_recherche__icontains=word)
3efbacbe
EMS
222 mots_cles = self.cleaned_data["mots_cles"]
223 if mots_cles:
224 qs = qs.search(mots_cles)
225 statut = self.cleaned_data["statut"]
226 if statut:
227 if statut == "expert":
ee8b3a49 228 qs = qs.exclude(expertises=None)
3efbacbe
EMS
229 else:
230 qs = qs.filter(statut=statut)
62eece34
EMS
231 pays = self.cleaned_data["pays"]
232 if pays:
233 qs = qs.filter(Q(etablissement__pays=pays) | Q(etablissement_autre_pays=pays))
234 region = self.cleaned_data['region']
235 if region:
236 qs = qs.filter(Q(etablissement__pays__region=region) | Q(etablissement_autre_pays__region=region))
237 nord_sud = self.cleaned_data['nord_sud']
238 if nord_sud:
239 qs = qs.filter(Q(etablissement__pays__nord_sud=nord_sud) | Q(etablissement_autre_pays__nord_sud=nord_sud))
e9b0d630
EMS
240 if self.cleaned_data['membre_instance_auf']:
241 qs = qs.filter(membre_instance_auf=True)
242 if self.cleaned_data['expert_oif']:
243 qs = qs.filter(expert_oif=True)
244 if self.cleaned_data['membre_fipf']:
245 qs = qs.filter(membre_fipf=True)
3efbacbe
EMS
246 return qs
247
0e9597af 248class SendPasswordForm(forms.Form):
89da853e 249 email = forms.EmailField(required=True, label="Adresse électronique")
0e9597af
AJ
250 def clean_email(self):
251 cleaned_data = self.cleaned_data
252 email = cleaned_data.get("email")
253 if email:
254 try:
255 Utilisateur.objects.get(courriel=email)
256 except:
89da853e 257 raise forms.ValidationError("Cette adresse n'existe pas dans notre base de données.")
e427f068
AJ
258 return email
259
260class NewPasswordForm(forms.Form):
261 password = forms.CharField(widget=forms.PasswordInput(), required=True, label="Mot de passe")
262 password_repeat = forms.CharField(widget=forms.PasswordInput(), required=True, label="Confirmez mot de passe")
263 def clean_password_repeat(self):
264 cleaned_data = self.cleaned_data
265 password = cleaned_data.get("password")
266 password_repeat = cleaned_data.get("password_repeat")
267 if password and password_repeat:
268 if password != password_repeat:
269 raise forms.ValidationError("Les mots de passe ne concordent pas")
270 return password_repeat
0e9597af 271