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