groups.decorators.group_required: redirect to login when user is not authenticated
[xnet] / xnet / groups / decorators.py
CommitLineData
9e60ac4d 1import functools
25ff9d72 2
56770679 3from django.contrib.auth.views import redirect_to_login
25ff9d72
AD
4from django.http import HttpResponseForbidden
5from django.shortcuts import get_object_or_404
6
7from .models import XGroup, Membership
8
9
97a0ca06
RB
10def 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
9e60ac4d 30class group_required(object):
97a0ca06
RB
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
9e60ac4d
AD
45 def __init__(self, level=Membership.LEVEL_MEMBER):
46 self.level = level
47
48 def __call__(self, view_func):
49 @functools.wraps(view_func)
7eb52156
AD
50 def wrapped_view_func(request, group_slug, *args, **kwargs):
51 group = get_object_or_404(XGroup, short=group_slug)
2703dcb5 52 if not request.user.is_authenticated():
56770679 53 return redirect_to_login(request.build_absolute_uri())
97a0ca06
RB
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)
9e60ac4d
AD
69 else:
70 return HttpResponseForbidden()
71 return wrapped_view_func