4e94ef235deef30558e0845012e56ad4095446e3
[xnet] / xnet / groups / decorators.py
1 import functools
2
3 from django.http import HttpResponseForbidden
4 from django.shortcuts import get_object_or_404
5
6 from .models import XGroup, Membership
7
8
9 def with_group(view_func):
10 """Converts a group slug into a XGroup object.
11
12 Example:
13 >>> @with_group
14 ... def my_view(request, group, *args, **kwargs):
15 ... # group is now a XGroup instance
16 """
17
18 @functools.wraps(view_func)
19 def wrapped_view_func(request, group_slug, *args, **kwargs):
20 group = get_object_or_404(XGroup, short=group_slug)
21
22 request.group = group
23
24 return view_func(request, group, *args, **kwargs)
25
26 return wrapped_view_func
27
28
29 class group_required(object):
30 """Force a minimum group membership level.
31
32 Also combines with_group features:
33 - fetches the XGroup object,
34 - sets request.group
35 - sets request.membership
36
37 Usage:
38
39 >>> @group_required(level=Membership.LEVEL_MEMBER)
40 ... def my_view(request, group, *args, **kwargs):
41 ... pass
42 """
43
44 def __init__(self, level=Membership.LEVEL_MEMBER):
45 self.level = level
46
47 def __call__(self, view_func):
48 @functools.wraps(view_func)
49 def wrapped_view_func(request, group_slug, *args, **kwargs):
50 group = get_object_or_404(XGroup, short=group_slug)
51 if not request.user.is_authenticated():
52 return HttpResponseForbidden()
53
54 try:
55 membership = request.user.memberships.get(
56 xgroup=group,
57 level__gte=self.level,
58 state='enabled',
59 )
60 except Membership.DoesNotExist:
61 membership = None
62
63 request.group = group
64 request.membership = membership
65
66 if membership:
67 return view_func(request, group, *args, membership=membership, **kwargs)
68 else:
69 return HttpResponseForbidden()
70 return wrapped_view_func