Completed
Push — master ( 5f1adf...d1397a )
by
unknown
01:07
created

GroupFieldViewSet   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 56
Duplicated Lines 0 %
Metric Value
dl 0
loc 56
rs 10
wmc 12

3 Methods

Rating   Name   Duplication   Size   Complexity  
B validate() 0 23 6
A create() 0 9 3
A get_queryset() 0 10 3
1
from django.http import Http404, HttpResponseForbidden
2
from django.core.exceptions import ValidationError
3
4
from rest_framework import viewsets, decorators, status, mixins
5
from rest_framework.response import Response
6
from rest_framework.permissions import IsAuthenticated
7
from dry_rest_permissions.generics import DRYPermissions
8
9
from sigma_core.models.group_field import GroupField
10
from sigma_core.serializers.group_field import GroupFieldSerializer
11
12
class GroupFieldViewSet(mixins.CreateModelMixin,    # Only Group admin
13
                   mixins.RetrieveModelMixin,       # Every Group member (including not accepted group members - for "open" groups)
14
                   mixins.UpdateModelMixin,         # Same permission as create
15
                   mixins.DestroyModelMixin,        # Same permission as create
16
                   mixins.ListModelMixin,           # Same permission as retrieve
17
                   viewsets.GenericViewSet):
18
    queryset = GroupField.objects.all()
19
    serializer_class = GroupFieldSerializer
20
    permission_classes = [IsAuthenticated, DRYPermissions, ]
21
    filter_fields = ('name', )
22
23
    # You will never see fields for groups you are not a member of
24
    def get_queryset(self):
25
        from sigma_core.models.group_member import GroupMember
26
        if not self.request.user.is_authenticated():
27
            return self.queryset.none()
28
        if self.request.user.is_sigma_admin():
29
            return self.queryset
30
        # @sqlperf: Find which one is the most efficient
31
        my_groups = GroupMember.objects.filter(user=self.request.user.id).values_list('group', flat=True)
32
        #my_groups = Group.objects.filter(memberships__user=self.request.user.id)
33
        return self.queryset.filter(group__in=my_groups)
34
35
    def create(self, request):
36
        serializer = GroupFieldSerializer(data=request.data)
37
        if not serializer.is_valid():
38
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
39
        if not request.user.has_group_admin_perm(serializer.validated_data.get('group')):
40
            return Response('Not group administrator', status=status.HTTP_403_FORBIDDEN)
41
42
        serializer.save()
43
        return Response(serializer.data, status=status.HTTP_201_CREATED)
44
45
    @decorators.detail_route(methods=['post'])
46
    def validate(self, request, pk):
47
        """
48
        For given custom field $pk, we check if the client input passes the Validation
49
        """
50
        from sigma_core.models.group_field import GroupField
51
        if not request.user.is_authenticated():
52
            return Response(status=status.HTTP_401_UNAUTHORIZED)
53
        client_input = request.data.get('value')
54
        if client_input is None:
55
            return Response("No value given", status=status.HTTP_400_BAD_REQUEST)
56
57
        try:
58
            gf = self.get_queryset().get(id=pk)
59
            try:
60
                gf.validator.validate_input(gf.validator_values, client_input)
61
                return Response({"status": "ok"}, status=status.HTTP_200_OK)
62
            except ValidationError as err:
63
                return Response({"status": "ko", "message": err.messages}, status=status.HTTP_200_OK)
64
            except:
65
                return Response({"status": "ko", "message": "Invalid input"}, status=status.HTTP_200_OK)
66
        except:
67
            return Response(status=status.HTTP_404_NOT_FOUND)
68