У меня есть API-интерфейс DRF, который должен поддерживать приложение Android и IOS. У API есть три типа пользователей, а именно: Драйвер, Клиент и Администратор.
Клиент должен создать запись о бронировании и автоматически назначить водителю API. В зависимости от наличия дней и времени. В настоящий момент каждый день (Вс, Пн, Вт, Ср, Чт, Пт) является рабочим днем, и продолжительность рабочего дня колеблется с 7:00 до 21:00, а рабочее время, включая переход, составляет один час. Например, бронирование в 9:00 утра займет час, следовательно, время окончания будет 10:00, все факторы включительно. Многие водители могут работать одновременно. Приложение должно дать отзыв пользователю, если он попытается забронировать уже выбранные слоты.
Моя проблема в настоящее время состоит в том, чтобы l oop через уже существующих водителей из таблицы водителей, оставьте их присоединенными к таблице бронирования и и назначьте их один за другим. Я смог назначить одного водителя на работу. Но когда я добавил драйверы, стало трудно. Есть что-то, что я не поправляю, и я не знаю, что это такое.
Вот мои модели.
""" models.py """
""" Helper function to check overlapping times """
def check_time_overlap(self, fixed_start, fixed_end, new_start, new_end):
time_overlap = False
if new_start == fixed_end or new_end == fixed_start: # edge case
time_overlap = False
elif (new_start >= fixed_start and new_start <= fixed_end) or \
(new_end >= fixed_start and new_end <= fixed_end): \
# innner limits
time_overlap = True
elif new_start <= fixed_start and new_end >= fixed_end: \
# outter limits
time_overlap = True
return time_overlap
""" Function to check overlapping bookings """
def overlapping_bookings(self):
if self.finishing_at <= self.booking_time:
raise ValidationError(
'Finishing times must be after booking times'
)
bookings = Booking.objects.filter(
booking_date=self.booking_date, driver_id=self.driver
)
if bookings.exists():
for booking in bookings:
""" Check whether date and time overlaps """
if self.check_time_overlap(
booking.booking_time, booking.finishing_at,
self.booking_time, self.finishing_at
):
""" If all drivers are allocated, raise an error \
message. """
raise ValidationError(
'All our drivers are booked at: ' +
str(booking.booking_date) + ', ' + str(
booking.booking_time) + '-' +
str(booking.finishing_at))
def save(self, *args, **kwargs):
self.calc_booking_total()
self.calc_finishing_at()
self.overlapping_bookings()
super(Booking, self).save(*args, **kwargs)
Из вышеупомянутых моделей я написал функцию для проверки перекрытия время для того же времени booking_date, booking_time и finish_at. Это вдохновлено ALEXANDRE PINTO on> https://alexpnt.github.io/2017/07/15/django-calendar/
Ниже приведены сериализаторы
# BOOKING SERIALIZER
# ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––#
class BookingSerializer(serializers.ModelSerializer):
package = serializers.SerializerMethodField()
vehicle_type = serializers.SerializerMethodField()
client_name = serializers.SerializerMethodField()
client_phone = serializers.SerializerMethodField()
class Meta:
model = Booking
# fields = '__all__'
exclude = ('driver',)
read_only_fields = (
'booking_total', 'booking_status',
'booked_at', 'finishing_at', 'client'
)
def get_package(self, obj):
return obj.service.package_name
def get_vehicle_type(self, obj):
return obj.service.vehicle_category.name
def get_client_name(self, obj):
return obj.client.name
def get_client_phone(self, obj):
return str(obj.client.phone)
""" Function to create booking based on authenticated client and available drivers """
def create(self, validated_data):
validated_data['client'] = self.context['request'].user
validated_data['driver'] = Driver.objects.get(active=True)
bookings = Booking.objects.create(**validated_data)
return bookings
Вот журналы моего сервера:
Журнал сервера