redirect_interdiction niveau project
[auf_rh_dae.git] / project / dae / decorators.py
1 # -*- encoding: utf-8 -*-
2
3 from django.contrib import messages
4 from django.http import HttpResponseRedirect
5 from django.shortcuts import get_object_or_404
6
7 from project.decorators import redirect_interdiction
8
9 from project.dae.workflow import \
10 dae_groupes, ETATS_EDITABLE, ETATS_VALIDE, grp_drh, grp_drh2
11 from project.dae import models as dae
12 from project.rh import models as rh
13
14
15 def 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
24 def dae_groupe_requis(fn):
25 """
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.
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)
36 else:
37 msg = u"Votre compte ne permet pas d'accéder à cette partie " \
38 u"de l'application."
39 return redirect_interdiction(request, msg)
40 return inner
41
42
43 def poste_dans_ma_region_ou_service(fn):
44 """
45 Test si le user connecté appartient bien à la même région ou service que
46 le poste.
47 """
48 def inner(request, *args, **kwargs):
49 user = request.user
50 key = kwargs.get('key', None)
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é
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
66 postes = Poste.objects.ma_region_ou_service(user).filter(id=id)
67 if len(postes) > 0:
68 return fn(request, *args, **kwargs)
69 else:
70 msg = u"Vous n'avez pas le droit de consulter ce poste."
71 return redirect_interdiction(request, msg)
72 return inner
73
74
75 def dossier_dans_ma_region_ou_service(fn):
76 """
77 Test si le user connecté appartient bien à la même région ou service que
78 le poste.
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
85 # Si on s'intéresse à un dossier, on teste la validation avec le
86 # poste associé
87 if dossier_id is not None:
88 dossiers = dae.Dossier.objects.ma_region_ou_service(user) \
89 .filter(id=dossier_id)
90 if len(dossiers) > 0:
91 return fn(request, *args, **kwargs)
92 else:
93 msg = u"Vous n'avez pas le droit de consulter " \
94 u"ce dossier d'embauche."
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:
102 return poste_dans_ma_region_ou_service(fn)(
103 request, *args, **kwargs
104 )
105 return inner
106
107
108 def 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
111 le poste.
112 """
113 def inner(request, *args, **kwargs):
114 user = request.user
115 dossier_id = kwargs.get('dossier_id', None)
116 dossiers = rh.Dossier.objects.ma_region_ou_service(user) \
117 .filter(id=dossier_id)
118 if len(dossiers) > 0:
119 return fn(request, *args, **kwargs)
120 else:
121 msg = u"Vous n'avez pas le droit de consulter " \
122 u"ce dossier d'embauche."
123 return redirect_interdiction(request, msg)
124
125 return inner
126
127
128 def 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)
139 else:
140 msg = u"Vous n'avez pas le droit de consulter cet employé."
141 return redirect_interdiction(request, msg)
142
143 return inner
144
145
146 def dossier_est_modifiable(fn):
147 def inner(request, *args, **kwargs):
148 dossier_id = kwargs.get('dossier_id', None)
149 user_groupes = request.user.groups.all()
150 if dossier_id is not None:
151 dossier = dae.Dossier.objects.get(id=dossier_id)
152 if not (dossier.etat in ETATS_EDITABLE and
153 (grp_drh in user_groupes or grp_drh2 in user_groupes or
154 dossier in dae.Dossier.objects \
155 .mes_choses_a_faire(request.user).all())):
156 msg = u"Ce dossier d'embauche ne peut plus être modifié."
157 return redirect_interdiction(request, msg)
158 return fn(request, *args, **kwargs)
159 return inner
160
161
162 def 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)
168 if grp_drh not in request.user.groups.all() and \
169 (poste.etat not in ETATS_EDITABLE \
170 or poste not in dae.Poste.objects \
171 .mes_choses_a_faire(request.user).all()):
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
177
178
179 def 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
186 user_groupes = request.user.groups.all()
187 if not (dossier.etat in ETATS_VALIDE and
188 (grp_drh in user_groupes or grp_drh2 in user_groupes or
189 dossier in dae.Dossier.objects \
190 .mes_choses_a_faire(request.user).all())):
191 return redirect_interdiction(request)
192 return fn(request, contrat, *args, **kwargs)
193 return inner