1 # -*- encoding: utf-8 -*-
5 from django
.core
.cache
import cache
6 from django
.http
import HttpResponseRedirect
7 from django
.conf
import settings
8 from django
.contrib
import messages
9 from django
.contrib
.auth
import REDIRECT_FIELD_NAME
10 from django
.db
.models
import Q
11 from django
.utils
.http
import urlquote
13 from project
import groups
16 def redirect_interdiction(request
, msg
=u
"Vous n'avez pas accès à cette page"):
18 Redirection du la page de login avec un message d'erreur.
20 login_url
= settings
.LOGIN_URL
21 path
= urlquote(request
.get_full_path())
22 tup
= login_url
, REDIRECT_FIELD_NAME
, path
24 request
, messages
.ERROR
,
25 "Votre compte ne permet pas d'accéder à cette partie de l'application."
27 return HttpResponseRedirect('%s?%s=%s' % tup
)
30 def in_drh_or_admin(user
):
32 Teste si un user Django fait parti du groupe DRH, DRH2 ou s'il est admin
34 key
= "in_drh_or_admin_%s" % user
.id
35 granted
= cache
.get(key
, None)
36 if granted
is not None:
39 user_groups
= [g
.name
for g
in user
.groups
.all()]
40 if user
.is_superuser
or \
41 groups
.DRH_NIVEAU_1
in user_groups
or \
42 groups
.DRH_NIVEAU_2
in user_groups
:
46 cache
.set(key
, granted
)
50 def drh_or_admin_required(fn
):
52 Teste si un user Django fait parti du groupe DRH, DRH2 ou s'il est admin
54 def inner(request
, *args
, **kwargs
):
56 if in_drh_or_admin(user
):
57 return fn(request
, *args
, **kwargs
)
59 msg
= u
"Votre compte ne permet pas d'accéder à " \
60 u
"cette partie de l'application."
61 return redirect_interdiction(request
, msg
)
66 def region_protected(model
):
68 def wrapped(request
, id):
69 if request
.user
.is_superuser
:
70 return func(request
, id)
71 user_groups
= [g
.name
for g
in request
.user
.groups
.all()]
72 if groups
.DRH_NIVEAU_1
in user_groups
or \
73 groups
.DRH_NIVEAU_2
in user_groups
:
74 return func(request
, id)
75 if groups
.CORRESPONDANT_RH
in user_groups
or \
76 groups
.ADMINISTRATEURS
in user_groups
or \
77 groups
.DIRECTEUR_DE_BUREAU
in user_groups
:
78 zones
= groups
.get_zones_from_user(request
.user
)
79 qkey
= '%s__in' % model
.prefix_implantation
80 q
= Q(**{qkey
: zones
})
81 qs
= model
.objects
.filter(q
)
82 if int(id) in [o
.id for o
in qs
]:
83 return func(request
, id)
84 return redirect_interdiction(request
)
89 def in_one_of_group(groups
):
91 Test si le user appartient au moins 1 des ces groupes
94 def wrapped(request
, *args
, **kwargs
):
95 user_groups
= [g
.name
for g
in request
.user
.groups
.all()]
98 return fn(request
, *args
, **kwargs
)
99 msg
= u
"Votre compte ne permet pas d'accéder "\
100 u
"à cette partie de l'application."
101 return redirect_interdiction(request
, msg
)