【问题标题】:Get scheduled events for a specific interval获取特定时间间隔的预定事件
【发布时间】:2020-10-13 10:32:50
【问题描述】:

我有一系列事件,由它们的发生频率设置,例如,每周(如每周二)、每月(每隔一秒)等。 一系列事件有一个开始日期,可以指定或省略结束日期。

例如:

event = Event(
    name='go to the office', 
    startday='13.10.2020', 
    schedule=Schedule(type='weekly', details={'day':'Tuesday'})
)

这只是一个示例界面,可以根据工具的需要进行调整

任务本身就是我需要以一定的起止时间间隔进行查询,并获取该间隔内的所有事件。

因此,问题是,有没有解决此类问题的库,或者我必须重新发明轮子?

我必须在基于Django的项目中这样做,所以如果基于Django的解决方案更方便。

【问题讨论】:

  • 你可以使用django-background-task
  • @Akash Joshi,看起来这个库有像 Celery 这样的功能,但我不需要安排 python 任务,我需要保存事件并在我的应用程序的业务逻辑层中查询它们。
  • 也许在这种情况下,您需要创建自己的模型保存数据并以您想要的方式获取。我不知道有任何图书馆可以帮助您解决这个问题。也许其他人可以帮助你。谢谢

标签: python sql django


【解决方案1】:

我自己找到了一个可行的解决方案,使用来自 python-dateutilrrule 它可以创建重复(重复)事件并使用 between() 方法从中进行查询。

# pip install python-dateutil
from functools import reduce
from operator import itemgetter
from datetime import datetime
from dateutil.rrule import (
    rrule,
    WEEKLY,
    DAILY,
    MO, TU, WE, TH, FR, SA, SU
)

events = [
    {
        'type': 'task',
        'rule': rrule(
            WEEKLY,
            dtstart=datetime(year=2020, month=10, day=13),
        ),
        'name': 'Clean room'
    },
    {
        'type': 'party',
        'rule': rrule(
            WEEKLY,
            dtstart=datetime(year=2020, month=10, day=13),
            until=datetime(year=2020, month=12, day=13),
            byweekday=(SA, SU), wkst=MO,
        ),
        'name': 'Dance',
        'participants': ['Willy', 'Sue'],
    },
    {
        'type': 'meditation',
        'rule': rrule(
            DAILY,
            interval=2,
            dtstart=datetime(year=2020, month=10, day=13),
            until=datetime(year=2020, month=12, day=13)
        ),
        'name': 'Think out',
        'location': 'outside',
    },
]


def main():
    all_events = timeline(
        events,
        startday=datetime(year=2010, month=1, day=1),
        endday=datetime(year=2020, month=11, day=1)
    )

    print('Timeline\n---')
    for event in all_events:
        print_event(event)


def timeline(events, startday, endday):
    all_events = reduce(
        lambda all_events, event:
            all_events + events_list(event, startday, endday),
        events,
        []
    )

    return sorted(all_events, key=itemgetter('date'))


def events_list(event, startday, endday):

    dates = event['rule'].between(startday, endday, inc=True)
    inner_events = [{'date': date, 'event': event} for date in dates]

    return inner_events


def print_event(event):
    print(
        f'{event["date"]}: {event["event"]["name"]} ({event["event"]["type"]})'
    )


if __name__ == "__main__":
    main()

输出:

Timeline
---
2020-10-13 00:00:00: Clean room (task)
2020-10-13 00:00:00: Think out (meditation)
2020-10-15 00:00:00: Think out (meditation)
2020-10-17 00:00:00: Dance (party)
2020-10-17 00:00:00: Think out (meditation)
2020-10-18 00:00:00: Dance (party)
2020-10-19 00:00:00: Think out (meditation)
2020-10-20 00:00:00: Clean room (task)
2020-10-21 00:00:00: Think out (meditation)
2020-10-23 00:00:00: Think out (meditation)
2020-10-24 00:00:00: Dance (party)
2020-10-25 00:00:00: Dance (party)
2020-10-25 00:00:00: Think out (meditation)
2020-10-27 00:00:00: Clean room (task)
2020-10-27 00:00:00: Think out (meditation)
2020-10-29 00:00:00: Think out (meditation)
2020-10-31 00:00:00: Dance (party)
2020-10-31 00:00:00: Think out (meditation)
2020-11-01 00:00:00: Dance (party)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多