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