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