Commit | Line | Data |
---|---|---|
9e60ac4d | 1 | import functools |
25ff9d72 AD |
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 | ||
97a0ca06 RB |
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 | ||
9e60ac4d | 29 | class 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 |