b53554cc1b0044fb5ab4e55b63d60617826c8224
1 # -*- encoding: utf-8 -*-
3 from django
.contrib
import messages
4 from django
.http
import HttpResponseRedirect
5 from django
.shortcuts
import get_object_or_404
7 from project
.dae
.workflow
import \
8 dae_groupes
, ETATS_EDITABLE
, ETATS_VALIDE
, grp_drh
, grp_drh2
9 from project
.dae
import models
as dae
10 from project
.rh
import models
as rh
13 def user_in_dae_groupes(user
):
15 Teste si un user Django fait parti des groupes prédéfinis de DAE.
17 for g
in user
.groups
.all():
23 def redirect_interdiction(request
, msg
=u
"Vous n'avez pas accès à cette page"):
25 Redirection du la page de login avec un message d'erreur.
27 from django
.conf
import settings
28 from django
.contrib
.auth
import REDIRECT_FIELD_NAME
29 from django
.utils
.http
import urlquote
30 login_url
= settings
.LOGIN_URL
31 path
= urlquote(request
.get_full_path())
32 tup
= login_url
, REDIRECT_FIELD_NAME
, path
34 request
, messages
.ERROR
,
35 "Votre compte ne permet pas d'accéder à cette partie de l'application."
37 return HttpResponseRedirect('%s?%s=%s' % tup
)
40 def dae_groupe_requis(fn
):
42 L'accès à la plateforme nécessite d'appartenir au moins à un groupe, ou
43 d'être superuser. De cette manière l'autentification AUF fonctionnera
44 toujours, il suffit de mettre le nouvel employé dans le groupe qui le
47 def inner(request
, *args
, **kwargs
):
50 if user
.is_superuser
or user_in_dae_groupes(user
):
51 return fn(request
, *args
, **kwargs
)
53 msg
= u
"Votre compte ne permet pas d'accéder à cette partie " \
55 return redirect_interdiction(request
, msg
)
59 def poste_dans_ma_region_ou_service(fn
):
61 Test si le user connecté appartient bien à la même région ou service que
64 def inner(request
, *args
, **kwargs
):
66 key
= kwargs
.get('key', None)
68 # Autoriser la création d'une nouvelle demande
70 return fn(request
, *args
, **kwargs
)
72 # Rechercher dans la demande, la région ou le service associé
74 source
, id = key
.split('-')
82 postes
= Poste
.objects
.ma_region_ou_service(user
).filter(id=id)
84 return fn(request
, *args
, **kwargs
)
86 msg
= u
"Vous n'avez pas le droit de consulter ce poste."
87 return redirect_interdiction(request
, msg
)
91 def dossier_dans_ma_region_ou_service(fn
):
93 Test si le user connecté appartient bien à la même région ou service que
96 def inner(request
, *args
, **kwargs
):
98 poste_key
= kwargs
.get('key', None)
99 dossier_id
= kwargs
.get('dossier_id', None)
101 # Si on s'intéresse à un dossier, on teste la validation avec le
103 if dossier_id
is not None:
104 dossiers
= dae
.Dossier
.objects
.ma_region_ou_service(user
) \
105 .filter(id=dossier_id
)
106 if len(dossiers
) > 0:
107 return fn(request
, *args
, **kwargs
)
109 msg
= u
"Vous n'avez pas le droit de consulter " \
110 u
"ce dossier d'embauche."
111 return redirect_interdiction(request
, msg
)
113 # Autoriser la création d'une nouvelle demande
114 if poste_key
is None:
115 return fn(request
, *args
, **kwargs
)
116 # On est en train de répondre à un poste
118 return poste_dans_ma_region_ou_service(fn
)(
119 request
, *args
, **kwargs
124 def vieux_dossier_dans_ma_region_ou_service(fn
):
126 Test si le user connecté appartient bien à la même région ou service que
129 def inner(request
, *args
, **kwargs
):
131 dossier_id
= kwargs
.get('dossier_id', None)
132 dossiers
= rh
.Dossier
.objects
.ma_region_ou_service(user
) \
133 .filter(id=dossier_id
)
134 if len(dossiers
) > 0:
135 return fn(request
, *args
, **kwargs
)
137 msg
= u
"Vous n'avez pas le droit de consulter " \
138 u
"ce dossier d'embauche."
139 return redirect_interdiction(request
, msg
)
144 def employe_dans_ma_region_ou_service(fn
):
146 Test d'accès à un employé
148 def inner(request
, *args
, **kwargs
):
149 from project
.dae
.forms
import _employe_choices
150 liste_employes
= _employe_choices(None, request
)
151 autorises
= [k
for k
, nom
in liste_employes
]
152 employe_key
= kwargs
.get('employe_key')
153 if employe_key
in autorises
:
154 return fn(request
, *args
, **kwargs
)
156 msg
= u
"Vous n'avez pas le droit de consulter cet employé."
157 return redirect_interdiction(request
, msg
)
162 def dossier_est_modifiable(fn
):
163 def inner(request
, *args
, **kwargs
):
164 dossier_id
= kwargs
.get('dossier_id', None)
165 user_groupes
= request
.user
.groups
.all()
166 if dossier_id
is not None:
167 dossier
= dae
.Dossier
.objects
.get(id=dossier_id
)
168 if not (dossier
.etat
in ETATS_EDITABLE
and
169 (grp_drh
in user_groupes
or grp_drh2
in user_groupes
or
170 dossier
in dae
.Dossier
.objects \
171 .mes_choses_a_faire(request
.user
).all())):
172 msg
= u
"Ce dossier d'embauche ne peut plus être modifié."
173 return redirect_interdiction(request
, msg
)
174 return fn(request
, *args
, **kwargs
)
178 def poste_est_modifiable(fn
):
179 def inner(request
, *args
, **kwargs
):
180 key
= kwargs
.get('key', None)
181 if key
is not None and key
.split('-')[0] == 'dae':
182 poste_id
= key
.split('-')[1]
183 poste
= dae
.Poste
.objects
.get(id=poste_id
)
184 if grp_drh
not in request
.user
.groups
.all() and \
185 (poste
.etat
not in ETATS_EDITABLE \
186 or poste
not in dae
.Poste
.objects \
187 .mes_choses_a_faire(request
.user
).all()):
188 msg
= u
"Ce poste ne peut plus être modifié."
189 return redirect_interdiction(request
, msg
)
191 return fn(request
, *args
, **kwargs
)
196 """Ce décorateur s'attend à ce que le premier argument de la vue décorée
197 soit l'ID d'un contrat. Il vérifie les permissions, puis transforme
198 l'ID en objet Contrat."""
199 def inner(request
, contrat_id
, *args
, **kwargs
):
200 contrat
= get_object_or_404(dae
.Contrat
, pk
=contrat_id
)
201 dossier
= contrat
.dossier
202 user_groupes
= request
.user
.groups
.all()
203 if not (dossier
.etat
in ETATS_VALIDE
and
204 (grp_drh
in user_groupes
or grp_drh2
in user_groupes
or
205 dossier
in dae
.Dossier
.objects \
206 .mes_choses_a_faire(request
.user
).all())):
207 return redirect_interdiction(request
)
208 return fn(request
, contrat
, *args
, **kwargs
)