b53554cc1b0044fb5ab4e55b63d60617826c8224
[auf_rh_dae.git] / project / dae / decorators.py
1 # -*- encoding: utf-8 -*-
2
3 from django.contrib import messages
4 from django.http import HttpResponseRedirect
5 from django.shortcuts import get_object_or_404
6
7 from project.dae.workflow import \
8 dae_groupes, ETATS_EDITABLE, ETATS_VALIDE, grp_drh, grp_drh2
9 from project.dae import models as dae
10 from project.rh import models as rh
11
12
13 def 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
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(
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
39
40 def dae_groupe_requis(fn):
41 """
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.
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)
52 else:
53 msg = u"Votre compte ne permet pas d'accéder à cette partie " \
54 u"de l'application."
55 return redirect_interdiction(request, msg)
56 return inner
57
58
59 def poste_dans_ma_region_ou_service(fn):
60 """
61 Test si le user connecté appartient bien à la même région ou service que
62 le poste.
63 """
64 def inner(request, *args, **kwargs):
65 user = request.user
66 key = kwargs.get('key', None)
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é
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
82 postes = Poste.objects.ma_region_ou_service(user).filter(id=id)
83 if len(postes) > 0:
84 return fn(request, *args, **kwargs)
85 else:
86 msg = u"Vous n'avez pas le droit de consulter ce poste."
87 return redirect_interdiction(request, msg)
88 return inner
89
90
91 def dossier_dans_ma_region_ou_service(fn):
92 """
93 Test si le user connecté appartient bien à la même région ou service que
94 le poste.
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
101 # Si on s'intéresse à un dossier, on teste la validation avec le
102 # poste associé
103 if dossier_id is not None:
104 dossiers = dae.Dossier.objects.ma_region_ou_service(user) \
105 .filter(id=dossier_id)
106 if len(dossiers) > 0:
107 return fn(request, *args, **kwargs)
108 else:
109 msg = u"Vous n'avez pas le droit de consulter " \
110 u"ce dossier d'embauche."
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:
118 return poste_dans_ma_region_ou_service(fn)(
119 request, *args, **kwargs
120 )
121 return inner
122
123
124 def vieux_dossier_dans_ma_region_ou_service(fn):
125 """
126 Test si le user connecté appartient bien à la même région ou service que
127 le poste.
128 """
129 def inner(request, *args, **kwargs):
130 user = request.user
131 dossier_id = kwargs.get('dossier_id', None)
132 dossiers = rh.Dossier.objects.ma_region_ou_service(user) \
133 .filter(id=dossier_id)
134 if len(dossiers) > 0:
135 return fn(request, *args, **kwargs)
136 else:
137 msg = u"Vous n'avez pas le droit de consulter " \
138 u"ce dossier d'embauche."
139 return redirect_interdiction(request, msg)
140
141 return inner
142
143
144 def 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)
155 else:
156 msg = u"Vous n'avez pas le droit de consulter cet employé."
157 return redirect_interdiction(request, msg)
158
159 return inner
160
161
162 def dossier_est_modifiable(fn):
163 def inner(request, *args, **kwargs):
164 dossier_id = kwargs.get('dossier_id', None)
165 user_groupes = request.user.groups.all()
166 if dossier_id is not None:
167 dossier = dae.Dossier.objects.get(id=dossier_id)
168 if not (dossier.etat in ETATS_EDITABLE and
169 (grp_drh in user_groupes or grp_drh2 in user_groupes or
170 dossier in dae.Dossier.objects \
171 .mes_choses_a_faire(request.user).all())):
172 msg = u"Ce dossier d'embauche ne peut plus être modifié."
173 return redirect_interdiction(request, msg)
174 return fn(request, *args, **kwargs)
175 return inner
176
177
178 def 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)
184 if grp_drh not in request.user.groups.all() and \
185 (poste.etat not in ETATS_EDITABLE \
186 or poste not in dae.Poste.objects \
187 .mes_choses_a_faire(request.user).all()):
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
193
194
195 def 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
202 user_groupes = request.user.groups.all()
203 if not (dossier.etat in ETATS_VALIDE and
204 (grp_drh in user_groupes or grp_drh2 in user_groupes or
205 dossier in dae.Dossier.objects \
206 .mes_choses_a_faire(request.user).all())):
207 return redirect_interdiction(request)
208 return fn(request, contrat, *args, **kwargs)
209 return inner