0.5.4 auth
[auf_rh_dae.git] / project / dae / decorators.py
CommitLineData
5633fa41
OL
1# -*- encoding: utf-8 -*-
2
c0492570 3from django.db.models import Q
5633fa41
OL
4from django.contrib import messages
5from django.contrib.auth.decorators import user_passes_test
6from django.core.urlresolvers import reverse
7from django.http import HttpResponseRedirect
c0492570 8from workflow import dae_groupes, ETATS_EDITABLE, grp_drh
5633fa41
OL
9from project.dae import models as dae
10from project.rh_v1 import models as rh
d8cfc3d5 11from utils import get_employe_from_user
5633fa41
OL
12
13def 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
22def 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(request, messages.ERROR, "Votre compte ne permet pas d'accéder à cette partie de l'application.")
33 return HttpResponseRedirect('%s?%s=%s' % tup)
34
35
36def dae_groupe_requis(fn):
37 """
38 L'accès à la plateforme nécessite d'appartenir au moins à un groupe,
39 ou d'être superuser. De cette manière l'autentification AUF fonctionnera
40 toujours, il suffit de mettre le nouvel employé dans le groupe qui le concerne.
41 """
42 def inner(request, *args, **kwargs):
43 user = request.user
44
45 if user.is_superuser or user_in_dae_groupes(user):
46 return fn(request, *args, **kwargs)
47 else :
48 msg = u"Votre compte ne permet pas d'accéder à cette partie de l'application."
49 return redirect_interdiction(request, msg)
50 return inner
51
52
53def poste_dans_ma_region_ou_service(fn):
54 """
55 Test si le user connecté appartient bien à la même région ou service que le poste.
56 """
57 def inner(request, *args, **kwargs):
58 user = request.user
59 key = kwargs.get('key', None)
f4928bf5
OL
60
61 # Autoriser la création d'une nouvelle demande
62 if key is None:
63 return fn(request, *args, **kwargs)
64
65 # Rechercher dans la demande, la région ou le service associé
5633fa41
OL
66 try:
67 source, id = key.split('-')
68 if source == 'dae':
69 Poste = dae.Poste
70 if source == 'rh':
71 Poste = rh.Poste
72 except:
73 id = key
74 Poste = dae.Poste
5633fa41 75 postes = Poste.objects.ma_region_ou_service(user).filter(id=id)
5633fa41
OL
76 if len(postes) > 0:
77 return fn(request, *args, **kwargs)
78 else :
79 msg = u"Vous n'avez pas le droit de consulter ce poste."
80 return redirect_interdiction(request, msg)
81 return inner
82
83
62d3903d
OL
84def dossier_dans_ma_region_ou_service(fn):
85 """
86 Test si le user connecté appartient bien à la même région ou service que le poste.
87 """
88 def inner(request, *args, **kwargs):
89 user = request.user
90 poste_key = kwargs.get('key', None)
91 dossier_id = kwargs.get('dossier_id', None)
92
93 # Si on s'intéresse à un dossier, on teste la validation avec le poste associé
94 if dossier_id is not None:
95 dossiers = dae.Dossier.objects.ma_region_ou_service(user).filter(id=dossier_id)
96 if len(dossiers) > 0:
97 return fn(request, *args, **kwargs)
98 else :
99 msg = u"Vous n'avez pas le droit de consulter ce dossier d'embauche."
100 return redirect_interdiction(request, msg)
101
102 # Autoriser la création d'une nouvelle demande
103 if poste_key is None:
104 return fn(request, *args, **kwargs)
105 # On est en train de répondre à un poste
106 else:
dcc1c26c 107 return poste_dans_ma_region_ou_service(fn)(request, *args, **kwargs)
62d3903d 108 return inner
04380fba 109
c0492570
OL
110def vieux_dossier_dans_ma_region_ou_service(fn):
111 """
112 Test si le user connecté appartient bien à la même région ou service que le poste.
113 """
114 def inner(request, *args, **kwargs):
115 user = request.user
116 dossier_id = kwargs.get('dossier_id', None)
117
118 employe = get_employe_from_user(request.user)
119 prefixe_implantation = 'poste1__implantation'
120
d8cfc3d5
OL
121 #if is_user_dans_service(request.user):
122 # q_place = Q(**{ '%s' % prefixe_implantation : employe.implantation })
123 #else:
124 # q_place = Q(**{ '%s__region' % prefixe_implantation : employe.implantation.region })
125
126 q_place = Q(**{ '%s__region' % prefixe_implantation : employe.implantation.region })
c0492570
OL
127
128
129 if grp_drh in request.user.groups.all():
130 q_filtre = Q(id=dossier_id)
131 else:
132 q_filtre = q_place & Q(id=dossier_id)
133
134 try:
135 dossier = rh.Dossier.objects.get(q_filtre)
136 return fn(request, *args, **kwargs)
137 except Exception, e:
138 msg = u"Vous n'avez pas le droit de consulter ce dossier d'embauche."
139 return redirect_interdiction(request, msg)
140
141
142 return inner
143
04380fba
OL
144def 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
62cfa562
OL
160
161def dossier_est_modifiable(fn):
162 def inner(request, *args, **kwargs):
163 dossier_id = kwargs.get('dossier_id', None)
164 if dossier_id is not None:
165 dossier = dae.Dossier.objects.get(id=dossier_id)
166 if dossier.etat not in ETATS_EDITABLE:
167 msg = u"Ce dossier d'embauche ne peut plus être modifié."
168 return redirect_interdiction(request, msg)
169
170 return fn(request, *args, **kwargs)
171 return inner
6e80b20c
OL
172
173def poste_est_modifiable(fn):
174 def inner(request, *args, **kwargs):
175 key = kwargs.get('key', None)
176 if key is not None and key.split('-')[0] == 'dae':
177 poste_id = key.split('-')[1]
178 poste = dae.Poste.objects.get(id=poste_id)
179 if poste.etat not in ETATS_EDITABLE:
180 msg = u"Ce poste ne peut plus être modifié."
181 return redirect_interdiction(request, msg)
182
183 return fn(request, *args, **kwargs)
184 return inner