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