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