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)