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