redirect_interdiction niveau project
[auf_rh_dae.git] / project / dae / decorators.py
CommitLineData
5633fa41
OL
1# -*- encoding: utf-8 -*-
2
3from django.contrib import messages
5633fa41 4from django.http import HttpResponseRedirect
c511cd1f 5from django.shortcuts import get_object_or_404
75f0e87b 6
acbc95a1
DB
7from project.decorators import redirect_interdiction
8
b31ce2d7
EMS
9from project.dae.workflow import \
10 dae_groupes, ETATS_EDITABLE, ETATS_VALIDE, grp_drh, grp_drh2
5633fa41 11from project.dae import models as dae
09aa8374 12from project.rh import models as rh
b31ce2d7 13
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
5633fa41
OL
24def dae_groupe_requis(fn):
25 """
b31ce2d7
EMS
26 L'accès à la plateforme nécessite d'appartenir au moins à un groupe, ou
27 d'être superuser. De cette manière l'autentification AUF fonctionnera
28 toujours, il suffit de mettre le nouvel employé dans le groupe qui le
29 concerne.
5633fa41
OL
30 """
31 def inner(request, *args, **kwargs):
32 user = request.user
33
34 if user.is_superuser or user_in_dae_groupes(user):
35 return fn(request, *args, **kwargs)
b31ce2d7
EMS
36 else:
37 msg = u"Votre compte ne permet pas d'accéder à cette partie " \
38 u"de l'application."
5633fa41
OL
39 return redirect_interdiction(request, msg)
40 return inner
41
b31ce2d7 42
5633fa41
OL
43def poste_dans_ma_region_ou_service(fn):
44 """
b31ce2d7
EMS
45 Test si le user connecté appartient bien à la même région ou service que
46 le poste.
5633fa41
OL
47 """
48 def inner(request, *args, **kwargs):
49 user = request.user
50 key = kwargs.get('key', None)
f4928bf5
OL
51
52 # Autoriser la création d'une nouvelle demande
53 if key is None:
54 return fn(request, *args, **kwargs)
55
56 # Rechercher dans la demande, la région ou le service associé
5633fa41
OL
57 try:
58 source, id = key.split('-')
59 if source == 'dae':
60 Poste = dae.Poste
61 if source == 'rh':
62 Poste = rh.Poste
63 except:
64 id = key
65 Poste = dae.Poste
5633fa41 66 postes = Poste.objects.ma_region_ou_service(user).filter(id=id)
5633fa41
OL
67 if len(postes) > 0:
68 return fn(request, *args, **kwargs)
b31ce2d7 69 else:
5633fa41
OL
70 msg = u"Vous n'avez pas le droit de consulter ce poste."
71 return redirect_interdiction(request, msg)
72 return inner
73
b31ce2d7 74
62d3903d
OL
75def dossier_dans_ma_region_ou_service(fn):
76 """
b31ce2d7
EMS
77 Test si le user connecté appartient bien à la même région ou service que
78 le poste.
62d3903d
OL
79 """
80 def inner(request, *args, **kwargs):
81 user = request.user
82 poste_key = kwargs.get('key', None)
83 dossier_id = kwargs.get('dossier_id', None)
84
b31ce2d7
EMS
85 # Si on s'intéresse à un dossier, on teste la validation avec le
86 # poste associé
62d3903d 87 if dossier_id is not None:
b31ce2d7
EMS
88 dossiers = dae.Dossier.objects.ma_region_ou_service(user) \
89 .filter(id=dossier_id)
62d3903d
OL
90 if len(dossiers) > 0:
91 return fn(request, *args, **kwargs)
b31ce2d7
EMS
92 else:
93 msg = u"Vous n'avez pas le droit de consulter " \
94 u"ce dossier d'embauche."
62d3903d
OL
95 return redirect_interdiction(request, msg)
96
97 # Autoriser la création d'une nouvelle demande
98 if poste_key is None:
99 return fn(request, *args, **kwargs)
100 # On est en train de répondre à un poste
101 else:
b31ce2d7
EMS
102 return poste_dans_ma_region_ou_service(fn)(
103 request, *args, **kwargs
104 )
62d3903d 105 return inner
04380fba 106
b31ce2d7 107
c0492570
OL
108def vieux_dossier_dans_ma_region_ou_service(fn):
109 """
b31ce2d7
EMS
110 Test si le user connecté appartient bien à la même région ou service que
111 le poste.
c0492570
OL
112 """
113 def inner(request, *args, **kwargs):
114 user = request.user
115 dossier_id = kwargs.get('dossier_id', None)
b31ce2d7
EMS
116 dossiers = rh.Dossier.objects.ma_region_ou_service(user) \
117 .filter(id=dossier_id)
3f5cbabe 118 if len(dossiers) > 0:
c0492570 119 return fn(request, *args, **kwargs)
3f5cbabe 120 else:
b31ce2d7
EMS
121 msg = u"Vous n'avez pas le droit de consulter " \
122 u"ce dossier d'embauche."
c0492570
OL
123 return redirect_interdiction(request, msg)
124
c0492570
OL
125 return inner
126
b31ce2d7 127
04380fba
OL
128def employe_dans_ma_region_ou_service(fn):
129 """
130 Test d'accès à un employé
131 """
132 def inner(request, *args, **kwargs):
133 from project.dae.forms import _employe_choices
134 liste_employes = _employe_choices(None, request)
135 autorises = [k for k, nom in liste_employes]
136 employe_key = kwargs.get('employe_key')
137 if employe_key in autorises:
138 return fn(request, *args, **kwargs)
b31ce2d7 139 else:
04380fba
OL
140 msg = u"Vous n'avez pas le droit de consulter cet employé."
141 return redirect_interdiction(request, msg)
c511cd1f 142
04380fba 143 return inner
62cfa562 144
b31ce2d7 145
62cfa562
OL
146def dossier_est_modifiable(fn):
147 def inner(request, *args, **kwargs):
148 dossier_id = kwargs.get('dossier_id', None)
9857b749 149 user_groupes = request.user.groups.all()
62cfa562
OL
150 if dossier_id is not None:
151 dossier = dae.Dossier.objects.get(id=dossier_id)
c511cd1f 152 if not (dossier.etat in ETATS_EDITABLE and
9857b749 153 (grp_drh in user_groupes or grp_drh2 in user_groupes or
b31ce2d7
EMS
154 dossier in dae.Dossier.objects \
155 .mes_choses_a_faire(request.user).all())):
62cfa562
OL
156 msg = u"Ce dossier d'embauche ne peut plus être modifié."
157 return redirect_interdiction(request, msg)
62cfa562
OL
158 return fn(request, *args, **kwargs)
159 return inner
6e80b20c 160
b31ce2d7 161
6e80b20c
OL
162def poste_est_modifiable(fn):
163 def inner(request, *args, **kwargs):
164 key = kwargs.get('key', None)
165 if key is not None and key.split('-')[0] == 'dae':
166 poste_id = key.split('-')[1]
167 poste = dae.Poste.objects.get(id=poste_id)
e7ee680f 168 if grp_drh not in request.user.groups.all() and \
b31ce2d7
EMS
169 (poste.etat not in ETATS_EDITABLE \
170 or poste not in dae.Poste.objects \
171 .mes_choses_a_faire(request.user).all()):
6e80b20c
OL
172 msg = u"Ce poste ne peut plus être modifié."
173 return redirect_interdiction(request, msg)
174
175 return fn(request, *args, **kwargs)
176 return inner
c511cd1f 177
b31ce2d7 178
c511cd1f
EMS
179def get_contrat(fn):
180 """Ce décorateur s'attend à ce que le premier argument de la vue décorée
181 soit l'ID d'un contrat. Il vérifie les permissions, puis transforme
182 l'ID en objet Contrat."""
183 def inner(request, contrat_id, *args, **kwargs):
184 contrat = get_object_or_404(dae.Contrat, pk=contrat_id)
185 dossier = contrat.dossier
9857b749 186 user_groupes = request.user.groups.all()
c511cd1f 187 if not (dossier.etat in ETATS_VALIDE and
9857b749 188 (grp_drh in user_groupes or grp_drh2 in user_groupes or
b31ce2d7
EMS
189 dossier in dae.Dossier.objects \
190 .mes_choses_a_faire(request.user).all())):
c511cd1f
EMS
191 return redirect_interdiction(request)
192 return fn(request, contrat, *args, **kwargs)
193 return inner