from django.shortcuts import render from django.http import JsonResponse from rest_framework.views import APIView from rest_framework.generics import ListAPIView from rest_framework import status from rest_framework.response import Response from .serializers import RoomSerializer, CreateRoomSerializer, UpdateRoomSerializer from .models import Room # Create your views here. class RoomView(ListAPIView): queryset = Room.objects.all() serializer_class = RoomSerializer class GetRoom(APIView): serializer_class = RoomSerializer lookup_url_kwarg = 'code' def get(self, request, format=None): code = request.GET.get(self.lookup_url_kwarg) if code != None: room = Room.objects.filter(code=code) if room.exists(): data = RoomSerializer(room[0]).data data['is_host'] = self.request.session.session_key == room[0].host return Response(data, status=status.HTTP_200_OK) else: return Response({'Room Not Found': 'Invalid Room Code.'}, status=status.HTTP_400_BAD_REQUEST) class JoinRoom(APIView): lookup_url_kwarg = 'code' def post(self, request, format=None): if not self.request.session.exists(self.request.session.session_key): self.request.session.create() code = request.data.get(self.lookup_url_kwarg) if code != None: room_set = Room.objects.filter(code=code) if room_set.exists(): room = room_set[0] self.request.session['code'] = code return Response({'message': 'Room Joined.'}, status=status.HTTP_200_OK) else: return Response({'Bad Request': 'Invalid room code'}, status=status.HTTP_400_BAD_REQUEST) else: return Response({'Bad Request': 'Invalid data, did not find code'}, status=status.HTTP_400_BAD_REQUEST) class LeaveRoom(APIView): def patch(self, request, format=None): if 'code' in self.request.session: self.request.session.pop('code') host = self.request.session.session_key room_set = Room.objects.filter(host=host) if room_set.exists(): room = room_set[0] room.delete() return Response({'message': 'Success'}, status=status.HTTP_200_OK) class CreateRoomView(APIView): serializer_class = CreateRoomSerializer def post(self, request, format=None): if not self.request.session.exists(self.request.session.session_key): self.request.session.create() serializer = self.serializer_class(data=request.data) if serializer.is_valid(): guest_can_pause = serializer.data.get("guest_can_pause") votes_to_skip = serializer.data.get("votes_to_skip") host = self.request.session.session_key queryset = Room.objects.filter(host=host) if queryset.exists(): room = queryset[0] room.guest_can_pause = guest_can_pause room.votes_to_skip = votes_to_skip room.save(update_fields=['guest_can_pause', 'votes_to_skip']) self.request.session['code'] = room.code return Response(RoomSerializer(room).data, status=status.HTTP_200_OK) else: room = Room(host=host, guest_can_pause=guest_can_pause, votes_to_skip=votes_to_skip) room.save() self.request.session['code'] = room.code return Response(RoomSerializer(room).data, status=status.HTTP_201_CREATED) else: return Response({'Bad Request': 'Invalid data...'}, status=status.HTTP_400_BAD_REQUEST) class UpdateRoomView(APIView): serializer_class = UpdateRoomSerializer def patch(self, request, format=None): serializer = self.serializer_class(data=request.data) if serializer.is_valid(): guest_can_pause = serializer.data.get('guest_can_pause') votes_to_skip = serializer.data.get('votes_to_skip') code = serializer.data.get('code') room_set = Room.objects.filter(code=code) if room_set.exists(): room = room_set[0] user_id = self.request.session.session_key if room.host != user_id: return Response({'message': 'You are not the host of this room.'}, status = status.HTTP_403_FORBIDDEN) room.guest_can_pause = guest_can_pause room.votes_to_skip = votes_to_skip room.code = code room.save(update_fields=['guest_can_pause', 'votes_to_skip']) return Response(RoomSerializer(room).data, status=status.HTTP_200_OK) else: return Response({'Bad Request': 'No room was found'}, status=status.HTTP_404_NOT_FOUND) return Response({'Bad Request': 'Invalid data'}, status=status.HTTP_400_BAD_REQUEST) class UserDetails(APIView): def get(self, request, format=None): if not self.request.session.exists(self.request.session.session_key): self.request.session.create() data = { 'code': self.request.session.get('code') } return JsonResponse(data, status=status.HTTP_200_OK)