Source code for apps.api.views.reservation_view

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.response import Response
from apps.api.serializers.serializers import ReservationSerializer
from apps.core.models.reservation import Reservation
from django.utils import timezone
from apps.api.exceptions import ApiException, ValidationException
from apps.api.model_helper import get_reservation
from datetime import datetime


[docs]def check_if_reservation_is_possible(reservation, update_same=False): reservations_for_area = Reservation.objects.filter(area_id=reservation['area']) if reservations_for_area: for r in reservations_for_area: if r.time_from <= reservation['time_to'] and r.time_to >= reservation['time_from']: return False return True
[docs]class ReservationViewManagement(APIView): # permission_classes = (IsAuthenticated,)
[docs] def post(self, request): serializer = ReservationSerializer(data=request.data) if not serializer.is_valid(): raise ValidationException(f"Validation error: {serializer.errors}", status.HTTP_400_BAD_REQUEST) if check_if_reservation_is_possible(serializer.validated_data): serializer.save() return Response(status=status.HTTP_201_CREATED, data=serializer.data) else: data = 'You can not post an overlapping reservation for same area' raise ApiException(data, status.HTTP_400_BAD_REQUEST)
[docs]class ReservationViewDetail(APIView): # permission_classes = (IsAuthenticated,)
[docs] def put(self, request, reservation_id): data = request.data reservation = get_reservation(reservation_id) serializer = ReservationSerializer(reservation, data=data) if not serializer.is_valid(): raise ValidationException(f"Validation error: {serializer.errors}", status.HTTP_400_BAD_REQUEST) if check_if_reservation_is_possible(serializer.validated_data): serializer.save() return Response(status=status.HTTP_200_OK, data=serializer.data) else: data = 'You can not post an overlapping reservation for same area' raise ApiException(data, status.HTTP_400_BAD_REQUEST)
[docs] def get(self, request, reservation_id): #it doesnt' work if you change reservation_id parameter to area_id #Only in this endpoint reservation_id represents area UUID try: reservations = Reservation.objects.filter(area=reservation_id ,deleted_at__isnull=True) except Reservation.DoesNotExist: raise ApiException("Reservation does not exists.", status.HTTP_404_NOT_FOUND) serialized = ReservationSerializer(reservations, many=True) return Response(status=status.HTTP_200_OK, data=serialized.data)
[docs] def delete(self, request, reservation_id): reservation = get_reservation(reservation_id) reservation.soft_delete() return Response(status=status.HTTP_200_OK)