1 # -*- encoding: utf-8 -*-
3 from django
import forms
4 from django
.db
.models
import Q
5 from itertools
import chain
8 class PersonneForm(forms
.ModelForm
):
9 genre
= forms
.ChoiceField(widget
=forms
.RadioSelect(), choices
=GENRE_CHOICES
)
13 fields
= ('nom', 'prenom', 'courriel', 'genre')
15 class PersonneInscriptionForm(PersonneForm
):
16 password
= forms
.CharField(widget
=forms
.PasswordInput(), label
="Mot de passe")
18 class Meta(PersonneForm
.Meta
):
19 fields
= ('nom', 'prenom', 'courriel', 'password', 'genre')
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()
25 class ChercheurForm(forms
.ModelForm
):
26 """Formulaire d'édition d'un chercheur."""
27 OUI_NON_CHOICES
= ((1, 'Oui'), (0, 'Non'))
28 ETABLISSEMENT_CHOICES
= ((id, nom
if len(nom
) < 80 else nom
[:80] + '...')
29 for id, nom
in Etablissement
.objects
.values_list('id', 'nom'))
31 membre_instance_auf
= forms
.ChoiceField(
32 choices
=OUI_NON_CHOICES
,
33 label
="Êtes-vous (ou avez-vous déjà été) membre d'une instance de l'AUF?",
34 help_text
="e.g. conseil scientifique, conseil associatif, commission régionale d'experts",
35 widget
=forms
.RadioSelect()
37 membre_instance_auf_dates
= forms
.CharField(label
="Préciser les dates", required
=False)
38 expert_oif
= forms
.ChoiceField(choices
=OUI_NON_CHOICES
,
39 label
="Êtes-vous expert de l'OIF?",
40 widget
=forms
.RadioSelect())
41 membre_fipf
= forms
.ChoiceField(choices
=OUI_NON_CHOICES
,
42 label
="Êtes-vous membre de la FIPF?",
43 widget
=forms
.RadioSelect())
44 membre_fipf_association
= forms
.CharField(label
="Préciser le nom de votre association", required
=False)
45 etablissement
= forms
.ChoiceField(label
='Etablissement', required
=False, choices
=chain([('', '---------')], ETABLISSEMENT_CHOICES
))
49 fields
= ('statut', 'diplome', 'etablissement',
50 'etablissement_autre_nom', 'etablissement_autre_pays',
51 'discipline', 'theme_recherche', 'groupe_recherche', 'mots_cles',
52 'url_site_web', 'url_blog', 'url_reseau_social',
53 'membre_instance_auf', 'membre_instance_auf_dates',
54 'expert_oif', 'membre_fipf', 'membre_fipf_association')
56 def clean_etablissement(self
):
57 etablissement
= self
.cleaned_data
['etablissement']
59 return Etablissement
.objects
.get(id=etablissement
)
62 etablissement
= self
.cleaned_data
['etablissement']
63 etablissement_autre_nom
= self
.cleaned_data
['etablissement_autre_nom']
64 etablissement_autre_pays
= self
.cleaned_data
['etablissement_autre_pays']
66 if not etablissement_autre_nom
:
67 self
._errors
['etablissement'] = self
.error_class([u
"Vous devez renseigner l'établissement"])
68 elif not etablissement_autre_pays
:
69 self
._errors
['etablissement_autre_pays'] = self
.error_class([u
"Vous devez renseigner le pays de l'établissement"])
70 return self
.cleaned_data
72 def clean_membre_instance_auf(self
):
73 """Transforme la valeur du champ en booléen"""
74 return bool(int(self
.cleaned_data
['membre_instance_auf']))
76 def clean_expert_oif(self
):
77 """Transforme la valeur du champ en booléen"""
78 return bool(int(self
.cleaned_data
['expert_oif']))
80 def clean_membre_fipf(self
):
81 """Transforme la valeur du champ en booléen"""
82 return bool(int(self
.cleaned_data
['membre_fipf']))
84 class GroupesForm(forms
.Form
):
85 """Formulaire qui associe des groupes à un chercheur."""
86 groupes
= forms
.ModelMultipleChoiceField(
87 queryset
=Groupe
.objects
.all(),
88 label
='Domaines de recherche', required
=False,
89 help_text
="Maintenez appuyé « Ctrl », ou « Commande (touche pomme) » sur un Mac, pour en sélectionner plusieurs."
92 def __init__(self
, data
=None, prefix
=None, chercheur
=None):
93 self
.chercheur
= chercheur
96 initial
['groupes'] = chercheur
.groupes
.values_list('id', flat
=True)
97 super(GroupesForm
, self
).__init__(data
=data
, prefix
=prefix
, initial
=initial
)
101 groupes
= self
.cleaned_data
['groupes']
102 ChercheurGroupe
.objects
.filter(chercheur
=self
.chercheur
).exclude(groupe__in
=groupes
).delete()
104 ChercheurGroupe
.objects
.get_or_create(chercheur
=self
.chercheur
, groupe
=g
, actif
=1)
106 class PublicationForm(forms
.ModelForm
):
109 fields
= ('titre', 'annee', 'revue', 'editeur', 'lieu_edition', 'nb_pages', 'url')
111 class TheseForm(PublicationForm
):
112 titre
= forms
.CharField(required
=True, label
="Titre de la thèse ou du mémoire")
113 annee
= forms
.IntegerField(required
=True, label
="Année de soutenance (réalisée ou prévue)")
114 editeur
= forms
.CharField(required
=True, label
="Directeur de thèse")
115 lieu_edition
= forms
.CharField(required
=True, label
="Établissement de soutenance")
118 fields
= ('titre', 'annee', 'editeur', 'lieu_edition', 'nb_pages', 'url')
120 class ExpertiseForm(forms
.ModelForm
):
121 OUI_NON_CHOICES
= ((1, 'Oui'), (0, 'Non'))
122 organisme_demandeur_visible
= forms
.ChoiceField(choices
=OUI_NON_CHOICES
,
124 label
="Voulez-vous que l'organisme demandeur soit visible sur votre fiche?",
125 widget
=forms
.RadioSelect())
128 fields
= ('nom', 'date', 'organisme_demandeur', 'organisme_demandeur_visible')
130 def clean_organisme_demandeur_visible(self
):
131 """Transforme la valeur du champ en booléen"""
132 value
= self
.cleaned_data
['organisme_demandeur_visible']
133 return bool(int(value
)) if value
else False
135 class ChercheurFormGroup(object):
136 """Groupe de formulaires nécessaires pour l'inscription et l'édition
139 def __init__(self
, data
=None, chercheur
=None):
140 personne_form_class
= PersonneInscriptionForm
if chercheur
is None else PersonneForm
141 self
.chercheur
= ChercheurForm(data
=data
, prefix
='chercheur', instance
=chercheur
)
142 self
.groupes
= GroupesForm(data
=data
, prefix
='chercheur', chercheur
=chercheur
)
143 self
.personne
= personne_form_class(data
=data
, prefix
='personne', instance
=chercheur
and chercheur
.personne
)
144 self
.publication1
= PublicationForm(data
=data
, prefix
='publication1', instance
=chercheur
and chercheur
.publication1
)
145 self
.publication2
= PublicationForm(data
=data
, prefix
='publication2', instance
=chercheur
and chercheur
.publication2
)
146 self
.publication3
= PublicationForm(data
=data
, prefix
='publication3', instance
=chercheur
and chercheur
.publication3
)
147 self
.publication4
= PublicationForm(data
=data
, prefix
='publication4', instance
=chercheur
and chercheur
.publication4
)
148 self
.these
= TheseForm(data
=data
, prefix
='these', instance
=chercheur
and chercheur
.these
)
149 self
.expertise
= ExpertiseForm(data
=data
, prefix
='expertise', instance
=chercheur
and chercheur
.expertise
)
152 def has_errors(self
):
153 return bool(self
.chercheur
.errors
or self
.personne
.errors
or self
.groupes
.errors
or
154 self
.publication1
.errors
or self
.publication2
.errors
or self
.publication3
.errors
or
155 self
.publication4
.errors
or self
.these
.errors
or self
.expertise
.errors
)
158 return self
.chercheur
.is_valid() and self
.personne
.is_valid() and self
.groupes
.is_valid() and \
159 self
.publication1
.is_valid() and self
.publication2
.is_valid() and \
160 self
.publication3
.is_valid() and self
.publication4
.is_valid() and \
161 self
.these
.is_valid() and self
.expertise
.is_valid()
166 chercheur
= self
.chercheur
.instance
168 # Enregistrer d'abord les clés étrangères car on doit les stocker dans
170 chercheur
.personne
= self
.personne
.save()
171 if self
.publication1
.cleaned_data
['titre']:
172 chercheur
.publication1
= self
.publication1
.save()
173 if self
.publication2
.cleaned_data
['titre']:
174 chercheur
.publication2
= self
.publication2
.save()
175 if self
.publication3
.cleaned_data
['titre']:
176 chercheur
.publication3
= self
.publication3
.save()
177 if self
.publication4
.cleaned_data
['titre']:
178 chercheur
.publication4
= self
.publication4
.save()
179 chercheur
.these
= self
.these
.save()
180 if self
.expertise
.cleaned_data
['nom']:
181 chercheur
.expertise
= self
.expertise
.save()
183 # Puis enregistrer le chercheur lui-même.
184 self
.chercheur
.save()
186 # Puis les many-to-many puisqu'on a besoin d'un id.
187 self
.groupes
.chercheur
= chercheur
190 class RepertoireSearchForm (forms
.Form
):
191 mots_cles
= forms
.CharField(required
=False, label
="Rechercher dans tous les champs")
192 nom
= forms
.CharField(required
=False, label
="Nom")
193 discipline
= forms
.ModelChoiceField(queryset
=Discipline
.objects
.all(), required
=False, label
="Discipline", empty_label
="Tous")
194 domaine
= forms
.ModelChoiceField(queryset
=Groupe
.objects
.all(), required
=False, label
="Domaine de recherche", empty_label
="Tous")
195 groupe_recherche
= forms
.CharField(required
=False, label
="Groupe de recherche")
196 statut
= forms
.ChoiceField(choices
=(('','Tous'),)+STATUT_CHOICES
+(('expert','Expert'),), required
=False, label
="Statut")
197 pays
= forms
.ModelChoiceField(queryset
=Pays
.objects
.all(), required
=False, label
="Pays", empty_label
="Tous")
198 region
= forms
.ModelChoiceField(queryset
=Region
.objects
.all(), required
=False, label
="Région", empty_label
="Toutes")
199 nord_sud
= forms
.ChoiceField(choices
=(('', 'Tous'), ('Nord', 'Nord'), ('Sud', 'Sud')), required
=False, label
="Nord/Sud")
201 def get_query_set(self
):
202 qs
= Chercheur
.objects
.all()
204 nom
= self
.cleaned_data
['nom']
206 qs
= qs
.search_nom(nom
)
207 discipline
= self
.cleaned_data
["discipline"]
209 qs
= qs
.filter(discipline
=discipline
)
210 domaine
= self
.cleaned_data
["domaine"]
212 qs
= qs
.filter(groupes
=domaine
)
213 groupe_recherche
= self
.cleaned_data
['groupe_recherche']
215 for word
in groupe_recherche
.split():
216 qs
= qs
.filter(groupe_recherche__icontains
=word
)
217 mots_cles
= self
.cleaned_data
["mots_cles"]
219 qs
= qs
.search(mots_cles
)
220 statut
= self
.cleaned_data
["statut"]
222 if statut
== "expert":
223 qs
= qs
.exclude(expertise
=None)
225 qs
= qs
.filter(statut
=statut
)
226 pays
= self
.cleaned_data
["pays"]
228 qs
= qs
.filter(Q(etablissement__pays
=pays
) |
Q(etablissement_autre_pays
=pays
))
229 region
= self
.cleaned_data
['region']
231 qs
= qs
.filter(Q(etablissement__pays__region
=region
) |
Q(etablissement_autre_pays__region
=region
))
232 nord_sud
= self
.cleaned_data
['nord_sud']
234 qs
= qs
.filter(Q(etablissement__pays__nord_sud
=nord_sud
) |
Q(etablissement_autre_pays__nord_sud
=nord_sud
))
237 class SendPasswordForm(forms
.Form
):
238 email
= forms
.EmailField(required
=True, label
="Adresse électronique")
239 def clean_email(self
):
240 cleaned_data
= self
.cleaned_data
241 email
= cleaned_data
.get("email")
244 Utilisateur
.objects
.get(courriel
=email
)
246 raise forms
.ValidationError("Cette adresse n'existe pas dans notre base de données.")
249 class NewPasswordForm(forms
.Form
):
250 password
= forms
.CharField(widget
=forms
.PasswordInput(), required
=True, label
="Mot de passe")
251 password_repeat
= forms
.CharField(widget
=forms
.PasswordInput(), required
=True, label
="Confirmez mot de passe")
252 def clean_password_repeat(self
):
253 cleaned_data
= self
.cleaned_data
254 password
= cleaned_data
.get("password")
255 password_repeat
= cleaned_data
.get("password_repeat")
256 if password
and password_repeat
:
257 if password
!= password_repeat
:
258 raise forms
.ValidationError("Les mots de passe ne concordent pas")
259 return password_repeat