Web uygulamasında yerlerin listesi için "şimdi açık" filtresi uygulaması

Mekanları listeleyen web siteme "şimdi açık" filtresi uygulamam gerekiyor, ancak nereden başlayacağımı bilmiyorum. Web sitem Python, webpy, MySQL veritabanı kullanılarak uygulanmaktadır.

Her mekan için açılış saatlerini saklamalı ve şimdi açık olan mekanları seçmeliyim.

Çalışma saatleri örneği: "Hafta içi 9: 30-11: 00, hafta sonları 11: 00-11: 00 arasında çalışır" veya "Saat 6: 00-7: 00 saatleri arasında çalışma günleri boyunca devam eder".

Açılış saatleri haftanın her günü için farklı olabilir, günün birden fazla zaman aralığı olabilir ve belirli tatiller için istisnaları kırmam gerekir.

Arabirim, veri şeması ve sorgu ile ilgili herhangi bir ipucu/öneri bekliyoruz.

UPD: Bu çözümü bulmayı başardım, tamam mı?

from dateutil.relativedelta import *
from dateutil.rrule import *
from datetime import *
from date import *

# venue can have many rules
hours_start = 23
minutes_start = 30
hours_end = 13  # if time_end is less than time_start then it ends next day
minutes_end = 30
days_of_week = (TH)

hours_diff = hours_end - hours_start
minutes_diff = minutes_end - minutes_start

if hours_diff < 0 or hours_diff == 0 and minutes_diff < 0:
    hours_diff += 24

datetime_start = date.today() + relativedelta(hours=+hours_start, minutes=+minutes_start, days=-1) # Yesterday time_start
now = datetime.now()
occurrence = rrule(WEEKLY, wkst=MO, byweekday=days_of_week, dtstart=datetime_start).before(now, True)

if now <= occurrence + relativedelta(hours=hours_diff, minutes=minutes_diff):
    print "IS OPEN NOW"
1
'dan ... import * ' dan kaçınmalısınız. Daha iyi ne almak istediğinizi açıkça belirtin.
katma yazar ThiefMaster, kaynak
Düzeltme için teşekkürler, son kodumda import * kullanmayacağım.
katma yazar Andrey Kuzmin, kaynak

1 cevap

Benzer özelliklere sahip olan django-schedule adlı bir uygulama kullandım.

Kaynağa girerseniz, altındaki python-dateutil (kurallara bakın) kullandığını görürsünüz. Veritabanındaki her olay için zamanlama kurallarının bir listesini tutar.

Benzer bir taktik kullanabilirsiniz. Açık alan durumu sorgulandığında, geçerli tarihin mekanın program kuralları tarafından sağlanan bir olayın başlangıcına/bitişine uyup uymadığını görün. Eğer öyleyse, açık.

2
katma
Önerinize göre filtre kodu uyguladım. Tatiller için istisnalar nasıl belirleneceği hakkında bir fikriniz var mı?
katma yazar Andrey Kuzmin, kaynak
Farklı tatil günlerinde mekanın farklı programları olabilir. Hepsini otomatik olarak kapatmayı düşünüyorum ve tatil programı veriyorlarsa normal program yerine onu kullanın.
katma yazar Andrey Kuzmin, kaynak
Cevabınızı kabul edildi olarak işaretledim, çünkü kural öneriniz bu konuyu çözmeme yardımcı oldu. Teşekkürler!
katma yazar Andrey Kuzmin, kaynak
En basit yol, büyük tatillerin bir listesini tutmak ve bir başka ifadeyi koda eklemektir; maj_holiday_list'te if now.date (): ven_is_open = Yanlış
katma yazar Gringo Suave, kaynak