fix group machinerie
[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 try:
57 source, id = key.split('-')
58 if source == 'dae':
59 Poste = dae.Poste
60 if source == 'rh':
61 Poste = rh.Poste
62 except:
63 id = key
64 Poste = dae.Poste
65 postes = Poste.objects.ma_region_ou_service(user).filter(id=id)
66 if len(postes) > 0:
67 return fn(request, *args, **kwargs)
68 else:
69 msg = u"Vous n'avez pas le droit de consulter ce poste."
70 return redirect_interdiction(request, msg)
71 return inner
72
73
74 def dossier_dans_ma_region_ou_service(fn):
75 """
76 Test si le user connecté appartient bien à la même région ou service que
77 le poste.
78 """
79 def inner(request, *args, **kwargs):
80 user = request.user
81 poste_key = kwargs.get('key', None)
82 dossier_id = kwargs.get('dossier_id', None)
83
84 # Si on s'intéresse à un dossier, on teste la validation avec le
85 # poste associé
86 if dossier_id is not None:
87 dossiers = dae.Dossier.objects.ma_region_ou_service(user) \
88 .filter(id=dossier_id)
89 if len(dossiers) > 0:
90 return fn(request, *args, **kwargs)
91 else:
92 msg = u"Vous n'avez pas le droit de consulter " \
93 u"ce dossier d'embauche."
94 return redirect_interdiction(request, msg)
95
96 # Autoriser la création d'une nouvelle demande
97 if poste_key is None:
98 return fn(request, *args, **kwargs)
99 # On est en train de répondre à un poste
100 else:
101 return poste_dans_ma_region_ou_service(fn)(
102 request, *args, **kwargs
103 )
104 return inner
105
106
107 def vieux_dossier_dans_ma_region_ou_service(fn):
108 """
109 Test si le user connecté appartient bien à la même région ou service que
110 le poste.
111 """
112 def inner(request, *args, **kwargs):
113 user = request.user
114 dossier_id = kwargs.get('dossier_id', None)
115 dossiers = rh.Dossier.objects.ma_region_ou_service(user) \
116 .filter(id=dossier_id)
117 if len(dossiers) > 0:
118 return fn(request, *args, **kwargs)
119 else:
120 msg = u"Vous n'avez pas le droit de consulter " \
121 u"ce dossier d'embauche."
122 return redirect_interdiction(request, msg)
123
124 return inner
125
126
127 def employe_dans_ma_region_ou_service(fn):
128 """
129 Test d'accès à un employé
130 """
131 def inner(request, *args, **kwargs):
132 from project.dae.forms import _employe_choices
133 liste_employes = _employe_choices(None, request)
134 autorises = [k for k, nom in liste_employes]
135 employe_key = kwargs.get('employe_key')
136 if employe_key in autorises:
137 return fn(request, *args, **kwargs)
138 else:
139 msg = u"Vous n'avez pas le droit de consulter cet employé."
140 return redirect_interdiction(request, msg)
141
142 return inner
143
144
145 def dossier_est_modifiable(fn):
146 def inner(request, *args, **kwargs):
147 dossier_id = kwargs.get('dossier_id', None)
148 user_groupes = [g.name for g in request.user.groups.all()]
149 if dossier_id is not None:
150 dossier = dae.Dossier.objects.get(id=dossier_id)
151 if not (dossier.etat in ETATS_EDITABLE and
152 (groups.DRH_NIVEAU_1 in user_groupes or groups.DRH_NIVEAU_2 in user_groupes or
153 dossier in dae.Dossier.objects \
154 .mes_choses_a_faire(request.user).all())):
155 msg = u"Ce dossier d'embauche ne peut plus être modifié."
156 return redirect_interdiction(request, msg)
157 return fn(request, *args, **kwargs)
158 return inner
159
160
161 def poste_est_modifiable(fn):
162 def inner(request, *args, **kwargs):
163 key = kwargs.get('key', None)
164 if key is not None and key.split('-')[0] == 'dae':
165 poste_id = key.split('-')[1]
166 poste = dae.Poste.objects.get(id=poste_id)
167 user_groupes = [g.name for g in request.user.groups.all()]
168 if groups.DRH_NIVEAU_1 not in user_groupes and \
169 groups.DRH_NIVEAU_2 not in user_groupes and \
170 (poste.etat not in ETATS_EDITABLE \
171 or poste not in dae.Poste.objects \
172 .mes_choses_a_faire(request.user).all()):
173 msg = u"Ce poste ne peut plus être modifié."
174 return redirect_interdiction(request, msg)
175
176 return fn(request, *args, **kwargs)
177 return inner
178
179
180 def get_contrat(fn):
181 """Ce décorateur s'attend à ce que le premier argument de la vue décorée
182 soit l'ID d'un contrat. Il vérifie les permissions, puis transforme
183 l'ID en objet Contrat."""
184 def inner(request, contrat_id, *args, **kwargs):
185 contrat = get_object_or_404(dae.Contrat, pk=contrat_id)
186 dossier = contrat.dossier
187 user_groupes = [g.name for g in request.user.groups.all()]
188 if not (dossier.etat in ETATS_VALIDE and
189 (groups.DRH_NIVEAU_1 in user_groupes or groups.DRH_NIVEAU_2 in user_groupes or
190 dossier in dae.Dossier.objects \
191 .mes_choses_a_faire(request.user).all())):
192 return redirect_interdiction(request)
193 return fn(request, contrat, *args, **kwargs)
194 return inner