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
7 from datamaster_modeles
import models
as ref
9 from dae
import models
as dae
10 from rh_v1
import models
as rh
12 PostePieceForm
= inlineformset_factory(dae
.Poste
, dae
.PostePiece
)
13 DossierPieceForm
= inlineformset_factory(dae
.Dossier
, dae
.DossierPiece
)
15 class PosteValidationForm(forms
.ModelForm
):
16 """ Validation d'un poste"""
20 'validation_bureau_regional',
22 'validation_secretaire_general',
26 class PosteForm(forms
.ModelForm
):
27 """ Formulaire des postes. """
31 fields
= ('poste', 'implantation', 'type_poste', 'service', 'nom',
32 'responsable', 'statut_residence', 'mise_a_disposition',
33 'appel', 'date_debut', 'date_fin', 'actif',
34 'regime_travail', 'regime_travail_nb_heure_semaine',
35 'classement_min', 'classement_max',
36 'coefficient_min', 'coefficient_max',
37 'valeur_point_min', 'valeur_point_max',
38 'devise_min', 'devise_max',
39 'salaire_min', 'salaire_max', 'indemn_min', 'indemn_max',
40 'autre_min', 'autre_max', 'devise_comparaison',
41 'comp_locale_min', 'comp_locale_max',
42 'comp_universite_min', 'comp_universite_max',
43 'comp_fonctionpub_min', 'comp_fonctionpub_max',
44 'comp_ong_min', 'comp_ong_max',
45 'comp_autre_min', 'comp_autre_max',)
46 widgets
= dict(statut_residence
=forms
.RadioSelect(),
47 appel
=forms
.RadioSelect(),
48 nom
=forms
.TextInput(attrs
={'size': 60},),
49 date_debut
=admin_widgets
.AdminDateWidget(),
50 date_fin
=admin_widgets
.AdminDateWidget(),
51 #devise_min=forms.Select(attrs={'disabled':'disabled'}),
52 #devise_max=forms.Select(attrs={'disabled':'disabled'}),
55 responsable
= forms
.ModelChoiceField(
56 queryset
=rh
.Poste
.objects
.select_related(depth
=1))
58 # La liste des choix est laissée vide. Voir __init__ pour la raison.
59 poste
= forms
.ChoiceField(label
="Nouveau poste ou évolution du poste",
60 choices
=(), required
=False)
62 valeur_point_min
= forms
.ModelChoiceField(queryset
=rh
.ValeurPoint
.actuelles
.all(), required
=False)
63 valeur_point_max
= forms
.ModelChoiceField(queryset
=rh
.ValeurPoint
.actuelles
.all(), required
=False)
65 def __init__(self
, *args
, **kwargs
):
66 """ Mise à jour dynamique du contenu du menu des postes.
68 Si on ne met le menu à jour de cette façon, à chaque instantiation du
69 formulaire, son contenu est mis en cache par le système et il ne
70 reflète pas les changements apportés par les ajouts, modifications,
73 Aussi, dans ce cas-ci, on ne peut pas utiliser un ModelChoiceField
74 car le "id" de chaque choix est spécial (voir _poste_choices).
77 super(PosteForm
, self
).__init__(*args
, **kwargs
)
78 self
.fields
['poste'].choices
= self
._poste_choices()
80 # Quand le dae.Poste n'existe pas, on recherche dans les dossiers rhv1
81 if self
.instance
and self
.instance
.id is None:
82 dossiers
= self
.instance
.get_dossiers()
84 self
.initial
['service'] = dossiers
[0].service_id
85 self
.initial
['nom'] = "%s %s" % (self
.initial
['nom'], self
.instance
.get_complement_nom())
88 def _poste_choices(self
):
89 """ Menu déroulant pour les postes.
91 Constitué des postes de dae et des postes de rh_v1 qui n'ont pas
92 d'équivalent dans dae.
95 dae_
= dae
.Poste
.objects
.filter(actif
=True, id_rh__isnull
=True)
96 copies
= dae
.Poste
.objects
.exclude(id_rh__isnull
=True)
97 id_copies
= [p
.id_rh_id
for p
in copies
.all()]
98 rhv1
= rh
.Poste
.objects
.filter(actif
=True).exclude(id__in
=id_copies
)
99 # Optimisation de la requête
100 rhv1
= rhv1
.select_related(depth
=1)
102 return [('', 'Nouveau poste')] + \
103 sorted([('dae-%s' % p
.id, unicode(p
)) for p
in dae_ | copies
] +
104 [('rh-%s' % p
.id, unicode(p
)) for p
in rhv1
],
109 Validation conditionnelles de certains champs.
111 cleaned_data
= self
.cleaned_data
113 # Gestion de la mise à disposition
114 mise_a_disposition
= cleaned_data
.get("mise_a_disposition")
115 valeur_point_min
= cleaned_data
.get("valeur_point_min")
116 valeur_point_max
= cleaned_data
.get("valeur_point_max")
117 if mise_a_disposition
is False and (valeur_point_min
is None or valeur_point_max
is None):
118 msg
= u
"Ce champ est obligatoire."
119 self
._errors
["valeur_point_min"] = self
.error_class([msg
])
120 self
._errors
["valeur_point_max"] = self
.error_class([msg
])
121 raise forms
.ValidationError("Les valeurs de point sont vides")
127 def save(self
, *args
, **kwargs
):
128 kwargs2
= kwargs
.copy()
129 kwargs2
['commit'] = False
130 poste
= super(PosteForm
, self
).save(*args
, **kwargs2
)
132 if 'commit' not in kwargs
or kwargs
['commit']:
137 class ChoosePosteForm(forms
.ModelForm
):
142 # La liste des choix est laissée vide. Voir PosteForm.__init__.
143 poste
= forms
.ChoiceField(choices
=(), required
=False)
145 def __init__(self
, *args
, **kwargs
):
146 super(ChoosePosteForm
, self
).__init__(*args
, **kwargs
)
147 self
.fields
['poste'].choices
= self
._poste_choices()
149 def _poste_choices(self
):
150 """ Menu déroulant pour les postes. """
151 dae_
= dae
.Poste
.objects
.filter(id_rh__isnull
=True)
152 copies
= dae
.Poste
.objects
.exclude(id_rh__isnull
=True)
153 id_copies
= [p
.id_rh_id
for p
in copies
.all()]
155 return [('', '----------')] + \
156 sorted([('dae-%s' % p
.id, unicode(p
)) for p
in dae_ | copies
],
160 class PosteFinancementForm(forms
.ModelForm
):
161 """ Formulaire des sources de financement pour un poste. """
163 model
= dae
.PosteFinancement
164 fields
= ('type', 'montant', 'pourcentage', 'commentaire')
167 class EmployeForm(forms
.ModelForm
):
168 """ Formulaire des employés. """
171 fields
= ('employe', 'nom', 'prenom', 'genre')
173 # La liste des choix est laissée vide. Voir Poste.__init__ pour la raison.
174 employe
= forms
.ChoiceField(choices
=(), required
=False)
176 def __init__(self
, *args
, **kwargs
):
177 """ Mise à jour dynamique du contenu du menu des employés. """
178 super(EmployeForm
, self
).__init__(*args
, **kwargs
)
179 self
.fields
['employe'].choices
= self
._employe_choices()
181 def _employe_choices(self
):
182 """ Menu déroulant pour les employés. """
183 dae_
= dae
.Employe
.objects
.filter(id_rh__isnull
=True)
184 copies
= dae
.Employe
.objects
.exclude(id_rh__isnull
=True)
185 id_copies
= [p
.id_rh_id
for p
in copies
.all()]
186 rhv1
= rh
.Employe
.objects
.exclude(id__in
=id_copies
)
188 return [('', 'Nouvel employé')] + \
189 sorted([('dae-%s' % p
.id, unicode(p
)) for p
in dae_ | copies
] +
190 [('rh-%s' % p
.id, unicode(p
)) for p
in rhv1
],
194 class DossierForm(forms
.ModelForm
):
195 """ Formulaire des dossiers. """
198 widgets
= dict(statut_residence
=forms
.RadioSelect(),
199 contrat_date_debut
=admin_widgets
.AdminDateWidget(),
200 contrat_date_fin
=admin_widgets
.AdminDateWidget(),