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 workflow
import dae_groupes
, ETATS_EDITABLE
, grp_drh
9 from project
.dae
import models
as dae
10 from project
.rh_v1
import models
as rh
11 from utils
import get_employe_from_user
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():
22 def redirect_interdiction(request
, msg
=u
"Vous n'avez pas accès à cette page"):
24 Redirection du la page de login avec un message d'erreur.
26 from django
.conf
import settings
27 from django
.contrib
.auth
import REDIRECT_FIELD_NAME
28 from django
.utils
.http
import urlquote
29 login_url
= settings
.LOGIN_URL
30 path
= urlquote(request
.get_full_path())
31 tup
= login_url
, REDIRECT_FIELD_NAME
, path
32 messages
.add_message(request
, messages
.ERROR
, "Votre compte ne permet pas d'accéder à cette partie de l'application.")
33 return HttpResponseRedirect('%s?%s=%s' % tup
)
36 def dae_groupe_requis(fn
):
38 L'accès à la plateforme nécessite d'appartenir au moins à un groupe,
39 ou d'être superuser. De cette manière l'autentification AUF fonctionnera
40 toujours, il suffit de mettre le nouvel employé dans le groupe qui le concerne.
42 def inner(request
, *args
, **kwargs
):
45 if user
.is_superuser
or user_in_dae_groupes(user
):
46 return fn(request
, *args
, **kwargs
)
48 msg
= u
"Votre compte ne permet pas d'accéder à cette partie de l'application."
49 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
)
84 def dossier_dans_ma_region_ou_service(fn
):
86 Test si le user connecté appartient bien à la même région ou service que le poste.
88 def inner(request
, *args
, **kwargs
):
90 poste_key
= kwargs
.get('key', None)
91 dossier_id
= kwargs
.get('dossier_id', None)
93 # Si on s'intéresse à un dossier, on teste la validation avec le poste associé
94 if dossier_id
is not None:
95 dossiers
= dae
.Dossier
.objects
.ma_region_ou_service(user
).filter(id=dossier_id
)
97 return fn(request
, *args
, **kwargs
)
99 msg
= u
"Vous n'avez pas le droit de consulter ce dossier d'embauche."
100 return redirect_interdiction(request
, msg
)
102 # Autoriser la création d'une nouvelle demande
103 if poste_key
is None:
104 return fn(request
, *args
, **kwargs
)
105 # On est en train de répondre à un poste
107 return poste_dans_ma_region_ou_service(fn
)(request
, *args
, **kwargs
)
110 def vieux_dossier_dans_ma_region_ou_service(fn
):
112 Test si le user connecté appartient bien à la même région ou service que le poste.
114 def inner(request
, *args
, **kwargs
):
116 dossier_id
= kwargs
.get('dossier_id', None)
118 employe
= get_employe_from_user(request
.user
)
119 prefixe_implantation
= 'poste1__implantation'
121 #if is_user_dans_service(request.user):
122 # q_place = Q(**{ '%s' % prefixe_implantation : employe.implantation })
124 # q_place = Q(**{ '%s__region' % prefixe_implantation : employe.implantation.region })
126 q_place
= Q(**{ '%s__region' % prefixe_implantation
: employe
.implantation
.region
})
129 if grp_drh
in request
.user
.groups
.all():
130 q_filtre
= Q(id=dossier_id
)
132 q_filtre
= q_place
& Q(id=dossier_id
)
135 dossier
= rh
.Dossier
.objects
.get(q_filtre
)
136 return fn(request
, *args
, **kwargs
)
138 msg
= u
"Vous n'avez pas le droit de consulter 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
)
161 def dossier_est_modifiable(fn
):
162 def inner(request
, *args
, **kwargs
):
163 dossier_id
= kwargs
.get('dossier_id', None)
164 if dossier_id
is not None:
165 dossier
= dae
.Dossier
.objects
.get(id=dossier_id
)
166 if dossier
.etat
not in ETATS_EDITABLE
:
167 msg
= u
"Ce dossier d'embauche ne peut plus être modifié."
168 return redirect_interdiction(request
, msg
)
170 return fn(request
, *args
, **kwargs
)
173 def poste_est_modifiable(fn
):
174 def inner(request
, *args
, **kwargs
):
175 key
= kwargs
.get('key', None)
176 if key
is not None and key
.split('-')[0] == 'dae':
177 poste_id
= key
.split('-')[1]
178 poste
= dae
.Poste
.objects
.get(id=poste_id
)
179 if poste
.etat
not in ETATS_EDITABLE
:
180 msg
= u
"Ce poste ne peut plus être modifié."
181 return redirect_interdiction(request
, msg
)
183 return fn(request
, *args
, **kwargs
)