1 # -*- encoding: utf-8 -*-
3 from django
import forms
4 from django
.db
.models
import Q
5 from django
.forms
.models
import inlineformset_factory
6 from itertools
import chain
9 class PersonneForm(forms
.ModelForm
):
10 genre
= forms
.ChoiceField(widget
=forms
.RadioSelect(), choices
=GENRE_CHOICES
)
14 fields
= ('nom', 'prenom', 'courriel', 'genre')
16 class PersonneInscriptionForm(PersonneForm
):
17 password
= forms
.CharField(widget
=forms
.PasswordInput(), label
="Mot de passe")
19 class Meta(PersonneForm
.Meta
):
20 fields
= ('nom', 'prenom', 'courriel', 'password', 'genre')
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()
26 class ChercheurForm(forms
.ModelForm
):
27 """Formulaire d'édition d'un chercheur."""
28 OUI_NON_CHOICES
= ((1, 'Oui'), (0, 'Non'))
29 ETABLISSEMENT_CHOICES
= ((id, nom
if len(nom
) < 80 else nom
[:80] + '...')
30 for id, nom
in Etablissement
.objects
.values_list('id', 'nom'))
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()
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)
46 etablissement
= forms
.ChoiceField(label
='Etablissement', required
=False, choices
=chain([('', '---------')], ETABLISSEMENT_CHOICES
))
50 fields
= ('statut', 'diplome', 'etablissement',
51 'etablissement_autre_nom', 'etablissement_autre_pays',
52 'discipline', 'theme_recherche', 'groupe_recherche', 'mots_cles',
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')
57 def clean_etablissement(self
):
58 etablissement
= self
.cleaned_data
['etablissement']
60 return Etablissement
.objects
.get(id=etablissement
)
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']
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
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']))
77 def clean_expert_oif(self
):
78 """Transforme la valeur du champ en booléen"""
79 return bool(int(self
.cleaned_data
['expert_oif']))
81 def clean_membre_fipf(self
):
82 """Transforme la valeur du champ en booléen"""
83 return bool(int(self
.cleaned_data
['membre_fipf']))
85 class GroupesForm(forms
.Form
):
86 """Formulaire qui associe des groupes à un chercheur."""
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."
93 def __init__(self
, data
=None, prefix
=None, chercheur
=None):
94 self
.chercheur
= chercheur
97 initial
['groupes'] = chercheur
.groupes
.values_list('id', flat
=True)
98 super(GroupesForm
, self
).__init__(data
=data
, prefix
=prefix
, initial
=initial
)
102 groupes
= self
.cleaned_data
['groupes']
103 ChercheurGroupe
.objects
.filter(chercheur
=self
.chercheur
).exclude(groupe__in
=groupes
).delete()
105 ChercheurGroupe
.objects
.get_or_create(chercheur
=self
.chercheur
, groupe
=g
, actif
=1)
107 class PublicationForm(forms
.ModelForm
):
110 fields
= ('titre', 'revue', 'annee', 'editeur', 'lieu_edition', 'nb_pages', 'url')
112 class TheseForm(PublicationForm
):
113 titre
= forms
.CharField(required
=True, label
="Titre de la thèse ou du mémoire")
114 annee
= forms
.IntegerField(required
=True, label
="Année de soutenance (réalisée ou prévue)")
115 editeur
= forms
.CharField(required
=True, label
="Directeur de thèse")
116 lieu_edition
= forms
.CharField(required
=True, label
="Établissement de soutenance")
119 fields
= ('titre', 'annee', 'editeur', 'lieu_edition', 'nb_pages', 'url')
121 class ExpertiseForm(forms
.ModelForm
):
122 OUI_NON_CHOICES
= ((1, 'Oui'), (0, 'Non'))
123 organisme_demandeur_visible
= forms
.ChoiceField(choices
=OUI_NON_CHOICES
,
125 label
="Voulez-vous que l'organisme demandeur soit visible sur votre fiche?",
126 widget
=forms
.RadioSelect())
129 fields
= ('nom', 'date', 'organisme_demandeur', 'organisme_demandeur_visible')
131 def clean_organisme_demandeur_visible(self
):
132 """Transforme la valeur du champ en booléen"""
133 value
= self
.cleaned_data
['organisme_demandeur_visible']
134 return bool(int(value
)) if value
else False
136 ExpertiseFormSet
= inlineformset_factory(Chercheur
, Expertise
, form
=ExpertiseForm
, extra
=1)
138 class ChercheurFormGroup(object):
139 """Groupe de formulaires nécessaires pour l'inscription et l'édition
142 def __init__(self
, data
=None, chercheur
=None):
143 personne_form_class
= PersonneInscriptionForm
if chercheur
is None else PersonneForm
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
)
152 self
.expertises
= ExpertiseFormSet(data
=data
, prefix
='expertise', instance
=chercheur
)
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
158 self
.publication4
.errors
or self
.these
.errors
or self
.expertises
.errors
)
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 \
164 self
.these
.is_valid() and self
.expertises
.is_valid()
169 chercheur
= self
.chercheur
.instance
171 # Enregistrer d'abord les clés étrangères car on doit les stocker dans
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()
183 self
.expertises
.save()
185 # Puis enregistrer le chercheur lui-même.
186 self
.chercheur
.save()
188 # Puis les many-to-many puisqu'on a besoin d'un id.
189 self
.groupes
.chercheur
= chercheur
192 class RepertoireSearchForm (forms
.Form
):
193 mots_cles
= forms
.CharField(required
=False, label
="Rechercher dans tous les champs")
194 nom
= forms
.CharField(required
=False, label
="Nom")
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")
197 groupe_recherche
= forms
.CharField(required
=False, label
="Groupe de recherche")
198 statut
= forms
.ChoiceField(choices
=(('','Tous'),)+STATUT_CHOICES
+(('expert','Expert'),), required
=False, label
="Statut")
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")
203 def get_query_set(self
):
204 qs
= Chercheur
.objects
.all()
206 nom
= self
.cleaned_data
['nom']
208 qs
= qs
.search_nom(nom
)
209 discipline
= self
.cleaned_data
["discipline"]
211 qs
= qs
.filter(discipline
=discipline
)
212 domaine
= self
.cleaned_data
["domaine"]
214 qs
= qs
.filter(groupes
=domaine
)
215 groupe_recherche
= self
.cleaned_data
['groupe_recherche']
217 for word
in groupe_recherche
.split():
218 qs
= qs
.filter(groupe_recherche__icontains
=word
)
219 mots_cles
= self
.cleaned_data
["mots_cles"]
221 qs
= qs
.search(mots_cles
)
222 statut
= self
.cleaned_data
["statut"]
224 if statut
== "expert":
225 qs
= qs
.exclude(expertises
=None)
227 qs
= qs
.filter(statut
=statut
)
228 pays
= self
.cleaned_data
["pays"]
230 qs
= qs
.filter(Q(etablissement__pays
=pays
) |
Q(etablissement_autre_pays
=pays
))
231 region
= self
.cleaned_data
['region']
233 qs
= qs
.filter(Q(etablissement__pays__region
=region
) |
Q(etablissement_autre_pays__region
=region
))
234 nord_sud
= self
.cleaned_data
['nord_sud']
236 qs
= qs
.filter(Q(etablissement__pays__nord_sud
=nord_sud
) |
Q(etablissement_autre_pays__nord_sud
=nord_sud
))
239 class SendPasswordForm(forms
.Form
):
240 email
= forms
.EmailField(required
=True, label
="Adresse électronique")
241 def clean_email(self
):
242 cleaned_data
= self
.cleaned_data
243 email
= cleaned_data
.get("email")
246 Utilisateur
.objects
.get(courriel
=email
)
248 raise forms
.ValidationError("Cette adresse n'existe pas dans notre base de données.")
251 class NewPasswordForm(forms
.Form
):
252 password
= forms
.CharField(widget
=forms
.PasswordInput(), required
=True, label
="Mot de passe")
253 password_repeat
= forms
.CharField(widget
=forms
.PasswordInput(), required
=True, label
="Confirmez mot de passe")
254 def clean_password_repeat(self
):
255 cleaned_data
= self
.cleaned_data
256 password
= cleaned_data
.get("password")
257 password_repeat
= cleaned_data
.get("password_repeat")
258 if password
and password_repeat
:
259 if password
!= password_repeat
:
260 raise forms
.ValidationError("Les mots de passe ne concordent pas")
261 return password_repeat