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 PosteForm(forms
.ModelForm
):
15 """ Formulaire des postes. """
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'}),
41 responsable
= forms
.ModelChoiceField(
42 queryset
=rh
.Poste
.objects
.select_related(depth
=1))
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)
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)
51 def __init__(self
, *args
, **kwargs
):
52 """ Mise à jour dynamique du contenu du menu des postes.
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,
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).
63 super(PosteForm
, self
).__init__(*args
, **kwargs
)
64 self
.fields
['poste'].choices
= self
._poste_choices()
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()
70 self
.initial
['service'] = dossiers
[0].service_id
71 self
.initial
['nom'] = "%s %s" % (self
.initial
['nom'], self
.instance
.get_complement_nom())
74 def _poste_choices(self
):
75 """ Menu déroulant pour les postes.
77 Constitué des postes de dae et des postes de rh_v1 qui n'ont pas
78 d'équivalent dans dae.
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)
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
],
95 Validation conditionnelles de certains champs.
97 cleaned_data
= self
.cleaned_data
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")
113 def save(self
, *args
, **kwargs
):
114 kwargs2
= kwargs
.copy()
115 kwargs2
['commit'] = False
116 poste
= super(PosteForm
, self
).save(*args
, **kwargs2
)
118 if 'commit' not in kwargs
or kwargs
['commit']:
123 class ChoosePosteForm(forms
.ModelForm
):
128 # La liste des choix est laissée vide. Voir PosteForm.__init__.
129 poste
= forms
.ChoiceField(choices
=(), required
=False)
131 def __init__(self
, *args
, **kwargs
):
132 super(ChoosePosteForm
, self
).__init__(*args
, **kwargs
)
133 self
.fields
['poste'].choices
= self
._poste_choices()
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()]
141 return [('', '----------')] + \
142 sorted([('dae-%s' % p
.id, unicode(p
)) for p
in dae_ | copies
],
146 class PosteFinancementForm(forms
.ModelForm
):
147 """ Formulaire des sources de financement pour un poste. """
149 model
= dae
.PosteFinancement
150 fields
= ('type', 'montant', 'pourcentage', 'commentaire')
153 class EmployeForm(forms
.ModelForm
):
154 """ Formulaire des employés. """
157 fields
= ('employe', 'nom', 'prenom', 'genre')
159 # La liste des choix est laissée vide. Voir Poste.__init__ pour la raison.
160 employe
= forms
.ChoiceField(choices
=(), required
=False)
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()
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
)
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
],
180 class DossierForm(forms
.ModelForm
):
181 """ Formulaire des dossiers. """