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