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