Group directory view
[xnet] / xnet / accounts / decorators.py
index 4496b10..825df8d 100644 (file)
@@ -1,4 +1,4 @@
-from functools import wraps
+import functools
 
 from django.http import HttpResponseForbidden
 from django.shortcuts import get_object_or_404
@@ -6,16 +6,21 @@ from django.shortcuts import get_object_or_404
 from .models import XGroup, Membership
 
 
-def group_required(view_func, level=Membership.LEVEL_MEMBER):
-    @wraps(view_func)
-    def _wrapped_view_func(request, group_id, *args, **kwargs):
-        group = get_object_or_404(XGroup, pk=group_id)
-        if request.user.memberships.filter(
-            xgroup=group,
-            level__gte=level,
-            state='enabled',
-        ).exists():
-            return view_func(request, group, *args, **kwargs)
-        else:
-            return HttpResponseForbidden()
-    return _wrapped_view_func
+class group_required(object):
+    def __init__(self, level=Membership.LEVEL_MEMBER):
+        self.level = level
+
+    def __call__(self, view_func):
+        @functools.wraps(view_func)
+        def wrapped_view_func(request, group_id, *args, **kwargs):
+            group = get_object_or_404(XGroup, pk=group_id)
+            membership = request.user.memberships.filter(
+                xgroup=group,
+                level__gte=self.level,
+                state='enabled',
+            )
+            if membership.exists():
+                return view_func(request, group, *args, membership=membership[0], **kwargs)
+            else:
+                return HttpResponseForbidden()
+        return wrapped_view_func