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