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