securisation de toutes les vues
[auf_rh_dae.git] / project / dae / decorators.py
CommitLineData
5633fa41
OL
1# -*- encoding: utf-8 -*-
2
3from django.contrib import messages
4from django.contrib.auth.decorators import user_passes_test
5from django.core.urlresolvers import reverse
6from django.http import HttpResponseRedirect
f4928bf5 7from workflow import dae_groupes
5633fa41
OL
8from project.dae import models as dae
9from project.rh_v1 import models as rh
10
11def user_in_dae_groupes(user):
12 """
13 Teste si un user Django fait parti des groupes prédéfinis de DAE.
14 """
15 for g in user.groups.all():
16 if g in dae_groupes:
17 return True
18 return False
19
20def redirect_interdiction(request, msg=u"Vous n'avez pas accès à cette page"):
21 """
22 Redirection du la page de login avec un message d'erreur.
23 """
24 from django.conf import settings
25 from django.contrib.auth import REDIRECT_FIELD_NAME
26 from django.utils.http import urlquote
27 login_url = settings.LOGIN_URL
28 path = urlquote(request.get_full_path())
29 tup = login_url, REDIRECT_FIELD_NAME, path
30 messages.add_message(request, messages.ERROR, "Votre compte ne permet pas d'accéder à cette partie de l'application.")
31 return HttpResponseRedirect('%s?%s=%s' % tup)
32
33
34def dae_groupe_requis(fn):
35 """
36 L'accès à la plateforme nécessite d'appartenir au moins à un groupe,
37 ou d'être superuser. De cette manière l'autentification AUF fonctionnera
38 toujours, il suffit de mettre le nouvel employé dans le groupe qui le concerne.
39 """
40 def inner(request, *args, **kwargs):
41 user = request.user
42
43 if user.is_superuser or user_in_dae_groupes(user):
44 return fn(request, *args, **kwargs)
45 else :
46 msg = u"Votre compte ne permet pas d'accéder à cette partie de l'application."
47 return redirect_interdiction(request, msg)
48 return inner
49
50
51def poste_dans_ma_region_ou_service(fn):
52 """
53 Test si le user connecté appartient bien à la même région ou service que le poste.
54 """
55 def inner(request, *args, **kwargs):
56 user = request.user
57 key = kwargs.get('key', None)
f4928bf5
OL
58
59 # Autoriser la création d'une nouvelle demande
60 if key is None:
61 return fn(request, *args, **kwargs)
62
63 # Rechercher dans la demande, la région ou le service associé
5633fa41
OL
64 try:
65 source, id = key.split('-')
66 if source == 'dae':
67 Poste = dae.Poste
68 if source == 'rh':
69 Poste = rh.Poste
70 except:
71 id = key
72 Poste = dae.Poste
73
74 postes = Poste.objects.ma_region_ou_service(user).filter(id=id)
5633fa41
OL
75 if len(postes) > 0:
76 return fn(request, *args, **kwargs)
77 else :
78 msg = u"Vous n'avez pas le droit de consulter ce poste."
79 return redirect_interdiction(request, msg)
80 return inner
81
82
62d3903d
OL
83def dossier_dans_ma_region_ou_service(fn):
84 """
85 Test si le user connecté appartient bien à la même région ou service que le poste.
86 """
87 def inner(request, *args, **kwargs):
88 user = request.user
89 poste_key = kwargs.get('key', None)
90 dossier_id = kwargs.get('dossier_id', None)
91
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)
95 if len(dossiers) > 0:
96 return fn(request, *args, **kwargs)
97 else :
98 msg = u"Vous n'avez pas le droit de consulter ce dossier d'embauche."
99 return redirect_interdiction(request, msg)
100
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
105 else:
dcc1c26c 106 return poste_dans_ma_region_ou_service(fn)(request, *args, **kwargs)
62d3903d 107 return inner
04380fba
OL
108
109def employe_dans_ma_region_ou_service(fn):
110 """
111 Test d'accès à un employé
112 """
113 def inner(request, *args, **kwargs):
114 from project.dae.forms import _employe_choices
115 liste_employes = _employe_choices(None, request)
116 autorises = [k for k, nom in liste_employes]
117 employe_key = kwargs.get('employe_key')
118 if employe_key in autorises:
119 return fn(request, *args, **kwargs)
120 else :
121 msg = u"Vous n'avez pas le droit de consulter cet employé."
122 return redirect_interdiction(request, msg)
123
124 return inner