region_protected niveau project
[auf_rh_dae.git] / project / decorators.py
index 1d3ffbb..9f08694 100644 (file)
@@ -2,26 +2,17 @@
 """
 Décorateurs AUF
 """
-from django.contrib.auth.decorators import user_passes_test
-from django.core.urlresolvers import reverse
 from django.http import HttpResponseRedirect
 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 django.contrib import messages
 
-from project.permissions import is_employe, is_admin
+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 admin_required(fn):
-    def inner(request, *args, **kwargs):
-        user = request.user
-        if is_admin(user):
-            return fn(request, *args, **kwargs)
-        else :
-            return redirect_interdiction(request)
-    return inner
 
 def redirect_interdiction(request, msg=u"Vous n'avez pas accès à cette page"):
     """
@@ -32,5 +23,50 @@ def redirect_interdiction(request, msg=u"Vous n'avez pas accès à cette page"):
     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 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 in_drh_or_admin(user):
+            return fn(request, *args, **kwargs)
 
+        msg = u"Votre compte ne permet pas d'accéder à " \
+                u"cette partie de l'application."
+        return redirect_interdiction(request, msg)
 
+    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