1 # -*- encoding: utf-8 -*-
3 from django
.shortcuts
import get_object_or_404
5 from project
import groups
6 from project
.decorators
import redirect_interdiction
7 from project
.rh
import models
as rh
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
14 def user_in_dae_groupes(user
):
16 Teste si un user Django fait parti des groupes prédéfinis de DAE.
18 for g
in [g
.name
for g
in user
.groups
.all()]:
23 def dae_groupe_requis(fn
):
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
30 def inner(request
, *args
, **kwargs
):
33 if user
.is_superuser
or user_in_dae_groupes(user
):
34 return fn(request
, *args
, **kwargs
)
36 msg
= u
"Votre compte ne permet pas d'accéder à cette partie " \
38 return redirect_interdiction(request
, msg
)
42 def poste_dans_ma_region_ou_service(fn
):
44 Test si le user connecté appartient bien à la même région ou service que
47 def inner(request
, *args
, **kwargs
):
49 key
= kwargs
.get('key', None)
51 # Autoriser la création d'une nouvelle demande
53 return fn(request
, *args
, **kwargs
)
55 # Rechercher dans la demande, la région ou le service associé
57 source
, id = key
.split('-')
63 raise Exception("source inconnue : dae ou rh")
67 postes
= Poste
.objects
.ma_region_ou_service(user
).filter(id=id)
69 return fn(request
, *args
, **kwargs
)
71 msg
= u
"Vous n'avez pas le droit de consulter ce poste."
72 return redirect_interdiction(request
, msg
)
76 def dossier_dans_ma_region_ou_service(fn
):
78 Test si le user connecté appartient bien à la même région ou service que
81 def inner(request
, *args
, **kwargs
):
83 poste_key
= kwargs
.get('key', None)
84 dossier_id
= kwargs
.get('dossier_id', None)
86 # Si on s'intéresse à un dossier, on teste la validation avec le
88 if dossier_id
is not None:
89 dossiers
= dae
.Dossier
.objects
.ma_region_ou_service(user
) \
90 .filter(id=dossier_id
)
92 return fn(request
, *args
, **kwargs
)
94 msg
= u
"Vous n'avez pas le droit de consulter " \
95 u
"ce dossier d'embauche."
96 return redirect_interdiction(request
, msg
)
98 # Autoriser la création d'une nouvelle demande
100 return fn(request
, *args
, **kwargs
)
101 # On est en train de répondre à un poste
103 return poste_dans_ma_region_ou_service(fn
)(
104 request
, *args
, **kwargs
109 def vieux_dossier_dans_ma_region_ou_service(fn
):
111 Test si le user connecté appartient bien à la même région ou service que
114 def inner(request
, *args
, **kwargs
):
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
)
122 msg
= u
"Vous n'avez pas le droit de consulter " \
123 u
"ce dossier d'embauche."
124 return redirect_interdiction(request
, msg
)
129 def employe_dans_ma_region_ou_service(fn
):
131 Test d'accès à un employé
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
)
141 msg
= u
"Vous n'avez pas le droit de consulter cet employé."
142 return redirect_interdiction(request
, msg
)
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
)
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
)
178 return fn(request
, *args
, **kwargs
)
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
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
)