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