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