Проверка перекрывающегося бронирования

Я разрабатываю систему бронирования на 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

Я погуглил, чтобы найти возможное решение, но пока мне не повезло. Я думаю, что моя проблема на самом деле в логике проверки в представлениях, но я не смог понять, как ее решить.

Вернуться на верх