Completed
Push — master ( d1397a...a78a43 )
by
unknown
50s
created

GroupViewSet   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 30
Duplicated Lines 0 %

Test Coverage

Coverage 0%
Metric Value
dl 0
loc 30
rs 10
ccs 0
cts 0
cp 0
wmc 5

1 Method

Rating   Name   Duplication   Size   Complexity  
B invite() 0 24 5
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.models.group_member import GroupMember
12
from sigma_core.serializers.group import GroupSerializer
13
14
15
class GroupFilterBackend(DRYPermissionFiltersBase):
16
    def filter_list_queryset(self, request, queryset, view):
17
        """
18
        Limits all list requests to only be seen by the members or public groups.
19
        """
20
        return queryset.prefetch_related('memberships__user').filter(Q(visibility=Group.VIS_PUBLIC) | Q(memberships__user=request.user)).distinct()
21
22
23
class GroupViewSet(viewsets.ModelViewSet):
24
    queryset = Group.objects.all()
25
    serializer_class = GroupSerializer
26
    permission_classes = [IsAuthenticated, DRYPermissions, ]
27
    filter_backends = (GroupFilterBackend, )
28
29
    @decorators.detail_route(methods=['put'])
30
    def invite(self, request, pk=None):
31
        try:
32
            group = Group.objects.get(pk=pk)
33
            user = User.objects.get(pk=request.data.get('user', None))
34
            if not request.user.can_invite(group):
35
                return Response(status=status.HTTP_403_FORBIDDEN)
36
37
            # Already group member ?
38
            try:
39
                GroupMember.objects.get(user=user.id, group=group.id)
40
                return Response("Already Group member", status=status.HTTP_400_BAD_REQUEST)
41
            except GroupMember.DoesNotExist:
42
                pass
43
44
            group.invited_users.add(user)
45
            # user.notify() # TODO: Notification
46
            s = GroupSerializer(group)
47
            return Response(s.data, status=status.HTTP_200_OK)
48
49
        except Group.DoesNotExist:
50
            raise Http404("Group %d not found" % pk)
51
        except User.DoesNotExist:
52
            raise Http404("User %d not found" % request.data.get('user', None))
53