1 # -*- encoding: utf-8 -*-
3 from django
import forms
4 from django
.db
.models
import Q
7 class PersonneForm(forms
.ModelForm
):
8 genre
= forms
.ChoiceField(widget
=forms
.RadioSelect(), choices
=GENRE_CHOICES
)
12 fields
= ('nom', 'prenom', 'courriel', 'genre')
14 class PersonneInscriptionForm(PersonneForm
):
15 password
= forms
.CharField(widget
=forms
.PasswordInput(), label
="Mot de passe")
17 class Meta(PersonneForm
.Meta
):
18 fields
= ('nom', 'prenom', 'courriel', 'password', 'genre')
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()
24 class ChercheurForm(forms
.ModelForm
):
25 """Formulaire d'édition d'un chercheur."""
26 OUI_NON_CHOICES
= ((1, 'Oui'), (0, 'Non'))
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()
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)
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')
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']
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
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']))
67 def clean_expert_oif(self
):
68 """Transforme la valeur du champ en booléen"""
69 return bool(int(self
.cleaned_data
['expert_oif']))
71 def clean_membre_fipf(self
):
72 """Transforme la valeur du champ en booléen"""
73 return bool(int(self
.cleaned_data
['membre_fipf']))
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."
83 def __init__(self
, data
=None, prefix
=None, chercheur
=None):
84 self
.chercheur
= chercheur
87 initial
['groupes'] = chercheur
.groupes
.values_list('id', flat
=True)
88 super(GroupesForm
, self
).__init__(data
=data
, prefix
=prefix
, initial
=initial
)
92 groupes
= self
.cleaned_data
['groupes']
93 ChercheurGroupe
.objects
.filter(chercheur
=self
.chercheur
).exclude(groupe__in
=groupes
).delete()
95 ChercheurGroupe
.objects
.get_or_create(chercheur
=self
.chercheur
, groupe
=g
, actif
=1)
97 class PublicationForm(forms
.ModelForm
):
100 fields
= ('titre', 'annee', 'revue', 'editeur', 'lieu_edition', 'nb_pages', 'url')
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")
109 fields
= ('titre', 'annee', 'editeur', 'lieu_edition', 'nb_pages', 'url')
111 class ExpertiseForm(forms
.ModelForm
):
112 OUI_NON_CHOICES
= ((1, 'Oui'), (0, 'Non'))
113 organisme_demandeur_visible
= forms
.ChoiceField(choices
=OUI_NON_CHOICES
,
114 label
="Voulez-vous que l'organisme demandeur soit visible sur votre fiche?",
115 widget
=forms
.RadioSelect())
118 fields
= ('nom', 'date', 'organisme_demandeur', 'organisme_demandeur_visible')
120 def clean_organisme_demandeur_visible(self
):
121 """Transforme la valeur du champ en booléen"""
122 return bool(int(self
.cleaned_data
['organisme_demandeur_visible']))
124 class ChercheurFormGroup(object):
125 """Groupe de formulaires nécessaires pour l'inscription et l'édition
128 def __init__(self
, data
=None, chercheur
=None):
129 personne_form_class
= PersonneInscriptionForm
if chercheur
is None else PersonneForm
130 self
.chercheur
= ChercheurForm(data
=data
, prefix
='chercheur', instance
=chercheur
)
131 self
.groupes
= GroupesForm(data
=data
, prefix
='chercheur', chercheur
=chercheur
)
132 self
.personne
= personne_form_class(data
=data
, prefix
='personne', instance
=chercheur
and chercheur
.personne
)
133 self
.publication1
= PublicationForm(data
=data
, prefix
='publication1', instance
=chercheur
and chercheur
.publication1
)
134 self
.publication2
= PublicationForm(data
=data
, prefix
='publication2', instance
=chercheur
and chercheur
.publication2
)
135 self
.publication3
= PublicationForm(data
=data
, prefix
='publication3', instance
=chercheur
and chercheur
.publication3
)
136 self
.publication4
= PublicationForm(data
=data
, prefix
='publication4', instance
=chercheur
and chercheur
.publication4
)
137 self
.these
= TheseForm(data
=data
, prefix
='these', instance
=chercheur
and chercheur
.these
)
138 self
.expertise
= ExpertiseForm(data
=data
, prefix
='expertise', instance
=chercheur
and chercheur
.expertise
)
141 def has_errors(self
):
142 return bool(self
.chercheur
.errors
or self
.personne
.errors
or self
.groupes
.errors
or
143 self
.publication1
.errors
or self
.publication2
.errors
or self
.publication3
.errors
or
144 self
.publication4
.errors
or self
.these
.errors
or self
.expertise
.errors
)
147 return self
.chercheur
.is_valid() and self
.personne
.is_valid() and self
.groupes
.is_valid() and \
148 self
.publication1
.is_valid() and self
.publication2
.is_valid() and \
149 self
.publication3
.is_valid() and self
.publication4
.is_valid() and \
150 self
.these
.is_valid() and self
.expertise
.is_valid()
155 chercheur
= self
.chercheur
.instance
157 # Enregistrer d'abord les clés étrangères car on doit les stocker dans
159 chercheur
.personne
= self
.personne
.save()
160 if self
.publication1
.cleaned_data
['titre']:
161 chercheur
.publication1
= self
.publication1
.save()
162 if self
.publication2
.cleaned_data
['titre']:
163 chercheur
.publication2
= self
.publication2
.save()
164 if self
.publication3
.cleaned_data
['titre']:
165 chercheur
.publication3
= self
.publication3
.save()
166 if self
.publication4
.cleaned_data
['titre']:
167 chercheur
.publication4
= self
.publication4
.save()
168 chercheur
.these
= self
.these
.save()
169 if self
.expertise
.cleaned_data
['nom']:
170 chercheur
.expertise
= self
.expertise
.save()
172 # Puis enregistrer le chercheur lui-même.
173 self
.chercheur
.save()
175 # Puis les many-to-many puisqu'on a besoin d'un id.
176 self
.groupes
.chercheur
= chercheur
179 class RepertoireSearchForm (forms
.Form
):
180 mots_cles
= forms
.CharField(required
=False, label
="Rechercher dans tous les champs")
181 nom
= forms
.CharField(required
=False, label
="Nom")
182 discipline
= forms
.ModelChoiceField(queryset
=Discipline
.objects
.all(), required
=False, label
="Discipline", empty_label
="Tous")
183 domaine
= forms
.ModelChoiceField(queryset
=Groupe
.objects
.all(), required
=False, label
="Domaine de recherche", empty_label
="Tous")
184 groupe_recherche
= forms
.CharField(required
=False, label
="Groupe de recherche")
185 statut
= forms
.ChoiceField(choices
=(('','Tous'),)+STATUT_CHOICES
+(('expert','Expert'),), required
=False, label
="Statut")
186 pays
= forms
.ModelChoiceField(queryset
=Pays
.objects
.all(), required
=False, label
="Pays", empty_label
="Tous")
187 region
= forms
.ModelChoiceField(queryset
=Region
.objects
.all(), required
=False, label
="Région", empty_label
="Toutes")
188 nord_sud
= forms
.ChoiceField(choices
=(('', 'Tous'), ('Nord', 'Nord'), ('Sud', 'Sud')), required
=False, label
="Nord/Sud")
190 def get_query_set(self
):
191 qs
= Chercheur
.objects
.all()
193 nom
= self
.cleaned_data
['nom']
195 qs
= qs
.search_nom(nom
)
196 discipline
= self
.cleaned_data
["discipline"]
198 qs
= qs
.filter(discipline
=discipline
)
199 domaine
= self
.cleaned_data
["domaine"]
201 qs
= qs
.filter(groupes
=domaine
)
202 groupe_recherche
= self
.cleaned_data
['groupe_recherche']
204 for word
in groupe_recherche
.split():
205 qs
= qs
.filter(groupe_recherche__icontains
=word
)
206 mots_cles
= self
.cleaned_data
["mots_cles"]
208 qs
= qs
.search(mots_cles
)
209 statut
= self
.cleaned_data
["statut"]
211 if statut
== "expert":
212 qs
= qs
.exclude(expertise
=None)
214 qs
= qs
.filter(statut
=statut
)
215 pays
= self
.cleaned_data
["pays"]
217 qs
= qs
.filter(Q(etablissement__pays
=pays
) |
Q(etablissement_autre_pays
=pays
))
218 region
= self
.cleaned_data
['region']
220 qs
= qs
.filter(Q(etablissement__pays__region
=region
) |
Q(etablissement_autre_pays__region
=region
))
221 nord_sud
= self
.cleaned_data
['nord_sud']
223 qs
= qs
.filter(Q(etablissement__pays__nord_sud
=nord_sud
) |
Q(etablissement_autre_pays__nord_sud
=nord_sud
))
226 class SendPasswordForm(forms
.Form
):
227 email
= forms
.EmailField(required
=True, label
="courriel")
228 def clean_email(self
):
229 cleaned_data
= self
.cleaned_data
230 email
= cleaned_data
.get("email")
233 Utilisateur
.objects
.get(courriel
=email
)
235 raise forms
.ValidationError("Ce courriel n'existe pas dans notre base de données.")
238 class NewPasswordForm(forms
.Form
):
239 password
= forms
.CharField(widget
=forms
.PasswordInput(), required
=True, label
="Mot de passe")
240 password_repeat
= forms
.CharField(widget
=forms
.PasswordInput(), required
=True, label
="Confirmez mot de passe")
241 def clean_password_repeat(self
):
242 cleaned_data
= self
.cleaned_data
243 password
= cleaned_data
.get("password")
244 password_repeat
= cleaned_data
.get("password_repeat")
245 if password
and password_repeat
:
246 if password
!= password_repeat
:
247 raise forms
.ValidationError("Les mots de passe ne concordent pas")
248 return password_repeat