diff --git a/apps/booking/models/models.py b/apps/booking/models/models.py index 203189b8..41cfc6d7 100644 --- a/apps/booking/models/models.py +++ b/apps/booking/models/models.py @@ -19,7 +19,7 @@ class Booking(ProjectBaseMixin): (GUESTONLINE, 'GuestOnline') ) type = models.CharField(max_length=2, choices=AVAILABLE_SERVICES, verbose_name=_('Guestonline or Lastable')) - restaurant_id = models.PositiveIntegerField(verbose_name=_('booking service establishment id'), default=None) + restaurant_id = models.TextField(verbose_name=_('booking service establishment id'), default=None) booking_user_locale = models.CharField(verbose_name=_('booking locale'), default='en', max_length=10) pending_booking_id = models.TextField(verbose_name=_('external service pending booking'), default=None) booking_id = models.TextField(verbose_name=_('external service booking id'), default=None, null=True, diff --git a/apps/booking/models/services.py b/apps/booking/models/services.py index 68bc68d4..c7f0c928 100644 --- a/apps/booking/models/services.py +++ b/apps/booking/models/services.py @@ -40,12 +40,12 @@ class AbstractBookingService(ABC): pass @abstractmethod - def create_pending_booking(self, payload): + def create_booking(self, payload): """ returns pending booking id if created. otherwise False """ pass @abstractmethod - def update_pending_booking(self, payload): + def update_booking(self, payload): """ updates pending booking with contacts """ pass @@ -87,7 +87,7 @@ class GuestonlineService(AbstractBookingService): raise serializers.ValidationError(detail='Booking already committed.') return status.is_success(r.status_code) - def update_pending_booking(self, payload): + def update_booking(self, payload): booking_id = payload.pop('pending_booking_id') url = f'{self.url}v1/pending_bookings/{booking_id}' payload['lastname'] = payload.pop('last_name') @@ -97,8 +97,8 @@ class GuestonlineService(AbstractBookingService): r = requests.put(url, headers=headers, data=json.dumps({'contact_info': payload})) return status.is_success(r.status_code) - def create_pending_booking(self, payload): - url = self.url + 'v1/pending_bookings' + def create_booking(self, payload): + url = f'{self.url}v1/pending_bookings' payload['hour'] = payload.pop('booking_time') payload['persons'] = payload.pop('booked_persons_number') payload['date'] = payload.pop('booking_date') @@ -124,11 +124,14 @@ class LastableService(AbstractBookingService): 'https': settings.LASTABLE_PROXY, } - def create_pending_booking(self, payload): - return False - # url = f'{self.url}v1/restaurant/5d951f0e2dc6a50017588065/offers' - # r = requests.post(url, headers=self.get_common_headers(), proxies=self.proxies) - # return json.loads(r.content)['id'] if status.is_success(r.status_code) else False + def create_booking(self, payload): + url = f'{self.url}v1/partner/orders' + payload['places'] = payload.pop('booked_persons_number') + payload['hour'] = payload.pop('booking_time') + payload['firstName'] = payload.pop('first_name') + payload['lastName'] = payload.pop('last_name') + r = requests.post(url, headers=self.get_common_headers(), proxies=self.proxies, data=json.dumps(payload)) + return json.loads(r.content)['data']['_id'] if status.is_success(r.status_code) else False def get_common_headers(self): return {'Authorization': f'Bearer {self.token}', 'Content-type': 'application/json', @@ -145,13 +148,19 @@ class LastableService(AbstractBookingService): return True def commit_booking(self, payload): + """ Lastable service has no pending booking to commit """ return False - def update_pending_booking(self, payload): + def update_booking(self, payload): + """ Lastable service has no pending booking to update """ return False def cancel_booking(self, payload): - return False + url = f'{self.url}v1/partner/orders/{payload}' + r = requests.delete(url, headers=self.get_common_headers(), proxies=self.proxies) + return status.is_success(r.status_code) def get_booking_details(self, payload): - return {} + url = f'{self.url}v1/partner/orders/{payload}' + r = requests.get(url, headers=self.get_common_headers(), proxies=self.proxies) + return json.loads(r.content) diff --git a/apps/booking/serializers/web.py b/apps/booking/serializers/web.py index 8b4f1d91..1094aef8 100644 --- a/apps/booking/serializers/web.py +++ b/apps/booking/serializers/web.py @@ -26,7 +26,8 @@ class CheckBookingSerializer(serializers.ModelSerializer): class PendingBookingSerializer(serializers.ModelSerializer): - restaurant_id = serializers.IntegerField(read_only=True) + restaurant_id = serializers.CharField() + booking_id = serializers.CharField(allow_null=True, allow_blank=True) id = serializers.ReadOnlyField() user = serializers.ReadOnlyField() @@ -36,6 +37,7 @@ class PendingBookingSerializer(serializers.ModelSerializer): 'id', 'type', 'restaurant_id', + 'booking_id', 'pending_booking_id', 'user', ) diff --git a/apps/booking/views.py b/apps/booking/views.py index 5fc342ce..391c45d8 100644 --- a/apps/booking/views.py +++ b/apps/booking/views.py @@ -1,4 +1,4 @@ -from rest_framework import generics, permissions, status +from rest_framework import generics, permissions, status, serializers from django.shortcuts import get_object_or_404 from establishment.models import Establishment @@ -48,18 +48,22 @@ class CreatePendingBooking(generics.CreateAPIView): def post(self, request, *args, **kwargs): data = request.data.copy() + if data.get('type') == Booking.LASTABLE and data.get("offer_id") is None: + raise serializers.ValidationError(detail='Offer_id is required field for Lastable service') 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', - })) + service_to_keys = { + Booking.GUESTONLINE: {'restaurant_id', 'booking_time', 'booking_date', 'booked_persons_number', }, + Booking.LASTABLE: {'booking_time', 'booked_persons_number', 'offer_id', 'email', 'phone', + 'first_name', 'last_name', }, + } + data['pending_booking_id'] = service.create_booking( + service.get_certain_keys(data.copy(), service_to_keys[data.get('type')])) if not data['pending_booking_id']: return Response(status=status.HTTP_403_FORBIDDEN, data='Unable to create booking') + data['booking_id'] = data['pending_booking_id'] if data.get('type') == Booking.LASTABLE else None serializer = self.get_serializer(data=data) serializer.is_valid(raise_exception=True) serializer.save() @@ -77,7 +81,7 @@ class UpdatePendingBooking(generics.UpdateAPIView): 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, { + service.update_booking(service.get_certain_keys(data, { 'email', 'phone', 'last_name', 'first_name', 'country_code', 'pending_booking_id', })) service.commit_booking(data['pending_booking_id'])