1 # -*- encoding: utf-8 -*-
3 from django
.db
.models
import Q
4 from django
.contrib
import messages
5 from django
.contrib
.auth
.decorators
import user_passes_test
6 from django
.core
.urlresolvers
import reverse
7 from django
.http
import HttpResponseRedirect
8 from django
.shortcuts
import get_object_or_404
9 from workflow
import dae_groupes
, ETATS_EDITABLE
, ETATS_VALIDE
, \
11 from project
.dae
import models
as dae
12 from project
.rh
import models
as rh
13 from utils
import get_employe_from_user
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 redirect_interdiction(request
, msg
=u
"Vous n'avez pas accès à cette page"):
26 Redirection du la page de login avec un message d'erreur.
28 from django
.conf
import settings
29 from django
.contrib
.auth
import REDIRECT_FIELD_NAME
30 from django
.utils
.http
import urlquote
31 login_url
= settings
.LOGIN_URL
32 path
= urlquote(request
.get_full_path())
33 tup
= login_url
, REDIRECT_FIELD_NAME
, path
34 messages
.add_message(request
, messages
.ERROR
, "Votre compte ne permet pas d'accéder à cette partie de l'application.")
35 return HttpResponseRedirect('%s?%s=%s' % tup
)
37 def dae_groupe_requis(fn
):
39 L'accès à la plateforme nécessite d'appartenir au moins à un groupe,
40 ou d'être superuser. De cette manière l'autentification AUF fonctionnera
41 toujours, il suffit de mettre le nouvel employé dans le groupe qui le concerne.
43 def inner(request
, *args
, **kwargs
):
46 if user
.is_superuser
or user_in_dae_groupes(user
):
47 return fn(request
, *args
, **kwargs
)
49 msg
= u
"Votre compte ne permet pas d'accéder à cette partie de l'application."
50 return redirect_interdiction(request
, msg
)
53 def poste_dans_ma_region_ou_service(fn
):
55 Test si le user connecté appartient bien à la même région ou service que le poste.
57 def inner(request
, *args
, **kwargs
):
59 key
= kwargs
.get('key', None)
61 # Autoriser la création d'une nouvelle demande
63 return fn(request
, *args
, **kwargs
)
65 # Rechercher dans la demande, la région ou le service associé
67 source
, id = key
.split('-')
75 postes
= Poste
.objects
.ma_region_ou_service(user
).filter(id=id)
77 return fn(request
, *args
, **kwargs
)
79 msg
= u
"Vous n'avez pas le droit de consulter ce poste."
80 return redirect_interdiction(request
, msg
)
83 def dossier_dans_ma_region_ou_service(fn
):
85 Test si le user connecté appartient bien à la même région ou service que le poste.
87 def inner(request
, *args
, **kwargs
):
89 poste_key
= kwargs
.get('key', None)
90 dossier_id
= kwargs
.get('dossier_id', None)
92 # Si on s'intéresse à un dossier, on teste la validation avec le poste associé
93 if dossier_id
is not None:
94 dossiers
= dae
.Dossier
.objects
.ma_region_ou_service(user
).filter(id=dossier_id
)
96 return fn(request
, *args
, **kwargs
)
98 msg
= u
"Vous n'avez pas le droit de consulter ce dossier d'embauche."
99 return redirect_interdiction(request
, msg
)
101 # Autoriser la création d'une nouvelle demande
102 if poste_key
is None:
103 return fn(request
, *args
, **kwargs
)
104 # On est en train de répondre à un poste
106 return poste_dans_ma_region_ou_service(fn
)(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 le poste.
113 def inner(request
, *args
, **kwargs
):
115 dossier_id
= kwargs
.get('dossier_id', None)
116 dossiers
= rh
.Dossier
.objects
.ma_region_ou_service(user
).filter(id=dossier_id
)
117 if len(dossiers
) > 0:
118 return fn(request
, *args
, **kwargs
)
120 msg
= u
"Vous n'avez pas le droit de consulter ce dossier d'embauche."
121 return redirect_interdiction(request
, msg
)
126 def employe_dans_ma_region_ou_service(fn
):
128 Test d'accès à un employé
130 def inner(request
, *args
, **kwargs
):
131 from project
.dae
.forms
import _employe_choices
132 liste_employes
= _employe_choices(None, request
)
133 autorises
= [k
for k
, nom
in liste_employes
]
134 employe_key
= kwargs
.get('employe_key')
135 if employe_key
in autorises
:
136 return fn(request
, *args
, **kwargs
)
138 msg
= u
"Vous n'avez pas le droit de consulter cet employé."
139 return redirect_interdiction(request
, msg
)
143 def dossier_est_modifiable(fn
):
144 def inner(request
, *args
, **kwargs
):
145 dossier_id
= kwargs
.get('dossier_id', None)
146 user_groupes
= request
.user
.groups
.all()
147 if dossier_id
is not None:
148 dossier
= dae
.Dossier
.objects
.get(id=dossier_id
)
149 if not (dossier
.etat
in ETATS_EDITABLE
and
150 (grp_drh
in user_groupes
or grp_drh2
in user_groupes
or
151 dossier
in dae
.Dossier
.objects
.mes_choses_a_faire(request
.user
).all())):
152 msg
= u
"Ce dossier d'embauche ne peut plus être modifié."
153 return redirect_interdiction(request
, msg
)
154 return fn(request
, *args
, **kwargs
)
157 def poste_est_modifiable(fn
):
158 def inner(request
, *args
, **kwargs
):
159 key
= kwargs
.get('key', None)
160 if key
is not None and key
.split('-')[0] == 'dae':
161 poste_id
= key
.split('-')[1]
162 poste
= dae
.Poste
.objects
.get(id=poste_id
)
163 if grp_drh
not in request
.user
.groups
.all() and \
164 (poste
.etat
not in ETATS_EDITABLE
or poste
not in dae
.Poste
.objects
.mes_choses_a_faire(request
.user
).all()):
165 msg
= u
"Ce poste ne peut plus être modifié."
166 return redirect_interdiction(request
, msg
)
168 return fn(request
, *args
, **kwargs
)
172 """Ce décorateur s'attend à ce que le premier argument de la vue décorée
173 soit l'ID d'un contrat. Il vérifie les permissions, puis transforme
174 l'ID en objet Contrat."""
175 def inner(request
, contrat_id
, *args
, **kwargs
):
176 contrat
= get_object_or_404(dae
.Contrat
, pk
=contrat_id
)
177 dossier
= contrat
.dossier
178 user_groupes
= request
.user
.groups
.all()
179 if not (dossier
.etat
in ETATS_VALIDE
and
180 (grp_drh
in user_groupes
or grp_drh2
in user_groupes
or
181 dossier
in dae
.Dossier
.objects
.mes_choses_a_faire(request
.user
).all())):
182 return redirect_interdiction(request
)
183 return fn(request
, contrat
, *args
, **kwargs
)