securite accès vues poste
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Fri, 29 Apr 2011 19:28:51 +0000 (15:28 -0400)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Fri, 29 Apr 2011 19:28:51 +0000 (15:28 -0400)
project/dae/decorators.py [new file with mode: 0644]
project/dae/models.py
project/dae/templates/dae/postes_liste.html
project/dae/utils.py [new file with mode: 0644]
project/dae/views.py
project/decorators.py
project/views.py

diff --git a/project/dae/decorators.py b/project/dae/decorators.py
new file mode 100644 (file)
index 0000000..62a1df4
--- /dev/null
@@ -0,0 +1,77 @@
+# -*- 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
+
+
index 6c62882..ab9aefe 100644 (file)
@@ -1,14 +1,16 @@
 # -=- 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')
@@ -21,6 +23,10 @@ grp_service_utilisateurs, created = Group.objects.get_or_create(name='Service ut
 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é'),
@@ -72,6 +78,18 @@ class PosteManager(models.Manager):
         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
index 1101ce4..04f309b 100644 (file)
 <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 %}
diff --git a/project/dae/utils.py b/project/dae/utils.py
new file mode 100644 (file)
index 0000000..a045ad7
--- /dev/null
@@ -0,0 +1,23 @@
+# -*- 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
+
+
index 1076271..32fa704 100644 (file)
@@ -17,14 +17,15 @@ from reversion.models import Version
 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)
@@ -41,7 +42,7 @@ def poste_consulter(request, key):
     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.
 
@@ -95,13 +96,16 @@ def poste(request, key=None):
 
     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
@@ -126,7 +130,7 @@ def get_dossiers_connexes(poste):
     return comparaison_dossiers
 
 
-@admin_required
+@dae_groupe_requis
 def embauche_consulter(request, dossier_id):
     dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
 
@@ -146,7 +150,7 @@ def embauche_consulter(request, 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:
@@ -273,7 +277,7 @@ def embauche(request, key=None, dossier=None):
 
     return render_to_response('dae/embauche.html', vars,
                               RequestContext(request))
-@admin_required
+@dae_groupe_requis
 def embauches_liste(request):
     """ Liste des embauches. """
     vars = dict()
index 4c64ef9..03430bf 100644 (file)
@@ -5,7 +5,6 @@ Décorateurs AUF
 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)
index ea70a51..c69b5a6 100644 (file)
@@ -1,6 +1,8 @@
 # -*- 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))