5454
[auf_rh_dae.git] / project / dae / decorators.py
CommitLineData
5633fa41
OL
1# -*- encoding: utf-8 -*-
2
c511cd1f 3from django.shortcuts import get_object_or_404
75f0e87b 4
3383b2d1 5from project import groups
acbc95a1 6from project.decorators import redirect_interdiction
86e4bb65 7from project.rh import models as rh
acbc95a1 8
5633fa41 9from project.dae import models as dae
3383b2d1 10from project.dae.groups import dae_groupes
86e4bb65 11from project.dae.workflow import ETATS_EDITABLE, ETATS_VALIDE
b31ce2d7 12
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 """
3383b2d1 18 for g in [g.name for g in user.groups.all()]:
5633fa41
OL
19 if g in dae_groupes:
20 return True
21 return False
22
5633fa41
OL
23def dae_groupe_requis(fn):
24 """
b31ce2d7
EMS
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.
5633fa41
OL
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)
b31ce2d7
EMS
35 else:
36 msg = u"Votre compte ne permet pas d'accéder à cette partie " \
37 u"de l'application."
5633fa41
OL
38 return redirect_interdiction(request, msg)
39 return inner
40
b31ce2d7 41
5633fa41
OL
42def poste_dans_ma_region_ou_service(fn):
43 """
b31ce2d7
EMS
44 Test si le user connecté appartient bien à la même région ou service que
45 le poste.
5633fa41
OL
46 """
47 def inner(request, *args, **kwargs):
48 user = request.user
49 key = kwargs.get('key', None)
f4928bf5
OL
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é
93817ef3 56 if '-' in key:
5633fa41
OL
57 source, id = key.split('-')
58 if source == 'dae':
59 Poste = dae.Poste
93817ef3 60 elif source == 'rh':
5633fa41 61 Poste = rh.Poste
93817ef3
OL
62 else:
63 raise Exception("source inconnue : dae ou rh")
64 else:
5633fa41
OL
65 id = key
66 Poste = dae.Poste
5633fa41 67 postes = Poste.objects.ma_region_ou_service(user).filter(id=id)
5633fa41
OL
68 if len(postes) > 0:
69 return fn(request, *args, **kwargs)
b31ce2d7 70 else:
5633fa41
OL
71 msg = u"Vous n'avez pas le droit de consulter ce poste."
72 return redirect_interdiction(request, msg)
73 return inner
74
b31ce2d7 75
62d3903d
OL
76def dossier_dans_ma_region_ou_service(fn):
77 """
b31ce2d7
EMS
78 Test si le user connecté appartient bien à la même région ou service que
79 le poste.
62d3903d
OL
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
b31ce2d7
EMS
86 # Si on s'intéresse à un dossier, on teste la validation avec le
87 # poste associé
62d3903d 88 if dossier_id is not None:
b31ce2d7
EMS
89 dossiers = dae.Dossier.objects.ma_region_ou_service(user) \
90 .filter(id=dossier_id)
62d3903d
OL
91 if len(dossiers) > 0:
92 return fn(request, *args, **kwargs)
b31ce2d7
EMS
93 else:
94 msg = u"Vous n'avez pas le droit de consulter " \
95 u"ce dossier d'embauche."
62d3903d
OL
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:
b31ce2d7
EMS
103 return poste_dans_ma_region_ou_service(fn)(
104 request, *args, **kwargs
105 )
62d3903d 106 return inner
04380fba 107
b31ce2d7 108
c0492570
OL
109def vieux_dossier_dans_ma_region_ou_service(fn):
110 """
b31ce2d7
EMS
111 Test si le user connecté appartient bien à la même région ou service que
112 le poste.
c0492570
OL
113 """
114 def inner(request, *args, **kwargs):
115 user = request.user
116 dossier_id = kwargs.get('dossier_id', None)
b31ce2d7
EMS
117 dossiers = rh.Dossier.objects.ma_region_ou_service(user) \
118 .filter(id=dossier_id)
3f5cbabe 119 if len(dossiers) > 0:
c0492570 120 return fn(request, *args, **kwargs)
3f5cbabe 121 else:
b31ce2d7
EMS
122 msg = u"Vous n'avez pas le droit de consulter " \
123 u"ce dossier d'embauche."
c0492570
OL
124 return redirect_interdiction(request, msg)
125
c0492570
OL
126 return inner
127
b31ce2d7 128
04380fba
OL
129def 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)
b31ce2d7 140 else:
04380fba
OL
141 msg = u"Vous n'avez pas le droit de consulter cet employé."
142 return redirect_interdiction(request, msg)
c511cd1f 143
04380fba 144 return inner
62cfa562 145
b31ce2d7 146
62cfa562
OL
147def dossier_est_modifiable(fn):
148 def inner(request, *args, **kwargs):
149 dossier_id = kwargs.get('dossier_id', None)
3383b2d1 150 user_groupes = [g.name for g in request.user.groups.all()]
62cfa562
OL
151 if dossier_id is not None:
152 dossier = dae.Dossier.objects.get(id=dossier_id)
c511cd1f 153 if not (dossier.etat in ETATS_EDITABLE and
3383b2d1 154 (groups.DRH_NIVEAU_1 in user_groupes or groups.DRH_NIVEAU_2 in user_groupes or
b31ce2d7
EMS
155 dossier in dae.Dossier.objects \
156 .mes_choses_a_faire(request.user).all())):
62cfa562
OL
157 msg = u"Ce dossier d'embauche ne peut plus être modifié."
158 return redirect_interdiction(request, msg)
62cfa562
OL
159 return fn(request, *args, **kwargs)
160 return inner
6e80b20c 161
b31ce2d7 162
6e80b20c
OL
163def 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)
3383b2d1
OL
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 \
b31ce2d7
EMS
172 (poste.etat not in ETATS_EDITABLE \
173 or poste not in dae.Poste.objects \
174 .mes_choses_a_faire(request.user).all()):
6e80b20c
OL
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
c511cd1f 180
b31ce2d7 181
c511cd1f
EMS
182def 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
3383b2d1 189 user_groupes = [g.name for g in request.user.groups.all()]
7a55f246
OL
190 dossier_de_ma_region =\
191 len(dae.Dossier.objects.ma_region_ou_service(request.user).filter(id=dossier.id)) == 1
192
c511cd1f 193 if not (dossier.etat in ETATS_VALIDE and
7a55f246
OL
194 (groups.DRH_NIVEAU_1 in user_groupes or
195 groups.DRH_NIVEAU_2 in user_groupes or
196 dossier_de_ma_region)):
c511cd1f
EMS
197 return redirect_interdiction(request)
198 return fn(request, contrat, *args, **kwargs)
199 return inner