Multiples zones par user implémenté
[auf_rh_dae.git] / project / decorators.py
index 74c51f4..0424878 100644 (file)
@@ -6,11 +6,11 @@ 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.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.db.models import Q
 from django.utils.http import urlquote
 
 from django.utils.http import urlquote
 
-from project.groups import grp_drh, grp_drh2
+from project import groups
+
 
 def redirect_interdiction(request, msg=u"Vous n'avez pas accès à cette page"):
     """
 
 def redirect_interdiction(request, msg=u"Vous n'avez pas accès à cette page"):
     """
@@ -19,21 +19,26 @@ def redirect_interdiction(request, msg=u"Vous n'avez pas accès à cette page"):
     login_url = settings.LOGIN_URL
     path = urlquote(request.get_full_path())
     tup = login_url, REDIRECT_FIELD_NAME, path
     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.")
+    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)
     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
     """
 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()
+    user_groups = [g.name for g in user.groups.all()]
     if user.is_superuser or \
     if user.is_superuser or \
-            grp_drh in groups or \
-            grp_drh2 in groups:
+            groups.DRH_NIVEAU_1 in user_groups or \
+            groups.DRH_NIVEAU_2 in user_groups:
         return True
     else:
         return False
         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 drh_or_admin_required(fn):
     """
     Teste si un user Django fait parti du groupe DRH, DRH2 ou s'il est admin
@@ -48,3 +53,42 @@ def drh_or_admin_required(fn):
         return redirect_interdiction(request, msg)
 
     return inner
         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 = [g.name for g in request.user.groups.all()]
+            if groups.DRH_NIVEAU_1 in user_groups or \
+               groups.DRH_NIVEAU_2 in user_groups:
+                return func(request, id)
+            if groups.CORRESPONDANT_RH in user_groups or \
+               groups.ADMINISTRATEURS in user_groups or \
+               groups.DIRECTEUR_DE_BUREAU in user_groups:
+                zones = groups.get_zones_from_user(request.user)
+                qkey = '%s__in' % model.prefix_implantation
+                q = Q(**{ qkey: zones })
+                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
+
+
+def in_one_of_group(groups):
+    """
+    Test si le user appartient au moins 1 des ces groupes
+    """
+    def wrapper(fn):
+        def wrapped(request, *args, **kwargs):
+            user_groups = [g.name for g in request.user.groups.all()]
+            for g in user_groups:
+                if g in groups:
+                    return fn(request, *args, **kwargs)
+            msg = u"Votre compte ne permet pas d'accéder à cette partie de l'application."
+            return redirect_interdiction(request, msg)
+        return wrapped
+    return wrapper