Проверка перекрывающегося бронирования
Я разрабатываю систему бронирования на Django. У меня есть модель бронирования, и в представлениях есть логика для создания новых бронирований, а также для редактирования бронирований. Логика создания новых бронирований работает отлично, но у меня возникают проблемы при их редактировании. В основном, мне нужно добиться следующего:
- Если я редактирую свою бронь, но не меняю никаких данных, я хочу, чтобы форма была сохранена .
- Если я редактирую свою бронь и меняю некоторые данные, я хочу, чтобы форма сохранялась ТОЛЬКО если она не пересекается с любой другой бронью. Я размещаю некоторый код:
models.py
class Booking(models.Model):
aircraft = models.ForeignKey(Aircraft, on_delete=models.CASCADE)
student = models.ForeignKey(
Student, on_delete=models.CASCADE, blank=True, null=True)
instructor = models.ForeignKey(
Instructor, on_delete=models.CASCADE, blank=True, null=True)
renter = models.ForeignKey(
Renter, on_delete=models.CASCADE, blank=True, null=True)
booking_date = models.DateField()
start_time = models.TimeField()
end_time = models.TimeField()
uid = models.CharField(max_length=200, null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
Поле uid, которое я создал, является своего рода логикой, чтобы иметь своего рода уникальный ID бронирования, чтобы проверить, изменилось ли что-нибудь при редактировании бронирования.
views.py
if request.method == "POST":
aircraft = request.POST.get('aircraft')
student = request.POST.get('student')
instructor = request.POST.get('instructor')
renter = request.POST.get('renter')
date = request.POST.get('date')
start_time = request.POST.get('start_time')
end_time = request.POST.get('end_time')
try:
booking.aircraft_id = aircraft
booking.student_id = student
booking.instructor_id = instructor
booking.renter_id = renter
booking.booking_date = date
booking.start_time = start_time
booking.end_time = end_time
booking.uid = uid_for_booking(aircraft, date, start_time, end_time)
case_1 = Booking.objects.filter(
aircraft=aircraft, booking_date=date, start_time__lt=start_time, end_time__gt=start_time).exists()
case_2 = Booking.objects.filter(
aircraft=aircraft, booking_date=date, start_time__lte=end_time, end_time__gte=end_time).exists()
case_3 = Booking.objects.filter(
aircraft=aircraft, booking_date=date, start_time__gte=start_time, end_time__lte=end_time).exists()
if (case_1 or case_2 or case_3) and (booking_obj.uid != booking.uid):
messages.error(request, 'Aircraft Already Booked')
return HttpResponseRedirect(reverse('booking:edit_booking', kwargs={'pk': pk}))
elif booking.uid == booking_obj.uid:
booking.save()
else:
booking.save()
messages.success(request, "Booking Successfully Edited")
return HttpResponseRedirect(reverse('booking:booking_index', kwargs={'data': date}))
except:
messages.error(request, "Failed to Edit Booking")
return HttpResponseRedirect(reverse('booking:booking_index', kwargs={'pk': pk}))
Метод uid_for_booking:
def uid_for_booking(a, b, c, d):
aircraft = str(a)
date = str(b)
start_time = str(c)
end_time = str(d)
uid = aircraft + date + start_time + end_time
return uid
Я погуглил, чтобы найти возможное решение, но пока мне не повезло. Я думаю, что моя проблема на самом деле в логике проверки в представлениях, но я не смог понять, как ее решить.