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