selects : filter et ordering
[auf_rh_dae.git] / project / dae / forms.py
1 # -*- encoding: utf-8 -*-
2
3 from django import forms
4
5 from datamaster_modeles import models as ref
6
7 from dae import models as dae
8 from rh_v1 import models as rh
9
10
11 class PosteForm(forms.ModelForm):
12 """ Formulaire des postes. """
13 class Meta:
14 model = dae.Poste
15
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(),
30 appel=forms.RadioSelect(),
31 nom=forms.TextInput(attrs={'size': 60 }),
32 )
33
34 responsable=forms.ModelChoiceField(
35 queryset=rh.Poste.objects.select_related(depth=1))
36
37 # La liste des choix est laissée vide. Voir __init__ pour la raison.
38 poste = forms.ChoiceField(label="Nouveau poste, ou évolution du poste",
39 choices=(), required=False)
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
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
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 """
63 dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
64 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
65 id_copies = [p.id_rh_id for p in copies.all()]
66 rhv1 = rh.Poste.objects.filter(actif=True).exclude(id__in=id_copies)
67 # Optimisation de la requête
68 rhv1 = rhv1.select_related(depth=1)
69
70 return [('', 'Nouveau poste')]+ \
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])
74
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
84
85 class 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
103 return [('', '----------')]+ \
104 sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies],
105 key=lambda t: t[1])
106
107
108 class 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')
113
114
115 class 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
142 class DossierForm(forms.ModelForm):
143 """ Formulaire des dossiers. """
144 class Meta:
145 model = dae.Dossier