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