initial complement nom poste
[auf_rh_dae.git] / project / dae / forms.py
CommitLineData
5d680e84 1# -*- encoding: utf-8 -*-
ce110fb9 2
5d680e84
NC
3from django import forms
4
5from datamaster_modeles import models as ref
6
7from dae import models as dae
8from rh_v1 import models as rh
9
10
11class PosteForm(forms.ModelForm):
12 """ Formulaire des postes. """
13 class Meta:
14 model = dae.Poste
ce110fb9 15
5d680e84
NC
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',
96d32304 21 'coefficient_min', 'coefficient_max',
5d680e84 22 'valeur_point_min', 'valeur_point_max',
3d627bfd 23 'devise_min', 'devise_max',
5d680e84
NC
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(),
ce110fb9 32 appel=forms.RadioSelect(),
3d627bfd 33 nom=forms.TextInput(attrs={'size': 60},),
34 #devise_min=forms.Select(attrs={'disabled':'disabled'}),
35 #devise_max=forms.Select(attrs={'disabled':'disabled'}),
36 )
5d680e84 37
98d51b59 38 responsable = forms.ModelChoiceField(
139686f2
NC
39 queryset=rh.Poste.objects.select_related(depth=1))
40
5d680e84 41 # La liste des choix est laissée vide. Voir __init__ pour la raison.
5efcd48e 42 poste = forms.ChoiceField(label="Nouveau poste ou évolution du poste",
d949462d 43 choices=(), required=False)
5d680e84 44
4dd75e7b
OL
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)
6301bd59 47
5d680e84
NC
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
139686f2
NC
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
5d680e84
NC
59 """
60 super(PosteForm, self).__init__(*args, **kwargs)
61 self.fields['poste'].choices = self._poste_choices()
62
cc3098d0
OL
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
9508a5b8
OL
68 self.initial['nom'] = "%s %s" % (self.initial['nom'], self.instance.get_complement_nom())
69
cc3098d0 70
5d680e84
NC
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 """
6d704629 78 dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
5d680e84
NC
79 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
80 id_copies = [p.id_rh_id for p in copies.all()]
6d704629 81 rhv1 = rh.Poste.objects.filter(actif=True).exclude(id__in=id_copies)
139686f2
NC
82 # Optimisation de la requête
83 rhv1 = rhv1.select_related(depth=1)
5d680e84 84
98d51b59 85 return [('', 'Nouveau poste')] + \
5d680e84
NC
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])
3ed49093 89
4dd75e7b
OL
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
494ff2be
NC
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
3ed49093 119
139686f2
NC
120class 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
98d51b59 138 return [('', '----------')] + \
139686f2
NC
139 sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies],
140 key=lambda t: t[1])
141
142
3ed49093
NC
143class 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')
139686f2
NC
148
149
150class 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
177class DossierForm(forms.ModelForm):
178 """ Formulaire des dossiers. """
179 class Meta:
180 model = dae.Dossier