[#3302] lien poste sur organig + reorg perm reg
[auf_rh_dae.git] / project / decorators.py
CommitLineData
e993f3dc 1# -*- encoding: utf-8 -*-
2"""
3Décorateurs AUF
4"""
e993f3dc 5from django.http import HttpResponseRedirect
02c1b3dc 6from django.conf import settings
acbc95a1 7from django.contrib import messages
02c1b3dc 8from django.contrib.auth import REDIRECT_FIELD_NAME
acbc95a1
DB
9from django.contrib.auth.decorators import user_passes_test
10from django.core.urlresolvers import reverse
02c1b3dc 11from django.utils.http import urlquote
e993f3dc 12
ae99002a 13from project.groups import grp_drh, grp_drh2, grp_correspondants_rh
afd3be54 14from project.groups import get_employe_from_user
ae99002a 15
02c1b3dc
JPC
16
17def redirect_interdiction(request, msg=u"Vous n'avez pas accès à cette page"):
18 """
19 Redirection du la page de login avec un message d'erreur.
20 """
21 login_url = settings.LOGIN_URL
22 path = urlquote(request.get_full_path())
23 tup = login_url, REDIRECT_FIELD_NAME, path
24 messages.add_message(request, messages.ERROR, "Votre compte ne permet pas d'accéder à cette partie de l'application.")
25 return HttpResponseRedirect('%s?%s=%s' % tup)
018c8eaf
DB
26
27def in_drh_or_admin(user):
28 """
29 Teste si un user Django fait parti du groupe DRH, DRH2 ou s'il est admin
30 """
31 groups = user.groups.all()
32 if user.is_superuser or \
33 grp_drh in groups or \
34 grp_drh2 in groups:
35 return True
36 else:
37 return False
38
39def drh_or_admin_required(fn):
40 """
41 Teste si un user Django fait parti du groupe DRH, DRH2 ou s'il est admin
42 """
43 def inner(request, *args, **kwargs):
44 user = request.user
45 if in_drh_or_admin(user):
46 return fn(request, *args, **kwargs)
02c1b3dc 47
018c8eaf
DB
48 msg = u"Votre compte ne permet pas d'accéder à " \
49 u"cette partie de l'application."
50 return redirect_interdiction(request, msg)
02c1b3dc 51
018c8eaf 52 return inner
ae99002a
DB
53
54def region_protected(model):
55 def wrapper(func):
56 def wrapped(request, id):
57 if request.user.is_superuser:
58 return func(request, id)
59 user_groups = request.user.groups.all()
60 if grp_drh in user_groups:
61 return func(request, id)
62 if grp_correspondants_rh in user_groups:
63 employe = get_employe_from_user(request.user)
64 q = Q(**{
65 model.prefix_implantation: employe.implantation.region
66 })
67 qs = model.objects.filter(q)
68 if int(id) in [o.id for o in qs]:
69 return func(request, id)
70 return redirect_interdiction(request)
71 return wrapped
72 return wrapper
82c5e37d
DB
73
74def in_one_of_group(groups):
75 """
76 Test si le user appartient au moins 1 des ces groupes
77 """
78 def wrapper(fn):
79 def wrapped(request, *args, **kwargs):
80 user_groups = request.user.groups.all()
81 for g in user_groups:
82 if g in groups:
83 return fn(request, *args, **kwargs)
84 msg = u"Votre compte ne permet pas d'accéder à cette partie de l'application."
85 return redirect_interdiction(request, msg)
86 return wrapped
87 return wrapper