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