3 from django
.contrib
.auth
.views
import redirect_to_login
4 from django
.http
import HttpResponseForbidden
5 from django
.shortcuts
import get_object_or_404
7 from .models
import XGroup
, Membership
10 def with_group(view_func
):
11 """Converts a group slug into a XGroup object.
15 ... def my_view(request, group, *args, **kwargs):
16 ... # group is now a XGroup instance
19 @functools.wraps(view_func
)
20 def wrapped_view_func(request
, group_slug
, *args
, **kwargs
):
21 group
= get_object_or_404(XGroup
, short
=group_slug
)
25 return view_func(request
, group
, *args
, **kwargs
)
27 return wrapped_view_func
30 class group_required(object):
31 """Force a minimum group membership level.
33 Also combines with_group features:
34 - fetches the XGroup object,
36 - sets request.membership
40 >>> @group_required(level=Membership.LEVEL_MEMBER)
41 ... def my_view(request, group, *args, **kwargs):
45 def __init__(self
, level
=Membership
.LEVEL_MEMBER
):
48 def __call__(self
, view_func
):
49 @functools.wraps(view_func
)
50 def wrapped_view_func(request
, group_slug
, *args
, **kwargs
):
51 group
= get_object_or_404(XGroup
, short
=group_slug
)
52 if not request
.user
.is_authenticated():
53 return redirect_to_login(request
.build_absolute_uri())
56 membership
= request
.user
.memberships
.get(
58 level__gte
=self
.level
,
61 except Membership
.DoesNotExist
:
65 request
.membership
= membership
68 return view_func(request
, group
, *args
, membership
=membership
, **kwargs
)
70 return HttpResponseForbidden()
71 return wrapped_view_func