--- /dev/null
+# -*- encoding: utf-8 -*-
+
+from django.contrib import messages
+from django.contrib.auth.decorators import user_passes_test
+from django.core.urlresolvers import reverse
+from django.http import HttpResponseRedirect
+from models import dae_groupes
+from project.dae import models as dae
+from project.rh_v1 import models as rh
+
+def user_in_dae_groupes(user):
+ """
+ Teste si un user Django fait parti des groupes prédéfinis de DAE.
+ """
+ for g in user.groups.all():
+ if g in dae_groupes:
+ return True
+ return False
+
+def redirect_interdiction(request, msg=u"Vous n'avez pas accès à cette page"):
+ """
+ Redirection du la page de login avec un message d'erreur.
+ """
+ from django.conf import settings
+ from django.contrib.auth import REDIRECT_FIELD_NAME
+ from django.utils.http import urlquote
+ login_url = settings.LOGIN_URL
+ path = urlquote(request.get_full_path())
+ tup = login_url, REDIRECT_FIELD_NAME, path
+ messages.add_message(request, messages.ERROR, "Votre compte ne permet pas d'accéder à cette partie de l'application.")
+ return HttpResponseRedirect('%s?%s=%s' % tup)
+
+
+def dae_groupe_requis(fn):
+ """
+ L'accès à la plateforme nécessite d'appartenir au moins à un groupe,
+ ou d'être superuser. De cette manière l'autentification AUF fonctionnera
+ toujours, il suffit de mettre le nouvel employé dans le groupe qui le concerne.
+ """
+ def inner(request, *args, **kwargs):
+ user = request.user
+
+ if user.is_superuser or user_in_dae_groupes(user):
+ return fn(request, *args, **kwargs)
+ else :
+ msg = u"Votre compte ne permet pas d'accéder à cette partie de l'application."
+ return redirect_interdiction(request, msg)
+ return inner
+
+
+def poste_dans_ma_region_ou_service(fn):
+ """
+ Test si le user connecté appartient bien à la même région ou service que le poste.
+ """
+ def inner(request, *args, **kwargs):
+ user = request.user
+ key = kwargs.get('key', None)
+ try:
+ source, id = key.split('-')
+ if source == 'dae':
+ Poste = dae.Poste
+ if source == 'rh':
+ Poste = rh.Poste
+ except:
+ id = key
+ Poste = dae.Poste
+
+ postes = Poste.objects.ma_region_ou_service(user).filter(id=id)
+ print postes
+ if len(postes) > 0:
+ return fn(request, *args, **kwargs)
+ else :
+ msg = u"Vous n'avez pas le droit de consulter ce poste."
+ return redirect_interdiction(request, msg)
+ return inner
+
+
# -=- encoding: utf-8 -=-
import os
+from django.conf import settings
from django.core.files.storage import FileSystemStorage
from django.db import models
+from django.db.models import Q
from django.contrib.auth.models import Group
import reversion
from workflow import PosteWorkflow, DossierWorkflow
import datamaster_modeles.models as ref
from rh_v1 import models as rh
-import settings
+from utils import is_user_dans_service, get_employe_from_user
# Groupes impliqués dans le Worflow
grp_administrateurs, created = Group.objects.get_or_create(name='Administrateurs')
grp_directeurs_service, created = Group.objects.get_or_create(name='Directeurs de service / pôle')
grp_correspondants_rh, created = Group.objects.get_or_create(name='Correspondants RH')
+dae_groupes = (grp_administrateurs, grp_gestionnaires, grp_directeurs_bureau, grp_drh,
+ grp_pole_financier, grp_haute_direction, grp_service_utilisateurs,
+ grp_directeurs_service, grp_correspondants_rh, )
+
STATUT_RESIDENCE_CHOICES = (
('local', 'Local'),
('expat', 'Expatrié'),
return super(PosteManager, self).get_query_set() \
.select_related(*fkeys).all()
+ def ma_region_ou_service(self, user):
+ """
+ Filtrage des postes en fonction du user connecté (region / service)
+ """
+ # SERVICE
+ employe = get_employe_from_user(user)
+ if is_user_dans_service(user):
+ q = Q(implantation=employe.implantation)
+ # REGION
+ else:
+ q = Q(implantation__region=employe.implantation.region)
+ return self.get_query_set().filter(q)
class Poste(PosteWorkflow, models.Model):
# Modèle existant
<table>
<tr>
<th>Poste</th>
+ <th>Région</th>
+ <th>État</th>
</tr>
{% for poste in postes %}
<tr>
<td><a href="{% url poste_consulter poste.key %}">{{ poste }}</a></td>
+ <td>{{ poste.implantation.region }}</td>
+ <td>{{ poste.get_etat_display }}</td>
</tr>
{% endfor %}
--- /dev/null
+# -*- encoding: utf-8 -*-
+
+import datamaster_modeles.models as ref
+
+def get_employe_from_user(user):
+ """
+ Retourne un employé AUF à partir de son user Django.
+ """
+ try:
+ employe = ref.Authentification.objects.get(courriel=user.email).id
+ except:
+ raise Exception(u"L'employé avec le courriel %s n'a pas été trouvé dans le référentiel." % user.email)
+ return employe
+
+def is_user_dans_service(user):
+ employe = get_employe_from_user(user)
+ return employe.implantation.bureau_rattachement_id == -1
+
+def is_user_dans_region(user):
+ employe = get_employe_from_user(user)
+ return employe.implantation.bureau_rattachement_id != -1
+
+
from project.dae import models as dae
from project.rh_v1 import models as rh
-from project.decorators import admin_required
+from decorators import dae_groupe_requis, poste_dans_ma_region_ou_service
from forms import *
-@admin_required
+@dae_groupe_requis
def index(request):
return render_to_response('dae/index.html', {}, RequestContext(request))
-@admin_required
+@dae_groupe_requis
+@poste_dans_ma_region_ou_service
def poste_consulter(request, key):
source, id = key.split('-')
poste = get_object_or_404(dae.Poste, pk=id)
vars = {'poste' : poste, 'validationForm' : validationForm, }
return render_to_response('dae/poste_consulter.html', vars, RequestContext(request))
-@admin_required
+@dae_groupe_requis
def poste(request, key=None):
""" Formulaire pour un poste.
return render_to_response('dae/poste.html', vars, RequestContext(request))
-@admin_required
+@dae_groupe_requis
def postes_liste(request):
""" Liste des postes. """
vars = dict()
- vars['postes'] = dae.Poste.objects.all().order_by('-date_creation')
- return render_to_response('dae/postes_liste.html', vars,
- RequestContext(request))
+ vars['postes'] = dae.Poste.objects.ma_region_ou_service(request.user).order_by('-date_creation')
+ #try:
+ # vars['postes'] = dae.Poste.objects.ma_region_ou_service(request.user).order_by('-date_creation')
+ #except:
+ # messages.add_message(request, messages.ERROR, u"Votre compte n'a pas été trouvé dans le référientiel des employés, veuillez contacter l'ARI.")
+ return render_to_response('dae/postes_liste.html', vars, RequestContext(request))
def filtered_type_remun():
# Exclusion de "Indemnité de fonction" des types de rémun utilisés
return comparaison_dossiers
-@admin_required
+@dae_groupe_requis
def embauche_consulter(request, dossier_id):
dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
}
return render_to_response('dae/embauche_consulter.html', vars, RequestContext(request))
-@admin_required
+@dae_groupe_requis
def embauche(request, key=None, dossier=None):
""" Formulaire d'autorisation d'embauche. """
if not key:
return render_to_response('dae/embauche.html', vars,
RequestContext(request))
-@admin_required
+@dae_groupe_requis
def embauches_liste(request):
""" Liste des embauches. """
vars = dict()
from django.contrib.auth.decorators import user_passes_test
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
-#from helpdesk.models import Ticket, TicketCC
from permissions import is_employe, is_admin
# Décorateurs des fonctions dans views (pour tester permissions dans views)
# -*- encoding: utf-8 -*-
from django.shortcuts import render_to_response
from django.template import RequestContext
+from project.dae.decorators import dae_groupe_requis
+@dae_groupe_requis
def index(request):
return render_to_response('index.html', {}, RequestContext(request))