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