fix PJ
[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
c511cd1f
EMS
8from django.shortcuts import get_object_or_404
9from workflow import dae_groupes, ETATS_EDITABLE, ETATS_VALIDE, grp_drh
5633fa41 10from project.dae import models as dae
09aa8374 11from project.rh import models as rh
d8cfc3d5 12from utils import get_employe_from_user
5633fa41
OL
13
14def user_in_dae_groupes(user):
15 """
16 Teste si un user Django fait parti des groupes prédéfinis de DAE.
17 """
18 for g in user.groups.all():
19 if g in dae_groupes:
20 return True
21 return False
22
23def redirect_interdiction(request, msg=u"Vous n'avez pas accès à cette page"):
24 """
25 Redirection du la page de login avec un message d'erreur.
26 """
27 from django.conf import settings
28 from django.contrib.auth import REDIRECT_FIELD_NAME
29 from django.utils.http import urlquote
30 login_url = settings.LOGIN_URL
31 path = urlquote(request.get_full_path())
32 tup = login_url, REDIRECT_FIELD_NAME, path
33 messages.add_message(request, messages.ERROR, "Votre compte ne permet pas d'accéder à cette partie de l'application.")
34 return HttpResponseRedirect('%s?%s=%s' % tup)
35
5633fa41
OL
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
5633fa41
OL
52def poste_dans_ma_region_ou_service(fn):
53 """
54 Test si le user connecté appartient bien à la même région ou service que le poste.
55 """
56 def inner(request, *args, **kwargs):
57 user = request.user
58 key = kwargs.get('key', None)
f4928bf5
OL
59
60 # Autoriser la création d'une nouvelle demande
61 if key is None:
62 return fn(request, *args, **kwargs)
63
64 # Rechercher dans la demande, la région ou le service associé
5633fa41
OL
65 try:
66 source, id = key.split('-')
67 if source == 'dae':
68 Poste = dae.Poste
69 if source == 'rh':
70 Poste = rh.Poste
71 except:
72 id = key
73 Poste = dae.Poste
5633fa41 74 postes = Poste.objects.ma_region_ou_service(user).filter(id=id)
5633fa41
OL
75 if len(postes) > 0:
76 return fn(request, *args, **kwargs)
77 else :
78 msg = u"Vous n'avez pas le droit de consulter ce poste."
79 return redirect_interdiction(request, msg)
80 return inner
81
62d3903d
OL
82def dossier_dans_ma_region_ou_service(fn):
83 """
84 Test si le user connecté appartient bien à la même région ou service que le poste.
85 """
86 def inner(request, *args, **kwargs):
87 user = request.user
88 poste_key = kwargs.get('key', None)
89 dossier_id = kwargs.get('dossier_id', None)
90
91 # Si on s'intéresse à un dossier, on teste la validation avec le poste associé
92 if dossier_id is not None:
93 dossiers = dae.Dossier.objects.ma_region_ou_service(user).filter(id=dossier_id)
94 if len(dossiers) > 0:
95 return fn(request, *args, **kwargs)
96 else :
97 msg = u"Vous n'avez pas le droit de consulter ce dossier d'embauche."
98 return redirect_interdiction(request, msg)
99
100 # Autoriser la création d'une nouvelle demande
101 if poste_key is None:
102 return fn(request, *args, **kwargs)
103 # On est en train de répondre à un poste
104 else:
dcc1c26c 105 return poste_dans_ma_region_ou_service(fn)(request, *args, **kwargs)
62d3903d 106 return inner
04380fba 107
c0492570
OL
108def vieux_dossier_dans_ma_region_ou_service(fn):
109 """
110 Test si le user connecté appartient bien à la même région ou service que le poste.
111 """
112 def inner(request, *args, **kwargs):
113 user = request.user
114 dossier_id = kwargs.get('dossier_id', None)
3f5cbabe
OL
115 dossiers = rh.Dossier.objects.ma_region_ou_service(user).filter(id=dossier_id)
116 if len(dossiers) > 0:
c0492570 117 return fn(request, *args, **kwargs)
3f5cbabe 118 else:
c0492570
OL
119 msg = u"Vous n'avez pas le droit de consulter ce dossier d'embauche."
120 return redirect_interdiction(request, msg)
121
122
123 return inner
124
04380fba
OL
125def employe_dans_ma_region_ou_service(fn):
126 """
127 Test d'accès à un employé
128 """
129 def inner(request, *args, **kwargs):
130 from project.dae.forms import _employe_choices
131 liste_employes = _employe_choices(None, request)
132 autorises = [k for k, nom in liste_employes]
133 employe_key = kwargs.get('employe_key')
134 if employe_key in autorises:
135 return fn(request, *args, **kwargs)
136 else :
137 msg = u"Vous n'avez pas le droit de consulter cet employé."
138 return redirect_interdiction(request, msg)
c511cd1f 139
04380fba 140 return inner
62cfa562
OL
141
142def dossier_est_modifiable(fn):
143 def inner(request, *args, **kwargs):
144 dossier_id = kwargs.get('dossier_id', None)
145 if dossier_id is not None:
146 dossier = dae.Dossier.objects.get(id=dossier_id)
c511cd1f
EMS
147 if not (dossier.etat in ETATS_EDITABLE and
148 (grp_drh in request.user.groups.all() or
149 dossier in dae.Dossier.objects.mes_choses_a_faire(request.user).all())):
62cfa562
OL
150 msg = u"Ce dossier d'embauche ne peut plus être modifié."
151 return redirect_interdiction(request, msg)
62cfa562
OL
152 return fn(request, *args, **kwargs)
153 return inner
6e80b20c
OL
154
155def poste_est_modifiable(fn):
156 def inner(request, *args, **kwargs):
157 key = kwargs.get('key', None)
158 if key is not None and key.split('-')[0] == 'dae':
159 poste_id = key.split('-')[1]
160 poste = dae.Poste.objects.get(id=poste_id)
e7ee680f
OL
161 if grp_drh not in request.user.groups.all() and \
162 (poste.etat not in ETATS_EDITABLE or poste not in dae.Poste.objects.mes_choses_a_faire(request.user).all()):
6e80b20c
OL
163 msg = u"Ce poste ne peut plus être modifié."
164 return redirect_interdiction(request, msg)
165
166 return fn(request, *args, **kwargs)
167 return inner
c511cd1f
EMS
168
169def get_contrat(fn):
170 """Ce décorateur s'attend à ce que le premier argument de la vue décorée
171 soit l'ID d'un contrat. Il vérifie les permissions, puis transforme
172 l'ID en objet Contrat."""
173 def inner(request, contrat_id, *args, **kwargs):
174 contrat = get_object_or_404(dae.Contrat, pk=contrat_id)
175 dossier = contrat.dossier
176 if not (dossier.etat in ETATS_VALIDE and
177 (grp_drh in request.user.groups.all() or
178 dossier in dae.Dossier.objects.mes_choses_a_faire(request.user).all())):
179 return redirect_interdiction(request)
180 return fn(request, contrat, *args, **kwargs)
181 return inner