2013-11-15 100 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) 

編輯 由於到目前爲止它似乎工作。 但現在我想定義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_dbdate_fin_db是你離開的日期你的數據庫而date_debut_formdate_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

相關問題