| 1 | # -*- encoding: utf-8 -*- |
| 2 | |
| 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 |
| 12 | |
| 13 | def user_in_dae_groupes(user): |
| 14 | """ |
| 15 | Teste si un user Django fait parti des groupes prédéfinis de DAE. |
| 16 | """ |
| 17 | for g in user.groups.all(): |
| 18 | if g in dae_groupes: |
| 19 | return True |
| 20 | return False |
| 21 | |
| 22 | def redirect_interdiction(request, msg=u"Vous n'avez pas accès à cette page"): |
| 23 | """ |
| 24 | Redirection du la page de login avec un message d'erreur. |
| 25 | """ |
| 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) |
| 34 | |
| 35 | |
| 36 | def dae_groupe_requis(fn): |
| 37 | """ |
| 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. |
| 41 | """ |
| 42 | def inner(request, *args, **kwargs): |
| 43 | user = request.user |
| 44 | |
| 45 | if user.is_superuser or user_in_dae_groupes(user): |
| 46 | return fn(request, *args, **kwargs) |
| 47 | else : |
| 48 | msg = u"Votre compte ne permet pas d'accéder à cette partie de l'application." |
| 49 | return redirect_interdiction(request, msg) |
| 50 | return inner |
| 51 | |
| 52 | |
| 53 | def poste_dans_ma_region_ou_service(fn): |
| 54 | """ |
| 55 | Test si le user connecté appartient bien à la même région ou service que le poste. |
| 56 | """ |
| 57 | def inner(request, *args, **kwargs): |
| 58 | user = request.user |
| 59 | key = kwargs.get('key', None) |
| 60 | |
| 61 | # Autoriser la création d'une nouvelle demande |
| 62 | if key is None: |
| 63 | return fn(request, *args, **kwargs) |
| 64 | |
| 65 | # Rechercher dans la demande, la région ou le service associé |
| 66 | try: |
| 67 | source, id = key.split('-') |
| 68 | if source == 'dae': |
| 69 | Poste = dae.Poste |
| 70 | if source == 'rh': |
| 71 | Poste = rh.Poste |
| 72 | except: |
| 73 | id = key |
| 74 | Poste = dae.Poste |
| 75 | postes = Poste.objects.ma_region_ou_service(user).filter(id=id) |
| 76 | if len(postes) > 0: |
| 77 | return fn(request, *args, **kwargs) |
| 78 | else : |
| 79 | msg = u"Vous n'avez pas le droit de consulter ce poste." |
| 80 | return redirect_interdiction(request, msg) |
| 81 | return inner |
| 82 | |
| 83 | |
| 84 | def dossier_dans_ma_region_ou_service(fn): |
| 85 | """ |
| 86 | Test si le user connecté appartient bien à la même région ou service que le poste. |
| 87 | """ |
| 88 | def inner(request, *args, **kwargs): |
| 89 | user = request.user |
| 90 | poste_key = kwargs.get('key', None) |
| 91 | dossier_id = kwargs.get('dossier_id', None) |
| 92 | |
| 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) |
| 96 | if len(dossiers) > 0: |
| 97 | return fn(request, *args, **kwargs) |
| 98 | else : |
| 99 | msg = u"Vous n'avez pas le droit de consulter ce dossier d'embauche." |
| 100 | return redirect_interdiction(request, msg) |
| 101 | |
| 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 |
| 106 | else: |
| 107 | return poste_dans_ma_region_ou_service(fn)(request, *args, **kwargs) |
| 108 | return inner |
| 109 | |
| 110 | def vieux_dossier_dans_ma_region_ou_service(fn): |
| 111 | """ |
| 112 | Test si le user connecté appartient bien à la même région ou service que le poste. |
| 113 | """ |
| 114 | def inner(request, *args, **kwargs): |
| 115 | user = request.user |
| 116 | dossier_id = kwargs.get('dossier_id', None) |
| 117 | |
| 118 | employe = get_employe_from_user(request.user) |
| 119 | prefixe_implantation = 'poste1__implantation' |
| 120 | |
| 121 | #if is_user_dans_service(request.user): |
| 122 | # q_place = Q(**{ '%s' % prefixe_implantation : employe.implantation }) |
| 123 | #else: |
| 124 | # q_place = Q(**{ '%s__region' % prefixe_implantation : employe.implantation.region }) |
| 125 | |
| 126 | q_place = Q(**{ '%s__region' % prefixe_implantation : employe.implantation.region }) |
| 127 | |
| 128 | |
| 129 | if grp_drh in request.user.groups.all(): |
| 130 | q_filtre = Q(id=dossier_id) |
| 131 | else: |
| 132 | q_filtre = q_place & Q(id=dossier_id) |
| 133 | |
| 134 | try: |
| 135 | dossier = rh.Dossier.objects.get(q_filtre) |
| 136 | return fn(request, *args, **kwargs) |
| 137 | except Exception, e: |
| 138 | msg = u"Vous n'avez pas le droit de consulter ce dossier d'embauche." |
| 139 | return redirect_interdiction(request, msg) |
| 140 | |
| 141 | |
| 142 | return inner |
| 143 | |
| 144 | def employe_dans_ma_region_ou_service(fn): |
| 145 | """ |
| 146 | Test d'accès à un employé |
| 147 | """ |
| 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) |
| 155 | else : |
| 156 | msg = u"Vous n'avez pas le droit de consulter cet employé." |
| 157 | return redirect_interdiction(request, msg) |
| 158 | |
| 159 | return inner |
| 160 | |
| 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 grp_drh not in request.user.groups.all() and \ |
| 167 | (dossier.etat not in ETATS_EDITABLE or dossier not in dae.Dossier.objects.mes_choses_a_faire(request.user).all()): |
| 168 | msg = u"Ce dossier d'embauche ne peut plus être modifié." |
| 169 | return redirect_interdiction(request, msg) |
| 170 | return fn(request, *args, **kwargs) |
| 171 | return inner |
| 172 | |
| 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 grp_drh not in request.user.groups.all() and \ |
| 180 | (poste.etat not in ETATS_EDITABLE or poste not in dae.Poste.objects.mes_choses_a_faire(request.user).all()): |
| 181 | msg = u"Ce poste ne peut plus être modifié." |
| 182 | return redirect_interdiction(request, msg) |
| 183 | |
| 184 | return fn(request, *args, **kwargs) |
| 185 | return inner |