1 # -*- encoding: utf-8 -*-
3 from django
import forms
4 from django
.db
.models
import Q
6 from savoirs
.forms
import SEPDateField
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'))
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()
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)
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')
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']
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
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']))
68 def clean_expert_oif(self
):
69 """Transforme la valeur du champ en booléen"""
70 return bool(int(self
.cleaned_data
['expert_oif']))
72 def clean_membre_fipf(self
):
73 """Transforme la valeur du champ en booléen"""
74 return bool(int(self
.cleaned_data
['membre_fipf']))
76 class GroupesForm(forms
.Form
):
77 """Formulaire qui associe des groupes à un chercheur."""
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."
84 def __init__(self
, data
=None, prefix
=None, chercheur
=None):
85 self
.chercheur
= chercheur
88 initial
['groupes'] = chercheur
.groupes
.values_list('id', flat
=True)
89 super(GroupesForm
, self
).__init__(data
=data
, prefix
=prefix
, initial
=initial
)
93 groupes
= self
.cleaned_data
['groupes']
94 ChercheurGroupe
.objects
.filter(chercheur
=self
.chercheur
).exclude(groupe__in
=groupes
).delete()
96 ChercheurGroupe
.objects
.get_or_create(chercheur
=self
.chercheur
, groupe
=g
, actif
=1)
98 class PublicationForm(forms
.ModelForm
):
101 fields
= ('titre', 'annee', 'revue', 'editeur', 'lieu_edition', 'nb_pages', 'url')
103 class TheseForm(PublicationForm
):
104 titre
= forms
.CharField(required
=True, label
="Titre de la thèse ou du mémoire")
105 annee
= forms
.IntegerField(required
=True, label
="Année de soutenance (réalisée ou prévue)")
106 editeur
= forms
.CharField(required
=True, label
="Directeur de thèse")
107 lieu_edition
= forms
.CharField(required
=True, label
="Établissement de soutenance")
110 fields
= ('titre', 'annee', 'editeur', 'lieu_edition', 'nb_pages', 'url')
112 class ExpertiseForm(forms
.ModelForm
):
113 date
= SEPDateField(required
=False, label
="Date")
116 fields
= ('nom', 'date', 'organisme_demandeur', 'organisme_demandeur_visible')
118 class ChercheurFormGroup(object):
119 """Groupe de formulaires nécessaires pour l'inscription et l'édition
122 def __init__(self
, data
=None, chercheur
=None):
123 personne_form_class
= PersonneInscriptionForm
if chercheur
is None else PersonneForm
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
)
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
)
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()
149 chercheur
= self
.chercheur
.instance
151 # Enregistrer d'abord les clés étrangères car on doit les stocker dans
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()
166 # Puis enregistrer le chercheur lui-même.
167 self
.chercheur
.save()
169 # Puis les many-to-many puisqu'on a besoin d'un id.
170 self
.groupes
.chercheur
= chercheur
173 class RepertoireSearchForm (forms
.Form
):
174 mots_cles
= forms
.CharField(required
=False, label
="Rechercher dans tous les champs")
175 nom
= forms
.CharField(required
=False, label
="Nom")
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")
178 statut
= forms
.ChoiceField(choices
=(('','Tous'),)+STATUT_CHOICES
+(('expert','Expert'),), required
=False, label
="Statut")
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")
183 def get_query_set(self
):
184 qs
= Chercheur
.objects
.all()
186 nom
= self
.cleaned_data
['nom']
188 qs
= qs
.search_nom(nom
)
189 discipline
= self
.cleaned_data
["discipline"]
191 qs
= qs
.filter(discipline
=discipline
)
192 domaine
= self
.cleaned_data
["domaine"]
194 qs
= qs
.filter(groupes
=domaine
)
195 mots_cles
= self
.cleaned_data
["mots_cles"]
197 qs
= qs
.search(mots_cles
)
198 statut
= self
.cleaned_data
["statut"]
200 if statut
== "expert":
201 qs
= qs
.exclude(expertise
=None)
203 qs
= qs
.filter(statut
=statut
)
204 pays
= self
.cleaned_data
["pays"]
206 qs
= qs
.filter(Q(etablissement__pays
=pays
) |
Q(etablissement_autre_pays
=pays
))
207 region
= self
.cleaned_data
['region']
209 qs
= qs
.filter(Q(etablissement__pays__region
=region
) |
Q(etablissement_autre_pays__region
=region
))
210 nord_sud
= self
.cleaned_data
['nord_sud']
212 qs
= qs
.filter(Q(etablissement__pays__nord_sud
=nord_sud
) |
Q(etablissement_autre_pays__nord_sud
=nord_sud
))
215 class 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")
222 Utilisateur
.objects
.get(courriel
=email
)
224 raise forms
.ValidationError("Ce courriel n'existe pas dans notre base de données.")
227 class 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