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