ウェブアプリケーションの会場リストのための "今は開いている"フィルタを実装する

私は会場を記載した私のウェブサイトのために "今は開かれています"というフィルターを実装する必要がありますが、どこから始めたらいいか分かりません。私のウェブサイトはPython、webpy、MySQLデータベースを使って実装されています。

私は各会場の営業時間を保存し、今開いている会場を選択する必要があります。

営業時間の例:「平日9:30〜11:00、週末11:00〜11:00」、「6:00〜7:

営業時間は週ごとに異なる場合があり、1日に複数の時間間隔がある場合があります。特定の休日の場合は例外をハックする必要があります。

インタフェース、データスキーマ、およびクエリに関するヒント/ご提案は歓迎します。

UPD:私はこの解決策を思いつきました、それは大丈夫ですか?

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
from ... import * は避けるべきです。より明示的にインポートするものを指定します。
追加された 著者 ThiefMaster,
訂正していただきありがとうございます。私は最終コードで import * しません。
追加された 著者 Andrey Kuzmin,

1 答え

私は django-schedule というアプリを使いましたが、これにはいくつかの類似の機能があります。

あなたがソースを掘り下げた場合は、その下に python-dateutil (参照)が使われていることがわかります。データベース内の各イベントのスケジュールルールのリストを保持します。

あなたは同様の戦術を使うことができます。開催地オープンステータスが問い合わせられると、現在の日時が会場のスケジュールルールによって提供されたオカレンスの開始/終了内に収まるかどうかを確認します。そうであれば、それは開いています。

2
追加された
あなたの提案に基づいてフィルタコードを実装しました。休日の例外を設定する方法はありますか?
追加された 著者 Andrey Kuzmin,
会場は異なる休日に異なるスケジュールを持つことができます。私は自動的にそれらをすべて閉じたと思っています、そして彼らが休暇のスケジュールを与えたら、それは定期的なスケジュールの代わりにそれを使用してください。
追加された 著者 Andrey Kuzmin,
私はあなたの答えが私の仕事を助けてくれたので、あなたの答えを受け入れたとマークしました。ありがとう!
追加された 著者 Andrey Kuzmin,
最も簡単な方法は、主要な休日のリストを保持し、別のifステートメントをコードに追加することです。 maj_holiday_listのnow.date():ven_is_open = False
追加された 著者 Gringo Suave,