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