Completed
Pull Request — master (#16)
by
unknown
01:44
created

GroupFieldViewSet   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 32
Duplicated Lines 0 %
Metric Value
dl 0
loc 32
rs 10
wmc 6

2 Methods

Rating   Name   Duplication   Size   Complexity  
A create() 0 9 3
A get_queryset() 0 10 3
1
from django.http import Http404, HttpResponseForbidden
2
3
from rest_framework import viewsets, decorators, status, mixins
4
from rest_framework.response import Response
5
from rest_framework.permissions import IsAuthenticated
6
from dry_rest_permissions.generics import DRYPermissions
7
8
from sigma_core.models.group_field import GroupField
9
from sigma_core.serializers.group_field import GroupFieldSerializer, GroupFieldCreateSerializer
10
11
class GroupFieldViewSet(mixins.CreateModelMixin,    # Only Group admin
12
                   mixins.RetrieveModelMixin,       # Every Group member (including not accepted group members - for "open" groups)
13
                   mixins.UpdateModelMixin,         # Same permission as create
14
                   mixins.DestroyModelMixin,        # Same permission as create
15
                   mixins.ListModelMixin,           # Same permission as retrieve
16
                   viewsets.GenericViewSet):
17
    queryset = GroupField.objects.all()
18
    serializer_class = GroupFieldSerializer
19
    permission_classes = [IsAuthenticated, DRYPermissions, ]
20
    filter_fields = ('name', )
21
22
    # You will never see fields for groups you are not a member of
23
    def get_queryset(self):
24
        from sigma_core.models.group_member import GroupMember
25
        if not self.request.user.is_authenticated():
26
            return self.queryset.none()
27
        if self.request.user.is_sigma_admin():
28
            return self.queryset
29
        # @sqlperf: Find which one is the most efficient
30
        my_groups = GroupMember.objects.filter(user=self.request.user.id).values_list('group', flat=True)
31
        #my_groups = Group.objects.filter(memberships__user=self.request.user.id)
32
        return self.queryset.filter(group__in=my_groups)
33
34
    def create(self, request):
35
        serializer = GroupFieldCreateSerializer(data=request.data)
36
        if not serializer.is_valid():
37
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
38
        if not request.user.has_group_admin_perm(serializer.validated_data.get('group')):
39
            return Response('Not group administrator', status=status.HTTP_403_FORBIDDEN)
40
41
        serializer.save()
42
        return Response(serializer.data, status=status.HTTP_201_CREATED)
43