validation form
[auf_rh_dae.git] / project / dae / forms.py
CommitLineData
5d680e84 1# -*- encoding: utf-8 -*-
ce110fb9 2
5d680e84 3from django import forms
36341125 4from django.forms.models import inlineformset_factory
5d680e84
NC
5
6from datamaster_modeles import models as ref
7
8from dae import models as dae
9from rh_v1 import models as rh
10
36341125 11PostePieceForm = inlineformset_factory(dae.Poste, dae.PostePiece)
d766bf2c 12DossierPieceForm = inlineformset_factory(dae.Dossier, dae.DossierPiece)
5d680e84 13
a05cc82d
OL
14class PosteValidationForm(forms.ModelForm):
15 """ Validation d'un poste"""
16 class Meta:
17 model = dae.Poste
18 fields = (
19 'validation_bureau_regional',
20 'validation_drh',
21 'validation_secretaire_general',
22 'validation_recteur',
23 )
24
5d680e84
NC
25class PosteForm(forms.ModelForm):
26 """ Formulaire des postes. """
27 class Meta:
28 model = dae.Poste
ce110fb9 29
5d680e84
NC
30 fields = ('poste', 'implantation', 'type_poste', 'service', 'nom',
31 'responsable', 'statut_residence', 'mise_a_disposition',
32 'appel', 'date_debut', 'date_fin', 'actif',
33 'regime_travail', 'regime_travail_nb_heure_semaine',
34 'classement_min', 'classement_max',
96d32304 35 'coefficient_min', 'coefficient_max',
5d680e84 36 'valeur_point_min', 'valeur_point_max',
3d627bfd 37 'devise_min', 'devise_max',
5d680e84
NC
38 'salaire_min', 'salaire_max', 'indemn_min', 'indemn_max',
39 'autre_min', 'autre_max', 'devise_comparaison',
40 'comp_locale_min', 'comp_locale_max',
41 'comp_universite_min', 'comp_universite_max',
42 'comp_fonctionpub_min', 'comp_fonctionpub_max',
43 'comp_ong_min', 'comp_ong_max',
44 'comp_autre_min', 'comp_autre_max',)
45 widgets = dict(statut_residence=forms.RadioSelect(),
ce110fb9 46 appel=forms.RadioSelect(),
3d627bfd 47 nom=forms.TextInput(attrs={'size': 60},),
48 #devise_min=forms.Select(attrs={'disabled':'disabled'}),
49 #devise_max=forms.Select(attrs={'disabled':'disabled'}),
50 )
5d680e84 51
98d51b59 52 responsable = forms.ModelChoiceField(
139686f2
NC
53 queryset=rh.Poste.objects.select_related(depth=1))
54
5d680e84 55 # La liste des choix est laissée vide. Voir __init__ pour la raison.
5efcd48e 56 poste = forms.ChoiceField(label="Nouveau poste ou évolution du poste",
d949462d 57 choices=(), required=False)
5d680e84 58
4dd75e7b
OL
59 valeur_point_min = forms.ModelChoiceField(queryset=rh.ValeurPoint.actuelles.all(), required=False)
60 valeur_point_max = forms.ModelChoiceField(queryset=rh.ValeurPoint.actuelles.all(), required=False)
6301bd59 61
5d680e84
NC
62 def __init__(self, *args, **kwargs):
63 """ Mise à jour dynamique du contenu du menu des postes.
64
65 Si on ne met le menu à jour de cette façon, à chaque instantiation du
66 formulaire, son contenu est mis en cache par le système et il ne
67 reflète pas les changements apportés par les ajouts, modifications,
68 etc...
69
139686f2
NC
70 Aussi, dans ce cas-ci, on ne peut pas utiliser un ModelChoiceField
71 car le "id" de chaque choix est spécial (voir _poste_choices).
72
5d680e84
NC
73 """
74 super(PosteForm, self).__init__(*args, **kwargs)
75 self.fields['poste'].choices = self._poste_choices()
76
cc3098d0
OL
77 # Quand le dae.Poste n'existe pas, on recherche dans les dossiers rhv1
78 if self.instance and self.instance.id is None:
79 dossiers = self.instance.get_dossiers()
80 if len(dossiers) > 0:
81 self.initial['service'] = dossiers[0].service_id
9508a5b8
OL
82 self.initial['nom'] = "%s %s" % (self.initial['nom'], self.instance.get_complement_nom())
83
cc3098d0 84
5d680e84
NC
85 def _poste_choices(self):
86 """ Menu déroulant pour les postes.
87
88 Constitué des postes de dae et des postes de rh_v1 qui n'ont pas
89 d'équivalent dans dae.
90
91 """
6d704629 92 dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
5d680e84
NC
93 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
94 id_copies = [p.id_rh_id for p in copies.all()]
6d704629 95 rhv1 = rh.Poste.objects.filter(actif=True).exclude(id__in=id_copies)
139686f2
NC
96 # Optimisation de la requête
97 rhv1 = rhv1.select_related(depth=1)
5d680e84 98
98d51b59 99 return [('', 'Nouveau poste')] + \
5d680e84
NC
100 sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies] +
101 [('rh-%s' % p.id, unicode(p)) for p in rhv1],
102 key=lambda t: t[1])
3ed49093 103
4dd75e7b
OL
104 def clean(self):
105 """
106 Validation conditionnelles de certains champs.
107 """
108 cleaned_data = self.cleaned_data
109
110 # Gestion de la mise à disposition
111 mise_a_disposition = cleaned_data.get("mise_a_disposition")
112 valeur_point_min = cleaned_data.get("valeur_point_min")
113 valeur_point_max = cleaned_data.get("valeur_point_max")
114 if mise_a_disposition is False and (valeur_point_min is None or valeur_point_max is None):
115 msg = u"Ce champ est obligatoire."
116 self._errors["valeur_point_min"] = self.error_class([msg])
117 self._errors["valeur_point_max"] = self.error_class([msg])
118 raise forms.ValidationError("Les valeurs de point sont vides")
119
120 return cleaned_data
121
122
123
494ff2be
NC
124 def save(self, *args, **kwargs):
125 kwargs2 = kwargs.copy()
126 kwargs2['commit'] = False
127 poste = super(PosteForm, self).save(*args, **kwargs2)
128 # id_rh
129 if 'commit' not in kwargs or kwargs['commit']:
130 poste.save()
131 return poste
132
3ed49093 133
139686f2
NC
134class ChoosePosteForm(forms.ModelForm):
135 class Meta:
136 model = dae.Poste
137 fields = ('poste',)
138
139 # La liste des choix est laissée vide. Voir PosteForm.__init__.
140 poste = forms.ChoiceField(choices=(), required=False)
141
142 def __init__(self, *args, **kwargs):
143 super(ChoosePosteForm, self).__init__(*args, **kwargs)
144 self.fields['poste'].choices = self._poste_choices()
145
146 def _poste_choices(self):
147 """ Menu déroulant pour les postes. """
148 dae_ = dae.Poste.objects.filter(id_rh__isnull=True)
149 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
150 id_copies = [p.id_rh_id for p in copies.all()]
151
98d51b59 152 return [('', '----------')] + \
139686f2
NC
153 sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies],
154 key=lambda t: t[1])
155
156
3ed49093
NC
157class PosteFinancementForm(forms.ModelForm):
158 """ Formulaire des sources de financement pour un poste. """
159 class Meta:
160 model = dae.PosteFinancement
161 fields = ('type', 'montant', 'pourcentage', 'commentaire')
139686f2
NC
162
163
164class EmployeForm(forms.ModelForm):
165 """ Formulaire des employés. """
166 class Meta:
167 model = dae.Employe
168 fields = ('employe', 'nom', 'prenom', 'genre')
169
170 # La liste des choix est laissée vide. Voir Poste.__init__ pour la raison.
171 employe = forms.ChoiceField(choices=(), required=False)
172
173 def __init__(self, *args, **kwargs):
174 """ Mise à jour dynamique du contenu du menu des employés. """
175 super(EmployeForm, self).__init__(*args, **kwargs)
176 self.fields['employe'].choices = self._employe_choices()
177
178 def _employe_choices(self):
179 """ Menu déroulant pour les employés. """
180 dae_ = dae.Employe.objects.filter(id_rh__isnull=True)
181 copies = dae.Employe.objects.exclude(id_rh__isnull=True)
182 id_copies = [p.id_rh_id for p in copies.all()]
183 rhv1 = rh.Employe.objects.exclude(id__in=id_copies)
184
185 return [('', 'Nouvel employé')] + \
186 sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies] +
187 [('rh-%s' % p.id, unicode(p)) for p in rhv1],
188 key=lambda t: t[1])
189
190
191class DossierForm(forms.ModelForm):
192 """ Formulaire des dossiers. """
193 class Meta:
194 model = dae.Dossier