8fdb545bb333b6d832800583fb1ee37dcf86134f
[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
69 def _poste_choices(self):
70 """ Menu déroulant pour les postes.
71
72 Constitué des postes de dae et des postes de rh_v1 qui n'ont pas
73 d'équivalent dans dae.
74
75 """
76 dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
77 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
78 id_copies = [p.id_rh_id for p in copies.all()]
79 rhv1 = rh.Poste.objects.filter(actif=True).exclude(id__in=id_copies)
80 # Optimisation de la requête
81 rhv1 = rhv1.select_related(depth=1)
82
83 return [('', 'Nouveau poste')] + \
84 sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies] +
85 [('rh-%s' % p.id, unicode(p)) for p in rhv1],
86 key=lambda t: t[1])
87
88 def clean(self):
89 """
90 Validation conditionnelles de certains champs.
91 """
92 cleaned_data = self.cleaned_data
93
94 # Gestion de la mise à disposition
95 mise_a_disposition = cleaned_data.get("mise_a_disposition")
96 valeur_point_min = cleaned_data.get("valeur_point_min")
97 valeur_point_max = cleaned_data.get("valeur_point_max")
98 if mise_a_disposition is False and (valeur_point_min is None or valeur_point_max is None):
99 msg = u"Ce champ est obligatoire."
100 self._errors["valeur_point_min"] = self.error_class([msg])
101 self._errors["valeur_point_max"] = self.error_class([msg])
102 raise forms.ValidationError("Les valeurs de point sont vides")
103
104 return cleaned_data
105
106
107
108 def save(self, *args, **kwargs):
109 kwargs2 = kwargs.copy()
110 kwargs2['commit'] = False
111 poste = super(PosteForm, self).save(*args, **kwargs2)
112 # id_rh
113 if 'commit' not in kwargs or kwargs['commit']:
114 poste.save()
115 return poste
116
117
118 class ChoosePosteForm(forms.ModelForm):
119 class Meta:
120 model = dae.Poste
121 fields = ('poste',)
122
123 # La liste des choix est laissée vide. Voir PosteForm.__init__.
124 poste = forms.ChoiceField(choices=(), required=False)
125
126 def __init__(self, *args, **kwargs):
127 super(ChoosePosteForm, self).__init__(*args, **kwargs)
128 self.fields['poste'].choices = self._poste_choices()
129
130 def _poste_choices(self):
131 """ Menu déroulant pour les postes. """
132 dae_ = dae.Poste.objects.filter(id_rh__isnull=True)
133 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
134 id_copies = [p.id_rh_id for p in copies.all()]
135
136 return [('', '----------')] + \
137 sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies],
138 key=lambda t: t[1])
139
140
141 class PosteFinancementForm(forms.ModelForm):
142 """ Formulaire des sources de financement pour un poste. """
143 class Meta:
144 model = dae.PosteFinancement
145 fields = ('type', 'montant', 'pourcentage', 'commentaire')
146
147
148 class EmployeForm(forms.ModelForm):
149 """ Formulaire des employés. """
150 class Meta:
151 model = dae.Employe
152 fields = ('employe', 'nom', 'prenom', 'genre')
153
154 # La liste des choix est laissée vide. Voir Poste.__init__ pour la raison.
155 employe = forms.ChoiceField(choices=(), required=False)
156
157 def __init__(self, *args, **kwargs):
158 """ Mise à jour dynamique du contenu du menu des employés. """
159 super(EmployeForm, self).__init__(*args, **kwargs)
160 self.fields['employe'].choices = self._employe_choices()
161
162 def _employe_choices(self):
163 """ Menu déroulant pour les employés. """
164 dae_ = dae.Employe.objects.filter(id_rh__isnull=True)
165 copies = dae.Employe.objects.exclude(id_rh__isnull=True)
166 id_copies = [p.id_rh_id for p in copies.all()]
167 rhv1 = rh.Employe.objects.exclude(id__in=id_copies)
168
169 return [('', 'Nouvel employé')] + \
170 sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies] +
171 [('rh-%s' % p.id, unicode(p)) for p in rhv1],
172 key=lambda t: t[1])
173
174
175 class DossierForm(forms.ModelForm):
176 """ Formulaire des dossiers. """
177 class Meta:
178 model = dae.Dossier