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