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