accounts: Add context_processor and middleware.
[xnet] / xnet / accounts / decorators.py
CommitLineData
9e60ac4d 1import functools
25ff9d72
AD
2
3from django.http import HttpResponseForbidden
4from django.shortcuts import get_object_or_404
5
6from .models import XGroup, Membership
7
8
97a0ca06
RB
9def 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
9e60ac4d 29class group_required(object):
97a0ca06
RB
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
9e60ac4d
AD
44 def __init__(self, level=Membership.LEVEL_MEMBER):
45 self.level = level
46
47 def __call__(self, view_func):
48 @functools.wraps(view_func)
7eb52156
AD
49 def wrapped_view_func(request, group_slug, *args, **kwargs):
50 group = get_object_or_404(XGroup, short=group_slug)
97a0ca06
RB
51
52 try:
53 membership = request.user.memberships.get(
54 xgroup=group,
55 level__gte=self.level,
56 state='enabled',
57 )
58 except Membership.DoesNotExist:
59 membership = None
60
61 request.group = group
62 request.membership = membership
63
64 if membership:
65 return view_func(request, group, *args, membership=membership, **kwargs)
9e60ac4d
AD
66 else:
67 return HttpResponseForbidden()
68 return wrapped_view_func