Lastable naive realization

This commit is contained in:
Kuroshini 2019-10-03 19:26:09 +03:00
parent 53db4462f8
commit 3da57b72fc
4 changed files with 38 additions and 23 deletions

View File

@ -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,

View File

@ -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)

View File

@ -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',
)

View File

@ -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'])