1 # -*- encoding: utf-8 -*-
3 from django
import forms
4 from django
.forms
.models
import inlineformset_factory
5 from django
.contrib
.admin
import widgets
as admin_widgets
6 from auf
.django
.workflow
.forms
import WorkflowFormMixin
7 from datamaster_modeles
import models
as ref
9 from dae
import models
as dae
10 from rh_v1
import models
as rh
13 class PostePieceForm(inlineformset_factory(dae
.Poste
, dae
.PostePiece
)):
16 class DossierPieceForm(inlineformset_factory(dae
.Dossier
, dae
.DossierPiece
)):
19 class FinancementForm(inlineformset_factory(dae
.Poste
, dae
.PosteFinancement
, extra
=1)):
23 class PosteValidationForm(forms
.ModelForm
):
24 """ Validation d'un poste"""
28 'validation_bureau_regional',
30 'validation_secretaire_general',
34 class PosteForm(WorkflowFormMixin
):
35 """ Formulaire des postes. """
39 fields
= ('poste', 'implantation', 'type_poste', 'service', 'nom',
40 'responsable', 'statut_residence', 'mise_a_disposition',
41 'appel', 'date_debut', 'date_fin', 'actif',
42 'regime_travail', 'regime_travail_nb_heure_semaine',
43 'classement_min', 'classement_max',
44 'coefficient_min', 'coefficient_max',
45 'valeur_point_min', 'valeur_point_max',
46 'devise_min', 'devise_max',
47 'salaire_min', 'salaire_max', 'indemn_min', 'indemn_max',
48 'autre_min', 'autre_max', 'devise_comparaison',
49 'comp_locale_min', 'comp_locale_max',
50 'comp_universite_min', 'comp_universite_max',
51 'comp_fonctionpub_min', 'comp_fonctionpub_max',
52 'comp_ong_min', 'comp_ong_max',
53 'comp_autre_min', 'comp_autre_max',
56 widgets
= dict(statut_residence
=forms
.RadioSelect(),
57 appel
=forms
.RadioSelect(),
58 nom
=forms
.TextInput(attrs
={'size': 60},),
59 date_debut
=admin_widgets
.AdminDateWidget(),
60 date_fin
=admin_widgets
.AdminDateWidget(),
61 #devise_min=forms.Select(attrs={'disabled':'disabled'}),
62 #devise_max=forms.Select(attrs={'disabled':'disabled'}),
65 responsable
= forms
.ModelChoiceField(
66 queryset
=rh
.Poste
.objects
.select_related(depth
=1))
68 # La liste des choix est laissée vide. Voir __init__ pour la raison.
69 poste
= forms
.ChoiceField(label
="Nouveau poste ou évolution du poste",
70 choices
=(), required
=False)
72 valeur_point_min
= forms
.ModelChoiceField(queryset
=rh
.ValeurPoint
.actuelles
.all(), required
=False)
73 valeur_point_max
= forms
.ModelChoiceField(queryset
=rh
.ValeurPoint
.actuelles
.all(), required
=False)
75 def __init__(self
, *args
, **kwargs
):
76 """ Mise à jour dynamique du contenu du menu des postes.
78 Si on ne met le menu à jour de cette façon, à chaque instantiation du
79 formulaire, son contenu est mis en cache par le système et il ne
80 reflète pas les changements apportés par les ajouts, modifications,
83 Aussi, dans ce cas-ci, on ne peut pas utiliser un ModelChoiceField
84 car le "id" de chaque choix est spécial (voir _poste_choices).
87 super(PosteForm
, self
).__init__(*args
, **kwargs
)
88 self
.fields
['poste'].choices
= self
._poste_choices()
90 # Quand le dae.Poste n'existe pas, on recherche dans les dossiers rhv1
91 if self
.instance
and self
.instance
.id is None:
92 dossiers
= self
.instance
.get_dossiers()
94 self
.initial
['service'] = dossiers
[0].service_id
95 self
.initial
['nom'] = "%s %s" % (self
.initial
['nom'], self
.instance
.get_complement_nom())
98 def _poste_choices(self
):
99 """ Menu déroulant pour les postes.
101 Constitué des postes de dae et des postes de rh_v1 qui n'ont pas
102 d'équivalent dans dae.
105 dae_
= dae
.Poste
.objects
.filter(actif
=True, id_rh__isnull
=True)
106 copies
= dae
.Poste
.objects
.exclude(id_rh__isnull
=True)
107 id_copies
= [p
.id_rh_id
for p
in copies
.all()]
108 rhv1
= rh
.Poste
.objects
.filter(actif
=True).exclude(id__in
=id_copies
)
109 # Optimisation de la requête
110 rhv1
= rhv1
.select_related(depth
=1)
112 return [('', 'Nouveau poste')] + \
113 sorted([('dae-%s' % p
.id, unicode(p
)) for p
in dae_ | copies
] +
114 [('rh-%s' % p
.id, unicode(p
)) for p
in rhv1
],
119 Validation conditionnelles de certains champs.
121 cleaned_data
= self
.cleaned_data
123 # Gestion de la mise à disposition
124 mise_a_disposition
= cleaned_data
.get("mise_a_disposition")
125 valeur_point_min
= cleaned_data
.get("valeur_point_min")
126 valeur_point_max
= cleaned_data
.get("valeur_point_max")
127 if mise_a_disposition
is False and (valeur_point_min
is None or valeur_point_max
is None):
128 msg
= u
"Ce champ est obligatoire."
129 self
._errors
["valeur_point_min"] = self
.error_class([msg
])
130 self
._errors
["valeur_point_max"] = self
.error_class([msg
])
131 raise forms
.ValidationError("Les valeurs de point sont vides")
137 def save(self
, *args
, **kwargs
):
138 kwargs2
= kwargs
.copy()
139 kwargs2
['commit'] = False
140 poste
= super(PosteForm
, self
).save(*args
, **kwargs2
)
142 if 'commit' not in kwargs
or kwargs
['commit']:
147 class ChoosePosteForm(forms
.ModelForm
):
152 # La liste des choix est laissée vide. Voir PosteForm.__init__.
153 poste
= forms
.ChoiceField(choices
=(), required
=False)
155 def __init__(self
, *args
, **kwargs
):
156 super(ChoosePosteForm
, self
).__init__(*args
, **kwargs
)
157 self
.fields
['poste'].choices
= self
._poste_choices()
159 def _poste_choices(self
):
160 """ Menu déroulant pour les postes. """
161 dae_
= dae
.Poste
.objects
.filter(id_rh__isnull
=True)
162 copies
= dae
.Poste
.objects
.exclude(id_rh__isnull
=True)
163 id_copies
= [p
.id_rh_id
for p
in copies
.all()]
165 return [('', '----------')] + \
166 sorted([('dae-%s' % p
.id, unicode(p
)) for p
in dae_ | copies
],
170 class EmployeForm(forms
.ModelForm
):
171 """ Formulaire des employés. """
174 fields
= ('employe', 'nom', 'prenom', 'genre')
176 # La liste des choix est laissée vide. Voir Poste.__init__ pour la raison.
177 employe
= forms
.ChoiceField(choices
=(), required
=False)
179 def __init__(self
, *args
, **kwargs
):
180 """ Mise à jour dynamique du contenu du menu des employés. """
181 super(EmployeForm
, self
).__init__(*args
, **kwargs
)
182 self
.fields
['employe'].choices
= self
._employe_choices()
184 def _employe_choices(self
):
185 """ Menu déroulant pour les employés. """
186 dae_
= dae
.Employe
.objects
.filter(id_rh__isnull
=True)
187 copies
= dae
.Employe
.objects
.exclude(id_rh__isnull
=True)
188 id_copies
= [p
.id_rh_id
for p
in copies
.all()]
189 rhv1
= rh
.Employe
.objects
.exclude(id__in
=id_copies
)
191 return [('', 'Nouvel employé')] + \
192 sorted([('dae-%s' % p
.id, unicode(p
)) for p
in dae_ | copies
] +
193 [('rh-%s' % p
.id, unicode(p
)) for p
in rhv1
],
197 class DossierForm(forms
.ModelForm
):
198 """ Formulaire des dossiers. """
201 widgets
= dict(statut_residence
=forms
.RadioSelect(),
202 contrat_date_debut
=admin_widgets
.AdminDateWidget(),
203 contrat_date_fin
=admin_widgets
.AdminDateWidget(),