X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=xnet%2Faccounts%2Fdecorators.py;h=825df8d5732e07f1853aff9389b595c6487d9071;hb=9e60ac4deec6ae4fb2b8ff8bae276d0cc7088068;hp=4496b10df079ff6e2ae8f1dceaacfbed92265849;hpb=93adc7d4e7bf341316ed0274cea6adec7c2b0766;p=xnet diff --git a/xnet/accounts/decorators.py b/xnet/accounts/decorators.py index 4496b10..825df8d 100644 --- a/xnet/accounts/decorators.py +++ b/xnet/accounts/decorators.py @@ -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