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

GroupMemberValueViewSet.create()   A

Complexity

Conditions 4

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 4
dl 0
loc 11
rs 9.2
1
from django.http import Http404, HttpResponseForbidden
2
from django.core.exceptions import ValidationError
3
from django.db.models import Q
4
5
from rest_framework import viewsets, decorators, status, mixins
6
from rest_framework.response import Response
7
from rest_framework.permissions import IsAuthenticated
8
from dry_rest_permissions.generics import DRYPermissions
9
10
from sigma_core.models.group_field import GroupField
11
from sigma_core.models.group_member import GroupMember
12
from sigma_core.models.group_member_value import GroupMemberValue
13
from sigma_core.serializers.group_member_value import GroupMemberValueSerializer
14
15
class GroupMemberValueViewSet(
16
        # You can only create a customfield for yourself
17
        # and you should be member of the group
18
        # and the group and customfield should match
19
        # ie membership.user = request.user && membership.group == field.group
20
                mixins.CreateModelMixin,
21
        # Only *accepted* group members can see other members custom fields
22
        # But you can always see your own custom fields
23
                mixins.RetrieveModelMixin,
24
                mixins.UpdateModelMixin,         # Only your own fields
25
                mixins.DestroyModelMixin,        # Only your own fields
26
                mixins.ListModelMixin,           # Same as "Retrieve"
27
                viewsets.GenericViewSet):
28
    queryset = GroupMemberValue.objects.all()
29
    available_memberships = GroupMember.objects.all()
30
    serializer_class = GroupMemberValueSerializer
31
    permission_classes = [IsAuthenticated, DRYPermissions, ]
32
    filter_fields = ('membership__user', 'membership__group', 'membership', 'field', 'value')
33
34
    # HERE we handle permissions filtering
35
    # You will never see fields for groups you are not a member of
36
    def get_queryset(self):
37
        from sigma_core.models.group_member import GroupMember
38
        if not self.request.user.is_authenticated():
39
            return self.queryset.none()
40
        if self.request.user.is_sigma_admin():
41
            return self.queryset
42
        # @sqlperf: Find which one is the most efficient
43
        my_groups = self.available_memberships.filter(user=self.request.user.id).filter(perm_rank__gte=1).values_list('group', flat=True)
44
        #my_groups = GroupMember.objects.filter(user=self.request.user.id)
45
        # But can always see your own custom fields
46
        return self.queryset.filter(Q(membership__group__in=my_groups) | Q(membership__user=self.request.user.id))
47
48
    def create(self, request):
49
        serializer = GroupMemberValueSerializer(data=request.data)
50
        if not serializer.is_valid():
51
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
52
        mship = serializer.validated_data.get('membership')
53
        # Only Sigma admins can create values for other members
54
        if mship.user != request.user and not request.user.is_sigma_admin():
55
            return Response(status=status.HTTP_400_BAD_REQUEST)
56
57
        serializer.save()
58
        return Response(serializer.data, status=status.HTTP_201_CREATED)
59