2013-11-15 2 views
1

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

Мне нужна функция, чтобы проверить, действительно ли указанный элемент уже забронирован в течение периода, в который я хочу его использовать (чтобы заказ не сработал). Вы можете мне помочь?

models.py

from django.db import models 
from datetime import * 
from django.db.models import Q 
import datetime 
from django.core.exceptions import ValidationError 
class Reservation(models.Model): 
     date_debut = models.DateTimeField('debut de la reservation') 
     date_fin = models.DateTimeField('fin de la reservation') 
     obj_res = models.ForeignKey('Materiel') 
     notice = models.CharField(max_length=200) 
     personne = models.ForeignKey('Personne') 
     def __int__(self): 
       return self.id 

     def save(self, *args, **kwargs): 
      new_start_date = datetime.datetime(2013, 11, 16, 10, 00) 
      new_end_date = datetime.datetime(2013, 11, 16, 11, 00) 
      material = Materiel.objects.get(nom="Bimaire 1") 

      clashing_reservations = Reservation.objects.filter(obj_res=material).filter(
       Q(date_debut__lte=new_start_date, date_fin__gte=new_start_date) | 
       Q(date_debut__lt=new_end_date, date_fin__gte=new_end_date) 
      ) 
      if clashing_reservations.exists(): 
       raise ValidationError('Those dates clash with another reservation.')  

      return super(Reservation, self).save(*args, **kwargs) 


class Materiel(models.Model): 
     nom = models.CharField(max_length=200) 
     description = models.CharField(max_length=200) 
     responsable = models.CharField(max_length=200) 
     modalites = models.CharField(max_length=200) 

     def __unicode__(self): 
       return self.nom 


class Personne(models.Model): 
     nom = models.CharField(max_length=200) 
     prenom = models.CharField(max_length=200) 

     def __unicode__(self): 
       return self.nom 

views.py

def reservation(request): 
    if request.POST: 
     form = ReservationForm(request.POST, request.FILES) 
     if form.is_valid(): 
       form.save() 



    else: 
     form = ReservationForm() 

    args = {} 
    args.update(csrf(request)) 

    args["form"] = form 

    return render_to_response("reservation.html", args) 

EDIT Благодаря до сих пор это, кажется, работает. Но теперь я хочу определить, что new_start_date и new_end_date являются фактическими значениями формы.

+0

Вы должны сравнить время начала и окончания каждой оговорки. –

+0

Период перекрытия другой, если дата начала первого периода или конечная дата находится между другими начальными и конечными датами периодов или наоборот –

ответ

2

Я не знаю формат, в котором указаны ваши даты, но независимо от того, вы можете использовать модуль datetime, чтобы сравнить (вычесть, добавить, выше/ниже и т. Д.) Даты и время друг с другом.

Так что я сделал простой пример, чтобы проиллюстрировать его использование (я полагаю, ваш формат месяцев/дней/лет):

from datetime import * 
debut_date = datetime.strptime(date_debut_db, "%m/%d/%y") 
fin_date = datetime.strptime(date_fin_db, "%m/%d/%y") 

debut_date2 = datetime.strptime(date_debut_form, "%m/%d/%y") 
fin_date2 = datetime.strptime(date_fin_form, "%m/%d/%y") 

if (debut_date2 > debut_date and debut_date2 < fin_date) or (fin_date2 > debut_date and fin_date2 < fin_date): 
    print "Impossible!" 
else: 
    print "Possible!" 

date_debut_db и date_fin_db являются даты вы получаете из база данных, тогда как date_debut_form и date_fin_form являются те, которые пользователь заполняет.

3

Это непроверенный код, но я считаю, что эта логика должен проверить, не совпадают ли какие-либо другие оговорки, представленные в форме. Вероятно, это должно быть указано в методе clean формы или какой-либо другой проверке. Может быть, даже на save способе Reservation модели:

from django.db.models import Q 

new_start_date = datetime.datetime(2013, 11, 16, 10, 00) 
new_end_date = datetime.datetime(2013, 11, 16, 11, 00) 
material = Materiel.objects.get(nom='Whatever') 

clashing_reservations = Reservation.objects.filter(objet=material).filter(
    Q(date_debut__lte=new_start_date, date_fin__gte=new_start_date) | 
    Q(date_debut__lt=new_end_date, date_fin_gte=new_end_date) 
) 
if clashing_reservations.exists(): 
    raise ValidationError('Those dates clash with another reservation.') 
+0

Работает для всех перекрывающихся случаев (включая даты), кроме тех, где создаваемый блок полностью перекрывает существующий блок. (создание блока для 4-7 и 3-6 блоков). – Dhruv

Смежные вопросы