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