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