region_protected niveau project
[auf_rh_dae.git] / project / decorators.py
index 2c543c8..9f08694 100644 (file)
@@ -2,46 +2,71 @@
 """
 Décorateurs AUF
 """
-#from django.contrib.auth.decorators import user_passes_test
-#from django.core.exceptions import PermissionDenied
-#from django.core.urlresolvers import reverse
 from django.http import HttpResponseRedirect
-from django.shortcuts import redirect
-from permissions import is_employe, is_admin
+from django.conf import settings
+from django.contrib import messages
+from django.contrib.auth import REDIRECT_FIELD_NAME
+from django.contrib.auth.decorators import user_passes_test
+from django.core.urlresolvers import reverse
+from django.utils.http import urlquote
 
-#from datamaster_modeles import models as ref
-from dae.utils import get_employe_from_user
-from rh import models as rh
+from project.groups import grp_drh, grp_drh2, grp_correspondants_rh
+from project.utils import get_employe_from_user
 
-# Décorateurs des fonctions dans views (pour tester permissions dans views)
+
+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.
+    """
+    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 admin_required(fn):
+def in_drh_or_admin(user):
+    """
+    Teste si un user Django fait parti du groupe DRH, DRH2 ou s'il est admin
+    """
+    groups = user.groups.all()
+    if user.is_superuser or \
+            grp_drh in groups or \
+            grp_drh2 in groups:
+        return True
+    else:
+        return False
+        
+def drh_or_admin_required(fn):
+    """
+    Teste si un user Django fait parti du groupe DRH, DRH2 ou s'il est admin
+    """
     def inner(request, *args, **kwargs):
         user = request.user
-        if is_admin(user):
+        if in_drh_or_admin(user):
             return fn(request, *args, **kwargs)
-        else :
-            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
-            return HttpResponseRedirect('%s?%s=%s' % tup)
+
+        msg = u"Votre compte ne permet pas d'accéder à " \
+                u"cette partie de l'application."
+        return redirect_interdiction(request, msg)
+
     return inner
     
-def user_is_this_employe(fn):
-    """
-    Décorateur qui vérifie si le user est l'employé demandé.
-    Succes = execution de la vue.
-    Echec = page d'erreur de permission
-    """
-    def inner(request, id, *args, **kwargs):
-        id = int(id)
-        user = request.user
-        employe = get_employe_from_user(user)
-        if user.is_authenticated() and employe and id==employe.id:
-            return fn(request, id, *args, **kwargs)
-#        raise PermissionDenied
-        return redirect('550')
-    return inner
+def region_protected(model):
+    def wrapper(func):
+        def wrapped(request, id):
+            if request.user.is_superuser:
+                return func(request, id)
+            user_groups = request.user.groups.all()
+            if grp_drh in user_groups:
+                return func(request, id)
+            if grp_correspondants_rh in user_groups:
+                employe = get_employe_from_user(request.user)
+                q = Q(**{
+                    model.prefix_implantation: employe.implantation.region
+                })
+                qs = model.objects.filter(q)
+                if int(id) in [o.id for o in qs]:
+                    return func(request, id)
+            return redirect_interdiction(request)
+        return wrapped
+    return wrapper