datepicker frontend
[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
e88caaf0 5from django.contrib.admin import widgets as admin_widgets
5d680e84
NC
6
7from datamaster_modeles import models as ref
8
9from dae import models as dae
10from rh_v1 import models as rh
11
36341125 12PostePieceForm = inlineformset_factory(dae.Poste, dae.PostePiece)
d766bf2c 13DossierPieceForm = inlineformset_factory(dae.Dossier, dae.DossierPiece)
5d680e84 14
a05cc82d
OL
15class 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
5d680e84
NC
26class PosteForm(forms.ModelForm):
27 """ Formulaire des postes. """
28 class Meta:
29 model = dae.Poste
ce110fb9 30
5d680e84
NC
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',
96d32304 36 'coefficient_min', 'coefficient_max',
5d680e84 37 'valeur_point_min', 'valeur_point_max',
3d627bfd 38 'devise_min', 'devise_max',
5d680e84
NC
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(),
ce110fb9 47 appel=forms.RadioSelect(),
3d627bfd 48 nom=forms.TextInput(attrs={'size': 60},),
e88caaf0
OL
49 date_debut=admin_widgets.AdminDateWidget(),
50 date_fin=admin_widgets.AdminDateWidget(),
3d627bfd 51 #devise_min=forms.Select(attrs={'disabled':'disabled'}),
52 #devise_max=forms.Select(attrs={'disabled':'disabled'}),
53 )
5d680e84 54
98d51b59 55 responsable = forms.ModelChoiceField(
139686f2
NC
56 queryset=rh.Poste.objects.select_related(depth=1))
57
5d680e84 58 # La liste des choix est laissée vide. Voir __init__ pour la raison.
5efcd48e 59 poste = forms.ChoiceField(label="Nouveau poste ou évolution du poste",
d949462d 60 choices=(), required=False)
5d680e84 61
4dd75e7b
OL
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)
6301bd59 64
5d680e84
NC
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
139686f2
NC
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
5d680e84
NC
76 """
77 super(PosteForm, self).__init__(*args, **kwargs)
78 self.fields['poste'].choices = self._poste_choices()
79
cc3098d0
OL
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
9508a5b8
OL
85 self.initial['nom'] = "%s %s" % (self.initial['nom'], self.instance.get_complement_nom())
86
cc3098d0 87
5d680e84
NC
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 """
6d704629 95 dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
5d680e84
NC
96 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
97 id_copies = [p.id_rh_id for p in copies.all()]
6d704629 98 rhv1 = rh.Poste.objects.filter(actif=True).exclude(id__in=id_copies)
139686f2
NC
99 # Optimisation de la requête
100 rhv1 = rhv1.select_related(depth=1)
5d680e84 101
98d51b59 102 return [('', 'Nouveau poste')] + \
5d680e84
NC
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])
3ed49093 106
4dd75e7b
OL
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
494ff2be
NC
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
3ed49093 136
139686f2
NC
137class 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
98d51b59 155 return [('', '----------')] + \
139686f2
NC
156 sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies],
157 key=lambda t: t[1])
158
159
3ed49093
NC
160class 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')
139686f2
NC
165
166
167class 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
194class DossierForm(forms.ModelForm):
195 """ Formulaire des dossiers. """
196 class Meta:
197 model = dae.Dossier
4d25e2ba 198 widgets = dict(statut_residence=forms.RadioSelect(),
199 )