Commit | Line | Data |
---|---|---|
5633fa41 OL |
1 | # -*- encoding: utf-8 -*- |
2 | ||
c511cd1f | 3 | from django.shortcuts import get_object_or_404 |
75f0e87b | 4 | |
3383b2d1 | 5 | from project import groups |
acbc95a1 | 6 | from project.decorators import redirect_interdiction |
86e4bb65 | 7 | from project.rh import models as rh |
acbc95a1 | 8 | |
5633fa41 | 9 | from project.dae import models as dae |
3383b2d1 | 10 | from project.dae.groups import dae_groupes |
86e4bb65 | 11 | from project.dae.workflow import ETATS_EDITABLE, ETATS_VALIDE |
b31ce2d7 | 12 | |
5633fa41 OL |
13 | |
14 | def user_in_dae_groupes(user): | |
15 | """ | |
16 | Teste si un user Django fait parti des groupes prédéfinis de DAE. | |
17 | """ | |
3383b2d1 | 18 | for g in [g.name for g in user.groups.all()]: |
5633fa41 OL |
19 | if g in dae_groupes: |
20 | return True | |
21 | return False | |
22 | ||
5633fa41 OL |
23 | def dae_groupe_requis(fn): |
24 | """ | |
b31ce2d7 EMS |
25 | L'accès à la plateforme nécessite d'appartenir au moins à un groupe, ou |
26 | d'être superuser. De cette manière l'autentification AUF fonctionnera | |
27 | toujours, il suffit de mettre le nouvel employé dans le groupe qui le | |
28 | concerne. | |
5633fa41 OL |
29 | """ |
30 | def inner(request, *args, **kwargs): | |
31 | user = request.user | |
32 | ||
33 | if user.is_superuser or user_in_dae_groupes(user): | |
34 | return fn(request, *args, **kwargs) | |
b31ce2d7 EMS |
35 | else: |
36 | msg = u"Votre compte ne permet pas d'accéder à cette partie " \ | |
37 | u"de l'application." | |
5633fa41 OL |
38 | return redirect_interdiction(request, msg) |
39 | return inner | |
40 | ||
b31ce2d7 | 41 | |
5633fa41 OL |
42 | def poste_dans_ma_region_ou_service(fn): |
43 | """ | |
b31ce2d7 EMS |
44 | Test si le user connecté appartient bien à la même région ou service que |
45 | le poste. | |
5633fa41 OL |
46 | """ |
47 | def inner(request, *args, **kwargs): | |
48 | user = request.user | |
49 | key = kwargs.get('key', None) | |
f4928bf5 OL |
50 | |
51 | # Autoriser la création d'une nouvelle demande | |
52 | if key is None: | |
53 | return fn(request, *args, **kwargs) | |
54 | ||
55 | # Rechercher dans la demande, la région ou le service associé | |
93817ef3 | 56 | if '-' in key: |
5633fa41 OL |
57 | source, id = key.split('-') |
58 | if source == 'dae': | |
59 | Poste = dae.Poste | |
93817ef3 | 60 | elif source == 'rh': |
5633fa41 | 61 | Poste = rh.Poste |
93817ef3 OL |
62 | else: |
63 | raise Exception("source inconnue : dae ou rh") | |
64 | else: | |
5633fa41 OL |
65 | id = key |
66 | Poste = dae.Poste | |
5633fa41 | 67 | postes = Poste.objects.ma_region_ou_service(user).filter(id=id) |
5633fa41 OL |
68 | if len(postes) > 0: |
69 | return fn(request, *args, **kwargs) | |
b31ce2d7 | 70 | else: |
5633fa41 OL |
71 | msg = u"Vous n'avez pas le droit de consulter ce poste." |
72 | return redirect_interdiction(request, msg) | |
73 | return inner | |
74 | ||
b31ce2d7 | 75 | |
62d3903d OL |
76 | def dossier_dans_ma_region_ou_service(fn): |
77 | """ | |
b31ce2d7 EMS |
78 | Test si le user connecté appartient bien à la même région ou service que |
79 | le poste. | |
62d3903d OL |
80 | """ |
81 | def inner(request, *args, **kwargs): | |
82 | user = request.user | |
83 | poste_key = kwargs.get('key', None) | |
84 | dossier_id = kwargs.get('dossier_id', None) | |
85 | ||
b31ce2d7 EMS |
86 | # Si on s'intéresse à un dossier, on teste la validation avec le |
87 | # poste associé | |
62d3903d | 88 | if dossier_id is not None: |
b31ce2d7 EMS |
89 | dossiers = dae.Dossier.objects.ma_region_ou_service(user) \ |
90 | .filter(id=dossier_id) | |
62d3903d OL |
91 | if len(dossiers) > 0: |
92 | return fn(request, *args, **kwargs) | |
b31ce2d7 EMS |
93 | else: |
94 | msg = u"Vous n'avez pas le droit de consulter " \ | |
95 | u"ce dossier d'embauche." | |
62d3903d OL |
96 | return redirect_interdiction(request, msg) |
97 | ||
98 | # Autoriser la création d'une nouvelle demande | |
99 | if poste_key is None: | |
100 | return fn(request, *args, **kwargs) | |
101 | # On est en train de répondre à un poste | |
102 | else: | |
b31ce2d7 EMS |
103 | return poste_dans_ma_region_ou_service(fn)( |
104 | request, *args, **kwargs | |
105 | ) | |
62d3903d | 106 | return inner |
04380fba | 107 | |
b31ce2d7 | 108 | |
c0492570 OL |
109 | def vieux_dossier_dans_ma_region_ou_service(fn): |
110 | """ | |
b31ce2d7 EMS |
111 | Test si le user connecté appartient bien à la même région ou service que |
112 | le poste. | |
c0492570 OL |
113 | """ |
114 | def inner(request, *args, **kwargs): | |
115 | user = request.user | |
116 | dossier_id = kwargs.get('dossier_id', None) | |
b31ce2d7 EMS |
117 | dossiers = rh.Dossier.objects.ma_region_ou_service(user) \ |
118 | .filter(id=dossier_id) | |
3f5cbabe | 119 | if len(dossiers) > 0: |
c0492570 | 120 | return fn(request, *args, **kwargs) |
3f5cbabe | 121 | else: |
b31ce2d7 EMS |
122 | msg = u"Vous n'avez pas le droit de consulter " \ |
123 | u"ce dossier d'embauche." | |
c0492570 OL |
124 | return redirect_interdiction(request, msg) |
125 | ||
c0492570 OL |
126 | return inner |
127 | ||
b31ce2d7 | 128 | |
04380fba OL |
129 | def employe_dans_ma_region_ou_service(fn): |
130 | """ | |
131 | Test d'accès à un employé | |
132 | """ | |
133 | def inner(request, *args, **kwargs): | |
134 | from project.dae.forms import _employe_choices | |
135 | liste_employes = _employe_choices(None, request) | |
136 | autorises = [k for k, nom in liste_employes] | |
137 | employe_key = kwargs.get('employe_key') | |
138 | if employe_key in autorises: | |
139 | return fn(request, *args, **kwargs) | |
b31ce2d7 | 140 | else: |
04380fba OL |
141 | msg = u"Vous n'avez pas le droit de consulter cet employé." |
142 | return redirect_interdiction(request, msg) | |
c511cd1f | 143 | |
04380fba | 144 | return inner |
62cfa562 | 145 | |
b31ce2d7 | 146 | |
62cfa562 OL |
147 | def dossier_est_modifiable(fn): |
148 | def inner(request, *args, **kwargs): | |
149 | dossier_id = kwargs.get('dossier_id', None) | |
3383b2d1 | 150 | user_groupes = [g.name for g in request.user.groups.all()] |
62cfa562 OL |
151 | if dossier_id is not None: |
152 | dossier = dae.Dossier.objects.get(id=dossier_id) | |
c511cd1f | 153 | if not (dossier.etat in ETATS_EDITABLE and |
3383b2d1 | 154 | (groups.DRH_NIVEAU_1 in user_groupes or groups.DRH_NIVEAU_2 in user_groupes or |
b31ce2d7 EMS |
155 | dossier in dae.Dossier.objects \ |
156 | .mes_choses_a_faire(request.user).all())): | |
62cfa562 OL |
157 | msg = u"Ce dossier d'embauche ne peut plus être modifié." |
158 | return redirect_interdiction(request, msg) | |
62cfa562 OL |
159 | return fn(request, *args, **kwargs) |
160 | return inner | |
6e80b20c | 161 | |
b31ce2d7 | 162 | |
6e80b20c OL |
163 | def poste_est_modifiable(fn): |
164 | def inner(request, *args, **kwargs): | |
165 | key = kwargs.get('key', None) | |
166 | if key is not None and key.split('-')[0] == 'dae': | |
167 | poste_id = key.split('-')[1] | |
168 | poste = dae.Poste.objects.get(id=poste_id) | |
3383b2d1 OL |
169 | user_groupes = [g.name for g in request.user.groups.all()] |
170 | if groups.DRH_NIVEAU_1 not in user_groupes and \ | |
171 | groups.DRH_NIVEAU_2 not in user_groupes and \ | |
b31ce2d7 EMS |
172 | (poste.etat not in ETATS_EDITABLE \ |
173 | or poste not in dae.Poste.objects \ | |
174 | .mes_choses_a_faire(request.user).all()): | |
6e80b20c OL |
175 | msg = u"Ce poste ne peut plus être modifié." |
176 | return redirect_interdiction(request, msg) | |
177 | ||
178 | return fn(request, *args, **kwargs) | |
179 | return inner | |
c511cd1f | 180 | |
b31ce2d7 | 181 | |
c511cd1f EMS |
182 | def get_contrat(fn): |
183 | """Ce décorateur s'attend à ce que le premier argument de la vue décorée | |
184 | soit l'ID d'un contrat. Il vérifie les permissions, puis transforme | |
185 | l'ID en objet Contrat.""" | |
186 | def inner(request, contrat_id, *args, **kwargs): | |
187 | contrat = get_object_or_404(dae.Contrat, pk=contrat_id) | |
188 | dossier = contrat.dossier | |
3383b2d1 | 189 | user_groupes = [g.name for g in request.user.groups.all()] |
7a55f246 OL |
190 | dossier_de_ma_region =\ |
191 | len(dae.Dossier.objects.ma_region_ou_service(request.user).filter(id=dossier.id)) == 1 | |
192 | ||
c511cd1f | 193 | if not (dossier.etat in ETATS_VALIDE and |
7a55f246 OL |
194 | (groups.DRH_NIVEAU_1 in user_groupes or |
195 | groups.DRH_NIVEAU_2 in user_groupes or | |
196 | dossier_de_ma_region)): | |
c511cd1f EMS |
197 | return redirect_interdiction(request) |
198 | return fn(request, contrat, *args, **kwargs) | |
199 | return inner |