GroupViewSet   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 51
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 5
Bugs 0 Features 1
Metric Value
wmc 8
c 5
b 0
f 1
dl 0
loc 51
rs 10
ccs 0
cts 0
cp 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A update() 0 9 3
B invite() 0 35 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 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_queryset(self, request, queryset, view):
17
        """
18
        Limits all list requests w.r.t the Normal Rules of Visibility.
19
        """
20
        if request.user.is_sigma_admin():
21
            return queryset
22
23
        invited_to_groups_ids = request.user.invited_to_groups.all().values_list('id', flat=True)
24
        user_groups_ids = request.user.memberships.filter(is_accepted=True).values_list('group_id', flat=True)
25
        return queryset.prefetch_related('memberships', 'group_parents') \
26
            .filter(Q(is_private=False) | Q(memberships__user=request.user) | Q(id__in=invited_to_groups_ids) | Q(group_parents__id__in=user_groups_ids)) \
27
            .distinct()
28
29
30
class GroupViewSet(viewsets.ModelViewSet):
31
    queryset = Group.objects.all()
32
    serializer_class = GroupSerializer
33
    permission_classes = [IsAuthenticated, ]
34
    filter_backends = (GroupFilterBackend, )
35
36
    def update(self, request, pk=None):
37
        try:
38
            group = Group.objects.get(pk=pk)
39
        except Group.DoesNotExist:
40
            raise Http404("Group %d not found" % pk)
41
42
        if not request.user.can_modify_group_infos(group):
43
            return Response(status=status.HTTP_403_FORBIDDEN)
44
        return super(GroupViewSet, self).update(request, pk)
45
46
    @decorators.detail_route(methods=['put'])
47
    def invite(self, request, pk=None):
48
        """
49
        Invite an user in group pk.
50
        ---
51
        omit_serializer: true
52
        parameters_strategy:
53
            form: replace
54
        parameters:
55
            - name: user_id
56
              type: integer
57
              required: true
58
        """
59
        try:
60
            group = Group.objects.get(pk=pk)
61
            user = User.objects.get(pk=request.data.get('user_id', None))
62
            if not request.user.can_invite(group):
63
                return Response(status=status.HTTP_403_FORBIDDEN)
64
65
            # Already group member ?
66
            try:
67
                GroupMember.objects.get(user=user.id, group=group.id)
68
                return Response("Already Group member", status=status.HTTP_400_BAD_REQUEST)
69
            except GroupMember.DoesNotExist:
70
                pass
71
72
            group.invited_users.add(user)
73
            # user.notify() # TODO: Notification
74
            s = GroupSerializer(group)
75
            return Response(s.data, status=status.HTTP_200_OK)
76
77
        except Group.DoesNotExist:
78
            raise Http404("Group %d not found" % pk)
79
        except User.DoesNotExist:
80
            raise Http404("User %d not found" % request.data.get('user_id', None))
81