Commit | Line | Data |
---|---|---|
9e60ac4d | 1 | import functools |
25ff9d72 | 2 | |
56770679 | 3 | from django.contrib.auth.views import redirect_to_login |
25ff9d72 AD |
4 | from django.http import HttpResponseForbidden |
5 | from django.shortcuts import get_object_or_404 | |
6 | ||
7 | from .models import XGroup, Membership | |
8 | ||
9 | ||
97a0ca06 RB |
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 | ||
9e60ac4d | 30 | class 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 |