1 # -*- encoding: utf-8 -*-
3 from django
import forms
4 from django
.forms
.models
import inlineformset_factory
6 from datamaster_modeles
import models
as ref
8 from dae
import models
as dae
9 from rh_v1
import models
as rh
11 PostePieceForm
= inlineformset_factory(dae
.Poste
, dae
.PostePiece
)
12 DossierPieceForm
= inlineformset_factory(dae
.Dossier
, dae
.DossierPiece
)
14 class PosteValidationForm(forms
.ModelForm
):
15 """ Validation d'un poste"""
19 'validation_bureau_regional',
21 'validation_secretaire_general',
25 class PosteForm(forms
.ModelForm
):
26 """ Formulaire des postes. """
30 fields
= ('poste', 'implantation', 'type_poste', 'service', 'nom',
31 'responsable', 'statut_residence', 'mise_a_disposition',
32 'appel', 'date_debut', 'date_fin', 'actif',
33 'regime_travail', 'regime_travail_nb_heure_semaine',
34 'classement_min', 'classement_max',
35 'coefficient_min', 'coefficient_max',
36 'valeur_point_min', 'valeur_point_max',
37 'devise_min', 'devise_max',
38 'salaire_min', 'salaire_max', 'indemn_min', 'indemn_max',
39 'autre_min', 'autre_max', 'devise_comparaison',
40 'comp_locale_min', 'comp_locale_max',
41 'comp_universite_min', 'comp_universite_max',
42 'comp_fonctionpub_min', 'comp_fonctionpub_max',
43 'comp_ong_min', 'comp_ong_max',
44 'comp_autre_min', 'comp_autre_max',)
45 widgets
= dict(statut_residence
=forms
.RadioSelect(),
46 appel
=forms
.RadioSelect(),
47 nom
=forms
.TextInput(attrs
={'size': 60},),
48 #devise_min=forms.Select(attrs={'disabled':'disabled'}),
49 #devise_max=forms.Select(attrs={'disabled':'disabled'}),
52 responsable
= forms
.ModelChoiceField(
53 queryset
=rh
.Poste
.objects
.select_related(depth
=1))
55 # La liste des choix est laissée vide. Voir __init__ pour la raison.
56 poste
= forms
.ChoiceField(label
="Nouveau poste ou évolution du poste",
57 choices
=(), required
=False)
59 valeur_point_min
= forms
.ModelChoiceField(queryset
=rh
.ValeurPoint
.actuelles
.all(), required
=False)
60 valeur_point_max
= forms
.ModelChoiceField(queryset
=rh
.ValeurPoint
.actuelles
.all(), required
=False)
62 def __init__(self
, *args
, **kwargs
):
63 """ Mise à jour dynamique du contenu du menu des postes.
65 Si on ne met le menu à jour de cette façon, à chaque instantiation du
66 formulaire, son contenu est mis en cache par le système et il ne
67 reflète pas les changements apportés par les ajouts, modifications,
70 Aussi, dans ce cas-ci, on ne peut pas utiliser un ModelChoiceField
71 car le "id" de chaque choix est spécial (voir _poste_choices).
74 super(PosteForm
, self
).__init__(*args
, **kwargs
)
75 self
.fields
['poste'].choices
= self
._poste_choices()
77 # Quand le dae.Poste n'existe pas, on recherche dans les dossiers rhv1
78 if self
.instance
and self
.instance
.id is None:
79 dossiers
= self
.instance
.get_dossiers()
81 self
.initial
['service'] = dossiers
[0].service_id
82 self
.initial
['nom'] = "%s %s" % (self
.initial
['nom'], self
.instance
.get_complement_nom())
85 def _poste_choices(self
):
86 """ Menu déroulant pour les postes.
88 Constitué des postes de dae et des postes de rh_v1 qui n'ont pas
89 d'équivalent dans dae.
92 dae_
= dae
.Poste
.objects
.filter(actif
=True, id_rh__isnull
=True)
93 copies
= dae
.Poste
.objects
.exclude(id_rh__isnull
=True)
94 id_copies
= [p
.id_rh_id
for p
in copies
.all()]
95 rhv1
= rh
.Poste
.objects
.filter(actif
=True).exclude(id__in
=id_copies
)
96 # Optimisation de la requête
97 rhv1
= rhv1
.select_related(depth
=1)
99 return [('', 'Nouveau poste')] + \
100 sorted([('dae-%s' % p
.id, unicode(p
)) for p
in dae_ | copies
] +
101 [('rh-%s' % p
.id, unicode(p
)) for p
in rhv1
],
106 Validation conditionnelles de certains champs.
108 cleaned_data
= self
.cleaned_data
110 # Gestion de la mise à disposition
111 mise_a_disposition
= cleaned_data
.get("mise_a_disposition")
112 valeur_point_min
= cleaned_data
.get("valeur_point_min")
113 valeur_point_max
= cleaned_data
.get("valeur_point_max")
114 if mise_a_disposition
is False and (valeur_point_min
is None or valeur_point_max
is None):
115 msg
= u
"Ce champ est obligatoire."
116 self
._errors
["valeur_point_min"] = self
.error_class([msg
])
117 self
._errors
["valeur_point_max"] = self
.error_class([msg
])
118 raise forms
.ValidationError("Les valeurs de point sont vides")
124 def save(self
, *args
, **kwargs
):
125 kwargs2
= kwargs
.copy()
126 kwargs2
['commit'] = False
127 poste
= super(PosteForm
, self
).save(*args
, **kwargs2
)
129 if 'commit' not in kwargs
or kwargs
['commit']:
134 class ChoosePosteForm(forms
.ModelForm
):
139 # La liste des choix est laissée vide. Voir PosteForm.__init__.
140 poste
= forms
.ChoiceField(choices
=(), required
=False)
142 def __init__(self
, *args
, **kwargs
):
143 super(ChoosePosteForm
, self
).__init__(*args
, **kwargs
)
144 self
.fields
['poste'].choices
= self
._poste_choices()
146 def _poste_choices(self
):
147 """ Menu déroulant pour les postes. """
148 dae_
= dae
.Poste
.objects
.filter(id_rh__isnull
=True)
149 copies
= dae
.Poste
.objects
.exclude(id_rh__isnull
=True)
150 id_copies
= [p
.id_rh_id
for p
in copies
.all()]
152 return [('', '----------')] + \
153 sorted([('dae-%s' % p
.id, unicode(p
)) for p
in dae_ | copies
],
157 class PosteFinancementForm(forms
.ModelForm
):
158 """ Formulaire des sources de financement pour un poste. """
160 model
= dae
.PosteFinancement
161 fields
= ('type', 'montant', 'pourcentage', 'commentaire')
164 class EmployeForm(forms
.ModelForm
):
165 """ Formulaire des employés. """
168 fields
= ('employe', 'nom', 'prenom', 'genre')
170 # La liste des choix est laissée vide. Voir Poste.__init__ pour la raison.
171 employe
= forms
.ChoiceField(choices
=(), required
=False)
173 def __init__(self
, *args
, **kwargs
):
174 """ Mise à jour dynamique du contenu du menu des employés. """
175 super(EmployeForm
, self
).__init__(*args
, **kwargs
)
176 self
.fields
['employe'].choices
= self
._employe_choices()
178 def _employe_choices(self
):
179 """ Menu déroulant pour les employés. """
180 dae_
= dae
.Employe
.objects
.filter(id_rh__isnull
=True)
181 copies
= dae
.Employe
.objects
.exclude(id_rh__isnull
=True)
182 id_copies
= [p
.id_rh_id
for p
in copies
.all()]
183 rhv1
= rh
.Employe
.objects
.exclude(id__in
=id_copies
)
185 return [('', 'Nouvel employé')] + \
186 sorted([('dae-%s' % p
.id, unicode(p
)) for p
in dae_ | copies
] +
187 [('rh-%s' % p
.id, unicode(p
)) for p
in rhv1
],
191 class DossierForm(forms
.ModelForm
):
192 """ Formulaire des dossiers. """