116 lines
4.7 KiB
Python
116 lines
4.7 KiB
Python
from rest_framework import generics, permissions, status
|
|
|
|
from django.shortcuts import get_object_or_404
|
|
from establishment.models import Establishment
|
|
from booking.models.models import Booking, GuestonlineService, LastableService
|
|
from rest_framework.response import Response
|
|
from booking.serializers.web import (PendingBookingSerializer,
|
|
UpdateBookingSerializer, GetBookingSerializer)
|
|
from utils.serializers import EmptySerializer
|
|
|
|
|
|
class CheckWhetherBookingAvailable(generics.GenericAPIView):
|
|
""" Checks which service to use if establishmend is managed by any """
|
|
|
|
permission_classes = (permissions.AllowAny,)
|
|
serializer_class = EmptySerializer
|
|
pagination_class = None
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
is_booking_available = False
|
|
establishment = get_object_or_404(Establishment, pk=kwargs['establishment_id'])
|
|
service = None
|
|
date = request.query_params.get('date')
|
|
g_service = GuestonlineService()
|
|
l_service = LastableService()
|
|
if not establishment.lastable_id is None and l_service \
|
|
.check_whether_booking_available(establishment.lastable_id, date):
|
|
is_booking_available = True
|
|
service = l_service
|
|
service.service_id = establishment.lastable_id
|
|
elif not establishment.guestonline_id is None and g_service \
|
|
.check_whether_booking_available(establishment.guestonline_id, date):
|
|
is_booking_available = True
|
|
service = g_service
|
|
service.service_id = establishment.guestonline_id
|
|
|
|
response = {
|
|
'available': is_booking_available,
|
|
'type': service.service,
|
|
}
|
|
response.update({'details': service.response} if service.response else {})
|
|
return Response(data=response, status=200)
|
|
|
|
|
|
class CreatePendingBooking(generics.CreateAPIView):
|
|
""" Creates pending booking """
|
|
permission_classes = (permissions.AllowAny,)
|
|
serializer_class = PendingBookingSerializer
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
data = request.data.copy()
|
|
establishment = get_object_or_404(Establishment, pk=kwargs['establishment_id'])
|
|
data['restaurant_id'] = Booking.get_booking_id_by_type(establishment, data.get('type'))
|
|
service = Booking.get_service_by_type(request.data.get('type'))
|
|
data['user'] = request.user.pk if request.user else None
|
|
data['pending_booking_id'] = service.create_pending_booking(service.get_certain_keys(data, {
|
|
'restaurant_id',
|
|
'booking_time',
|
|
'booking_date',
|
|
'booked_persons_number',
|
|
}))
|
|
if not data['pending_booking_id']:
|
|
return Response(status=status.HTTP_403_FORBIDDEN, data='Unable to create booking')
|
|
serializer = self.get_serializer(data=data)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
return Response(status=status.HTTP_201_CREATED, data=serializer.data)
|
|
|
|
|
|
class UpdatePendingBooking(generics.UpdateAPIView):
|
|
""" Update pending booking with contacts """
|
|
queryset = Booking.objects.all()
|
|
permission_classes = (permissions.AllowAny,)
|
|
serializer_class = UpdateBookingSerializer
|
|
|
|
def patch(self, request, *args, **kwargs):
|
|
instance = self.get_object()
|
|
data = request.data.copy()
|
|
service = Booking.get_service_by_type(instance.type)
|
|
data['pending_booking_id'] = instance.pending_booking_id
|
|
service.update_pending_booking(service.get_certain_keys(data, {
|
|
'email', 'phone', 'last_name', 'first_name', 'country_code', 'pending_booking_id',
|
|
}))
|
|
service.commit_booking(data['pending_booking_id'])
|
|
data = {
|
|
'booking_id': service.response.get('id'),
|
|
'id': instance.pk,
|
|
}
|
|
serializer = self.get_serializer(data=data)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.update(instance, data)
|
|
return Response(status=status.HTTP_200_OK, data=serializer.data)
|
|
|
|
|
|
class CancelBooking(generics.DestroyAPIView):
|
|
""" Cancel existing booking """
|
|
queryset = Booking.objects.all()
|
|
permission_classes = (permissions.AllowAny,)
|
|
|
|
|
|
class LastBooking(generics.RetrieveAPIView):
|
|
""" Get last booking by user credentials """
|
|
permission_classes = (permissions.IsAuthenticated,)
|
|
serializer_class = GetBookingSerializer
|
|
lookup_field = None
|
|
|
|
def get_object(self):
|
|
return Booking.objects.by_user(self.request.user).latest('modified')
|
|
|
|
|
|
class GetBookingById(generics.RetrieveAPIView):
|
|
""" Returns booking by its id"""
|
|
permission_classes = (permissions.AllowAny,)
|
|
serializer_class = GetBookingSerializer
|
|
queryset = Booking.objects.all()
|