autopopule le service
[auf_rh_dae.git] / project / dae / forms.py
CommitLineData
5d680e84 1# -*- encoding: utf-8 -*-
ce110fb9 2
5d680e84
NC
3from django import forms
4
5from datamaster_modeles import models as ref
6
7from dae import models as dae
8from rh_v1 import models as rh
9
10
11class PosteForm(forms.ModelForm):
12 """ Formulaire des postes. """
13 class Meta:
14 model = dae.Poste
ce110fb9 15
5d680e84
NC
16 fields = ('poste', 'implantation', 'type_poste', 'service', 'nom',
17 'responsable', 'statut_residence', 'mise_a_disposition',
18 'appel', 'date_debut', 'date_fin', 'actif',
19 'regime_travail', 'regime_travail_nb_heure_semaine',
20 'classement_min', 'classement_max',
96d32304 21 'coefficient_min', 'coefficient_max',
5d680e84 22 'valeur_point_min', 'valeur_point_max',
3d627bfd 23 'devise_min', 'devise_max',
5d680e84
NC
24 'salaire_min', 'salaire_max', 'indemn_min', 'indemn_max',
25 'autre_min', 'autre_max', 'devise_comparaison',
26 'comp_locale_min', 'comp_locale_max',
27 'comp_universite_min', 'comp_universite_max',
28 'comp_fonctionpub_min', 'comp_fonctionpub_max',
29 'comp_ong_min', 'comp_ong_max',
30 'comp_autre_min', 'comp_autre_max',)
31 widgets = dict(statut_residence=forms.RadioSelect(),
ce110fb9 32 appel=forms.RadioSelect(),
3d627bfd 33 nom=forms.TextInput(attrs={'size': 60},),
34 #devise_min=forms.Select(attrs={'disabled':'disabled'}),
35 #devise_max=forms.Select(attrs={'disabled':'disabled'}),
36 )
5d680e84 37
98d51b59 38 responsable = forms.ModelChoiceField(
139686f2
NC
39 queryset=rh.Poste.objects.select_related(depth=1))
40
5d680e84 41 # La liste des choix est laissée vide. Voir __init__ pour la raison.
5efcd48e 42 poste = forms.ChoiceField(label="Nouveau poste ou évolution du poste",
d949462d 43 choices=(), required=False)
5d680e84 44
6301bd59
OL
45 valeur_point_min = forms.ModelChoiceField(queryset=rh.ValeurPoint.actuelles.all())
46 valeur_point_max = forms.ModelChoiceField(queryset=rh.ValeurPoint.actuelles.all())
47
5d680e84
NC
48 def __init__(self, *args, **kwargs):
49 """ Mise à jour dynamique du contenu du menu des postes.
50
51 Si on ne met le menu à jour de cette façon, à chaque instantiation du
52 formulaire, son contenu est mis en cache par le système et il ne
53 reflète pas les changements apportés par les ajouts, modifications,
54 etc...
55
139686f2
NC
56 Aussi, dans ce cas-ci, on ne peut pas utiliser un ModelChoiceField
57 car le "id" de chaque choix est spécial (voir _poste_choices).
58
5d680e84
NC
59 """
60 super(PosteForm, self).__init__(*args, **kwargs)
61 self.fields['poste'].choices = self._poste_choices()
62
cc3098d0
OL
63 # Quand le dae.Poste n'existe pas, on recherche dans les dossiers rhv1
64 if self.instance and self.instance.id is None:
65 dossiers = self.instance.get_dossiers()
66 if len(dossiers) > 0:
67 self.initial['service'] = dossiers[0].service_id
68
5d680e84
NC
69 def _poste_choices(self):
70 """ Menu déroulant pour les postes.
71
72 Constitué des postes de dae et des postes de rh_v1 qui n'ont pas
73 d'équivalent dans dae.
74
75 """
6d704629 76 dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
5d680e84
NC
77 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
78 id_copies = [p.id_rh_id for p in copies.all()]
6d704629 79 rhv1 = rh.Poste.objects.filter(actif=True).exclude(id__in=id_copies)
139686f2
NC
80 # Optimisation de la requête
81 rhv1 = rhv1.select_related(depth=1)
5d680e84 82
98d51b59 83 return [('', 'Nouveau poste')] + \
5d680e84
NC
84 sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies] +
85 [('rh-%s' % p.id, unicode(p)) for p in rhv1],
86 key=lambda t: t[1])
3ed49093 87
494ff2be
NC
88 def save(self, *args, **kwargs):
89 kwargs2 = kwargs.copy()
90 kwargs2['commit'] = False
91 poste = super(PosteForm, self).save(*args, **kwargs2)
92 # id_rh
93 if 'commit' not in kwargs or kwargs['commit']:
94 poste.save()
95 return poste
96
3ed49093 97
139686f2
NC
98class ChoosePosteForm(forms.ModelForm):
99 class Meta:
100 model = dae.Poste
101 fields = ('poste',)
102
103 # La liste des choix est laissée vide. Voir PosteForm.__init__.
104 poste = forms.ChoiceField(choices=(), required=False)
105
106 def __init__(self, *args, **kwargs):
107 super(ChoosePosteForm, self).__init__(*args, **kwargs)
108 self.fields['poste'].choices = self._poste_choices()
109
110 def _poste_choices(self):
111 """ Menu déroulant pour les postes. """
112 dae_ = dae.Poste.objects.filter(id_rh__isnull=True)
113 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
114 id_copies = [p.id_rh_id for p in copies.all()]
115
98d51b59 116 return [('', '----------')] + \
139686f2
NC
117 sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies],
118 key=lambda t: t[1])
119
120
3ed49093
NC
121class PosteFinancementForm(forms.ModelForm):
122 """ Formulaire des sources de financement pour un poste. """
123 class Meta:
124 model = dae.PosteFinancement
125 fields = ('type', 'montant', 'pourcentage', 'commentaire')
139686f2
NC
126
127
128class EmployeForm(forms.ModelForm):
129 """ Formulaire des employés. """
130 class Meta:
131 model = dae.Employe
132 fields = ('employe', 'nom', 'prenom', 'genre')
133
134 # La liste des choix est laissée vide. Voir Poste.__init__ pour la raison.
135 employe = forms.ChoiceField(choices=(), required=False)
136
137 def __init__(self, *args, **kwargs):
138 """ Mise à jour dynamique du contenu du menu des employés. """
139 super(EmployeForm, self).__init__(*args, **kwargs)
140 self.fields['employe'].choices = self._employe_choices()
141
142 def _employe_choices(self):
143 """ Menu déroulant pour les employés. """
144 dae_ = dae.Employe.objects.filter(id_rh__isnull=True)
145 copies = dae.Employe.objects.exclude(id_rh__isnull=True)
146 id_copies = [p.id_rh_id for p in copies.all()]
147 rhv1 = rh.Employe.objects.exclude(id__in=id_copies)
148
149 return [('', 'Nouvel employé')] + \
150 sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies] +
151 [('rh-%s' % p.id, unicode(p)) for p in rhv1],
152 key=lambda t: t[1])
153
154
155class DossierForm(forms.ModelForm):
156 """ Formulaire des dossiers. """
157 class Meta:
158 model = dae.Dossier