Commit | Line | Data |
---|---|---|
5d680e84 | 1 | # -*- encoding: utf-8 -*- |
ce110fb9 | 2 | |
5d680e84 NC |
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 | |
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. |
d949462d NC |
38 | poste = forms.ChoiceField(label="Nouveau poste, ou évolution du poste", |
39 | choices=(), required=False) | |
5d680e84 NC |
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 | ||
139686f2 NC |
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 | ||
5d680e84 NC |
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(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.exclude(id__in=id_copies) | |
139686f2 NC |
67 | # Optimisation de la requête |
68 | rhv1 = rhv1.select_related(depth=1) | |
5d680e84 | 69 | |
139686f2 | 70 | return [('', 'Nouveau poste')]+ \ |
5d680e84 NC |
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]) | |
3ed49093 | 74 | |
494ff2be NC |
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 | ||
3ed49093 | 84 | |
139686f2 NC |
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 | ||
3ed49093 NC |
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') | |
139686f2 NC |
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 |