Completed
Pull Request — master (#24)
by
unknown
56s
created

ClusterViewSet.get_permissions()   A

Complexity

Conditions 3

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 3
dl 0
loc 4
rs 10
1
from django.http import Http404
2
3
from rest_framework import viewsets, decorators, status, mixins
4
from rest_framework.response import Response
5
from rest_framework.permissions import IsAuthenticated, AllowAny
6
7
from sigma_core.models.cluster import Cluster
8
from sigma_core.models.group import Group
9
from sigma_core.models.group_member import GroupMember
10
from sigma_core.serializers.cluster import BasicClusterSerializer, ClusterSerializer
11
12
13
class ClusterViewSet(mixins.CreateModelMixin,   # Only sigma admins
14
                    mixins.ListModelMixin,      # Everyone (even if not authed)
15
                    mixins.RetrieveModelMixin,  # Everyone (even if not authed)
16
                    mixins.UpdateModelMixin,    # Only sigma admins
17
                    mixins.DestroyModelMixin,   # ??
18
                    viewsets.GenericViewSet):
19
    queryset = Cluster.objects.all()
20
    serializer_class = ClusterSerializer
21
    permission_classes = [IsAuthenticated, ]
22
23
    def only_staff(func):
24
        def func_wrapper(self, request, *args, **kwargs):
25
            if not request.user.is_authenticated() or not request.user.is_sigma_admin():
26
                return Response(status=status.HTTP_403_FORBIDDEN)
27
            return func(self, request, *args, **kwargs)
28
        return func_wrapper
29
30
    def restrict_queryset_to_administrated_clusters(func):
31
        def func_wrapper(self, request, *args, **kwargs):
32
            if not request.user.is_sigma_admin():
33
                self.queryset = self.queryset.filter(pk__in=GroupMember.objects.filter(user=request.user, perm_rank=Group.ADMINISTRATOR_RANK).values_list('group', flat=True))
34
            return func(self, request, *args, **kwargs)
35
        return func_wrapper
36
37
    @only_staff
38
    def create(self, request):
39
        return super().create(request)
40
41
    @restrict_queryset_to_administrated_clusters
42
    def update(self, request, pk=None):
43
        return super().update(request, pk=pk)
44
45
    @only_staff
46
    def destroy(self, request, pk=None):
47
        return super().destroy(request, pk=pk)
48
49
    def get_permissions(self):
50
        if self.action == 'list' or self.action == 'retrieve':
51
            self.permission_classes = [AllowAny, ]
52
        return super().get_permissions()
53
54
    def get_serializer_class(self):
55
        if self.action == 'list':
56
            return BasicClusterSerializer
57
        return super().get_serializer_class()
58