cdfda268ba1b40ec2fe990b55c958c9dbedfcad2
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
.decorators
import redirect_interdiction
8 from project
.rh
import models
as rh
10 from project
.dae
import models
as dae
11 from project
.dae
.groups
import dae_groupes
, grp_drh
, grp_drh2
12 from project
.dae
.workflow
import ETATS_EDITABLE
, ETATS_VALIDE
15 def user_in_dae_groupes(user
):
17 Teste si un user Django fait parti des groupes prédéfinis de DAE.
19 for g
in user
.groups
.all():
24 def dae_groupe_requis(fn
):
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
31 def inner(request
, *args
, **kwargs
):
34 if user
.is_superuser
or user_in_dae_groupes(user
):
35 return fn(request
, *args
, **kwargs
)
37 msg
= u
"Votre compte ne permet pas d'accéder à cette partie " \
39 return redirect_interdiction(request
, msg
)
43 def poste_dans_ma_region_ou_service(fn
):
45 Test si le user connecté appartient bien à la même région ou service que
48 def inner(request
, *args
, **kwargs
):
50 key
= kwargs
.get('key', None)
52 # Autoriser la création d'une nouvelle demande
54 return fn(request
, *args
, **kwargs
)
56 # Rechercher dans la demande, la région ou le service associé
58 source
, id = key
.split('-')
66 postes
= Poste
.objects
.ma_region_ou_service(user
).filter(id=id)
68 return fn(request
, *args
, **kwargs
)
70 msg
= u
"Vous n'avez pas le droit de consulter ce poste."
71 return redirect_interdiction(request
, msg
)
75 def dossier_dans_ma_region_ou_service(fn
):
77 Test si le user connecté appartient bien à la même région ou service que
80 def inner(request
, *args
, **kwargs
):
82 poste_key
= kwargs
.get('key', None)
83 dossier_id
= kwargs
.get('dossier_id', None)
85 # Si on s'intéresse à un dossier, on teste la validation avec le
87 if dossier_id
is not None:
88 dossiers
= dae
.Dossier
.objects
.ma_region_ou_service(user
) \
89 .filter(id=dossier_id
)
91 return fn(request
, *args
, **kwargs
)
93 msg
= u
"Vous n'avez pas le droit de consulter " \
94 u
"ce dossier d'embauche."
95 return redirect_interdiction(request
, msg
)
97 # Autoriser la création d'une nouvelle demande
99 return fn(request
, *args
, **kwargs
)
100 # On est en train de répondre à un poste
102 return poste_dans_ma_region_ou_service(fn
)(
103 request
, *args
, **kwargs
108 def vieux_dossier_dans_ma_region_ou_service(fn
):
110 Test si le user connecté appartient bien à la même région ou service que
113 def inner(request
, *args
, **kwargs
):
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
)
121 msg
= u
"Vous n'avez pas le droit de consulter " \
122 u
"ce dossier d'embauche."
123 return redirect_interdiction(request
, msg
)
128 def employe_dans_ma_region_ou_service(fn
):
130 Test d'accès à un employé
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
)
140 msg
= u
"Vous n'avez pas le droit de consulter cet employé."
141 return redirect_interdiction(request
, msg
)
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
)
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
)
175 return fn(request
, *args
, **kwargs
)
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
)