pieces jointes
[auf_rh_dae.git] / project / dae / forms.py
CommitLineData
5d680e84 1# -*- encoding: utf-8 -*-
ce110fb9 2
5d680e84 3from django import forms
36341125 4from django.forms.models import inlineformset_factory
5d680e84
NC
5
6from datamaster_modeles import models as ref
7
8from dae import models as dae
9from rh_v1 import models as rh
10
36341125 11PostePieceForm = inlineformset_factory(dae.Poste, dae.PostePiece)
5d680e84
NC
12
13class PosteForm(forms.ModelForm):
14 """ Formulaire des postes. """
15 class Meta:
16 model = dae.Poste
ce110fb9 17
5d680e84
NC
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',
96d32304 23 'coefficient_min', 'coefficient_max',
5d680e84 24 'valeur_point_min', 'valeur_point_max',
3d627bfd 25 'devise_min', 'devise_max',
5d680e84
NC
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(),
ce110fb9 34 appel=forms.RadioSelect(),
3d627bfd 35 nom=forms.TextInput(attrs={'size': 60},),
36 #devise_min=forms.Select(attrs={'disabled':'disabled'}),
37 #devise_max=forms.Select(attrs={'disabled':'disabled'}),
38 )
5d680e84 39
98d51b59 40 responsable = forms.ModelChoiceField(
139686f2
NC
41 queryset=rh.Poste.objects.select_related(depth=1))
42
5d680e84 43 # La liste des choix est laissée vide. Voir __init__ pour la raison.
5efcd48e 44 poste = forms.ChoiceField(label="Nouveau poste ou évolution du poste",
d949462d 45 choices=(), required=False)
5d680e84 46
4dd75e7b
OL
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)
6301bd59 49
5d680e84
NC
50 def __init__(self, *args, **kwargs):
51 """ Mise à jour dynamique du contenu du menu des postes.
52
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,
56 etc...
57
139686f2
NC
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).
60
5d680e84
NC
61 """
62 super(PosteForm, self).__init__(*args, **kwargs)
63 self.fields['poste'].choices = self._poste_choices()
64
cc3098d0
OL
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()
68 if len(dossiers) > 0:
69 self.initial['service'] = dossiers[0].service_id
9508a5b8
OL
70 self.initial['nom'] = "%s %s" % (self.initial['nom'], self.instance.get_complement_nom())
71
cc3098d0 72
5d680e84
NC
73 def _poste_choices(self):
74 """ Menu déroulant pour les postes.
75
76 Constitué des postes de dae et des postes de rh_v1 qui n'ont pas
77 d'équivalent dans dae.
78
79 """
6d704629 80 dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
5d680e84
NC
81 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
82 id_copies = [p.id_rh_id for p in copies.all()]
6d704629 83 rhv1 = rh.Poste.objects.filter(actif=True).exclude(id__in=id_copies)
139686f2
NC
84 # Optimisation de la requête
85 rhv1 = rhv1.select_related(depth=1)
5d680e84 86
98d51b59 87 return [('', 'Nouveau poste')] + \
5d680e84
NC
88 sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies] +
89 [('rh-%s' % p.id, unicode(p)) for p in rhv1],
90 key=lambda t: t[1])
3ed49093 91
4dd75e7b
OL
92 def clean(self):
93 """
94 Validation conditionnelles de certains champs.
95 """
96 cleaned_data = self.cleaned_data
97
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")
107
108 return cleaned_data
109
110
111
494ff2be
NC
112 def save(self, *args, **kwargs):
113 kwargs2 = kwargs.copy()
114 kwargs2['commit'] = False
115 poste = super(PosteForm, self).save(*args, **kwargs2)
116 # id_rh
117 if 'commit' not in kwargs or kwargs['commit']:
118 poste.save()
119 return poste
120
3ed49093 121
139686f2
NC
122class ChoosePosteForm(forms.ModelForm):
123 class Meta:
124 model = dae.Poste
125 fields = ('poste',)
126
127 # La liste des choix est laissée vide. Voir PosteForm.__init__.
128 poste = forms.ChoiceField(choices=(), required=False)
129
130 def __init__(self, *args, **kwargs):
131 super(ChoosePosteForm, self).__init__(*args, **kwargs)
132 self.fields['poste'].choices = self._poste_choices()
133
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()]
139
98d51b59 140 return [('', '----------')] + \
139686f2
NC
141 sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies],
142 key=lambda t: t[1])
143
144
3ed49093
NC
145class PosteFinancementForm(forms.ModelForm):
146 """ Formulaire des sources de financement pour un poste. """
147 class Meta:
148 model = dae.PosteFinancement
149 fields = ('type', 'montant', 'pourcentage', 'commentaire')
139686f2
NC
150
151
152class EmployeForm(forms.ModelForm):
153 """ Formulaire des employés. """
154 class Meta:
155 model = dae.Employe
156 fields = ('employe', 'nom', 'prenom', 'genre')
157
158 # La liste des choix est laissée vide. Voir Poste.__init__ pour la raison.
159 employe = forms.ChoiceField(choices=(), required=False)
160
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()
165
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)
172
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],
176 key=lambda t: t[1])
177
178
179class DossierForm(forms.ModelForm):
180 """ Formulaire des dossiers. """
181 class Meta:
182 model = dae.Dossier