ChatMemberViewSet.create()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 2
rs 10
cc 1
1
from django.http import Http404
2
from django.db.models import Prefetch, Q
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 rest_framework.filters import BaseFilterBackend
8
from dry_rest_permissions.generics import DRYPermissions
9
10
from sigma_core.models.user import User
11
from sigma_chat.models.chat_member import ChatMember
12
from sigma_chat.serializers.chat_member import ChatMemberSerializer
13
from sigma_chat.models.chat import Chat
14
from sigma_chat.models.message import Message
15
from sigma_chat.serializers.message import MessageSerializer
16
17
18
class ChatMemberFilterBackend(BaseFilterBackend):
19
    filter_q = {
20
        'user': lambda u: Q(user=u),
21
        'chat': lambda c: Q(chat=c)
22
    }
23
24
    def filter_queryset(self, request, queryset, view):
25
        """
26
        Limits all list requests w.r.t the Normal Rules of Visibility.
27
        """
28
        user_chat_ids = request.user.user_chatmember.filter(is_member=True).values_list('chat_id', flat=True)
29
        # I can see a ChatMember if and only I am member of the chat
30
        queryset = queryset.prefetch_related(
31
            Prefetch('user', queryset=ChatMember.objects.filter(is_member=True))
32
        ).filter(Q(user_id=request.user.id) | Q(chat_id__in=user_chat_ids)
33
        )
34
35
        for (param, q) in self.filter_q.items():
36
            x = request.query_params.get(param, None)
37
            if x is not None:
38
                queryset = queryset.filter(q(x))
39
40
        return queryset.distinct()
41
42
43
class ChatMemberViewSet(viewsets.ModelViewSet):
44
    queryset = ChatMember.objects.select_related('chat', 'user')
45
    serializer_class = ChatMemberSerializer
46
    permission_classes = [IsAuthenticated, DRYPermissions]
47
    filter_backends = (ChatMemberFilterBackend, )
48
49
    def list(self, request):
50
        """
51
        ---
52
        parameters_strategy:
53
            query: replace
54
        parameters:
55
            - name: user
56
              type: integer
57
              paramType: query
58
            - name: chat
59
              type: integer
60
              paramType: query
61
        """
62
        return super().list(request)
63
64
    def create(self, request):
65
        return Response("You're not authorized to create a new ChatMember this way, please use the website.", status=status.HTTP_403_FORBIDDEN)
66
67
    def update(self, request, pk=None):
68
        return Response("You're not authorized to update a new ChatMember this way, please use the website.", status=status.HTTP_403_FORBIDDEN)
69
70
    @decorators.detail_route(methods=['post'])
71
    def send_message(self, request, pk=None):
72
        """
73
        Send a message for the ChatMember pk.
74
        ---
75
        omit_serializer: true
76
        parameters_strategy:
77
            form: replace
78
        parameters:
79
            - name: text
80
              type: string
81
              required: false
82
            - name: attachments
83
              type: string
84
              required: false
85
        """
86
        try:
87
            chatmember = ChatMember.objects.get(pk=pk)
88
            if not chatmember.is_member or chatmember.user != request.user :
89
                return Response(status=status.HTTP_403_FORBIDDEN)
90
91
            request.data['chat_id'] = chatmember.chat.id
92
            request.data['chatmember_id'] = chatmember.id
93
            message = MessageSerializer(data=request.data)
94
            if message.is_valid():
95
                message.save()
96
                return Response(message.data, status=status.HTTP_201_CREATED)
97
            else:
98
                return Response(message.errors, status=status.HTTP_400_BAD_REQUEST)
99
100
        except ChatMember.DoesNotExist:
101
            raise Http404("ChatMember {0} not found".format(request.data.get('chatmember_id', None)))
102
        return False
103