Completed
Push — master ( 14185c...203d73 )
by Camille
01:09
created

GroupFilterBackend   A

Complexity

Total Complexity 1

Size/Duplication

Total Lines 6
Duplicated Lines 0 %

Test Coverage

Coverage 0%
Metric Value
dl 0
loc 6
ccs 0
cts 0
cp 0
rs 10
wmc 1

1 Method

Rating   Name   Duplication   Size   Complexity  
A filter_list_queryset() 0 5 1
1
from django.http import Http404
2
from django.db.models import Q
3
4
from rest_framework import viewsets, decorators, status
5
from rest_framework.response import Response
6
from rest_framework.permissions import IsAuthenticated
7
from dry_rest_permissions.generics import DRYPermissions, DRYPermissionFiltersBase
8
9
from sigma_core.models.user import User
10
from sigma_core.models.group import Group
11
from sigma_core.serializers.group import GroupSerializer
12
13
14
class GroupFilterBackend(DRYPermissionFiltersBase):
15
    def filter_list_queryset(self, request, queryset, view):
16
        """
17
        Limits all list requests to only be seen by the members or public groups.
18
        """
19
        return queryset.prefetch_related('memberships__user').filter(Q(visibility=Group.VIS_PUBLIC) | Q(memberships__user=request.user)).distinct()
20
21
22
class GroupViewSet(viewsets.ModelViewSet):
23
    queryset = Group.objects.all()
24
    serializer_class = GroupSerializer
25
    permission_classes = [IsAuthenticated, DRYPermissions, ]
26
    filter_backends = (GroupFilterBackend, )
27
28
    @decorators.detail_route(methods=['put'])
29
    def invite(self, request, pk=None):
30
        try:
31
            group = Group.objects.get(pk=pk)
32
            user = User.objects.get(pk=request.data.get('user', None))
33
        except Group.DoesNotExist:
34
            raise Http404("Group %d not found" % pk)
35
        except User.DoesNotExist:
36
            raise Http404("User %d not found" % request.data.get('user', None))
37
38
        group.invited_users.add(user)
39
        # TODO: notify user of this invitation
40
41
        s = GroupSerializer(group)
42
        return Response(s.data, status=status.HTTP_200_OK)
43