def post(self, request):
        request_serializer = BookingSerializer(data=request.data)
        request_serializer.is_valid(raise_exception=True)

        booking = Booking()
        booking.check_in = request_serializer.validated_data.get(
            'check_in', None)
        booking.check_out = request_serializer.validated_data.get(
            'check_out', None)
        booking.payment_name = request_serializer.validated_data.get(
            'payment_name', None)
        booking.payment_type = request_serializer.validated_data.get(
            'payment_type', None)
        booking.room_type = request_serializer.validated_data.get(
            'room_type', None)
        booking.guest_id = request_serializer.validated_data.get(
            'guest_id', None)
        booking.payment_id = request_serializer.validated_data.get(
            'payment_id', None)
        if (booking.check_in >= booking.check_out):
            return Response(dict(
                code='check_in_check_out_date_failed',
                detail=
                'Booking check in date should at least 1 day before check out date',
            ),
                            status=status.HTTP_400_BAD_REQUEST)
        booking.update_room()
        booking.save()

        return Response(BookingSerializer(booking).data,
                        status=status.HTTP_201_CREATED)
    def put(self, request, booking_id):
        try:
            booking = Booking.objects.get(id=booking_id)
            if (booking.is_pending):
                if (not booking.expired):
                    request_serializer = BookingSerializer(data=request.data,
                                                           partial=True)
                    request_serializer.is_valid(raise_exception=True)

                    new_booking_status = request_serializer.validated_data.get(
                        'status', booking.status)
                    if (new_booking_status == 'PENDING'):
                        new_booking_status = booking.status

                    booking.check_in = request_serializer.validated_data.get(
                        'check_in', booking.check_in)
                    booking.check_out = request_serializer.validated_data.get(
                        'check_out', booking.check_out)
                    booking.payment_name = request_serializer.validated_data.get(
                        'payment_name', booking.payment_name)
                    booking.payment_type = request_serializer.validated_data.get(
                        'payment_type', booking.payment_type)
                    booking.room_type = request_serializer.validated_data.get(
                        'room_type', booking.room_type)
                    booking.guest_id = request_serializer.validated_data.get(
                        'guest_id', booking.guest_id)
                    booking.payment_id = request_serializer.validated_data.get(
                        'payment_id', booking.payment_id)
                    booking.status = new_booking_status
                    booking.update_room()
                    booking.save()
                    return Response(BookingSerializer(booking).data)

                return Response(dict(
                    code='booking_has_expired',
                    detail='Booking has expired',
                ),
                                status=status.HTTP_400_BAD_REQUEST)

            return Response(dict(
                code='booking_is_not_pending',
                detail='Booking is not pending',
            ),
                            status=status.HTTP_400_BAD_REQUEST)

        except Booking.DoesNotExist:
            return Response(dict(
                code='booking_is_not_found',
                detail='No booking with id %d' % (booking_id),
            ),
                            status=status.HTTP_404_NOT_FOUND)
    def post(self, request, booking_id, booking_status):
        try:
            booking = Booking.objects.get(id=booking_id)
            if (booking.is_pending):
                if (not booking.expired):
                    booking.status = booking_status
                    booking.save()
                    return Response(BookingSerializer(booking).data)

                return Response(dict(
                    code='booking_has_expired',
                    detail='Booking has expired',
                ),
                                status=status.HTTP_400_BAD_REQUEST)

            return Response(dict(
                code='booking_is_not_pending',
                detail='Booking is not pending',
            ),
                            status=status.HTTP_400_BAD_REQUEST)

        except Booking.DoesNotExist:
            return Response(dict(
                code='booking_is_not_found',
                detail='No booking with id %d' % (booking_id),
            ),
                            status=status.HTTP_404_NOT_FOUND)
 def get(self, request, booking_id):
     try:
         booking = Booking.objects.get(id=booking_id)
         return Response(BookingSerializer(booking).data)
     except Booking.DoesNotExist:
         return Response(dict(
             code='booking_is_not_found',
             detail='No booking with id %d' % (booking_id),
         ),
                         status=status.HTTP_404_NOT_FOUND)
 def get(self, request, guest_id):
     bookings = Booking.objects.filter(guest_id=guest_id)
     return Response(BookingSerializer(bookings, many=True).data)