Выполнить запись RRCLE icalendar

Я использую модуль icalendar для разбора (google) записей календаря и модуля dateutil.rrule для обработки повторяющихся событий.

В настоящее время я использую класс rrulestr для анализа (части) данных RRULE и rruleset для добавления EXDATE:

from icalendar import Event
from dateutil.rrule import rrulestr, rruleset
from datetime import datetime, timedelta
from pytz import UTC    
from pprint import pprint

# example google calendar entry
event_text = """BEGIN:VEVENT
SUMMARY:Test Event
DTSTART;TZID=Europe/Paris:20160806T100000
DTEND;TZID=Europe/Paris:20160806T120000
RRULE:FREQ=WEEKLY;UNTIL=20160910T000000Z
EXDATE;TZID=Europe/Paris:20160813T100000
EXDATE;TZID=Europe/Paris:20160820T100000
END:VEVENT"""

event = Event.from_ical(event_text)

rules_text = '\n'.join([line for line in event.content_lines()
                        if line.startswith('RRULE')])

rules = rruleset()

first_rule = rrulestr(rules_text,
                      dtstart=event.get('dtstart').dt)

# in some entries, tzinfo is missing
if first_rule._until and first_rule._until.tzinfo is None:
    first_rule._until = first_rule._until.replace(tzinfo=UTC)

rules.rrule(first_rule)

exdates = event.get('exdate')

if not isinstance(exdates, list):  # apparently this isn't a list when
    exdates = [exdates]            # there is only one EXDATE
for exdate in exdates:
    try:
        rules.exdate(exdate.dts[0].dt)
    except AttributeError:  # sometimes there is a None entry here
        pass

now = datetime.now(tz=UTC)
in_2_months = now + timedelta(days=60)
pprint(rules.between(now, in_2_months))

По-видимому, это работает, но мне интересно, есть ли более компактный и чистый способ сделать это?

Мне особенно не нравится тот факт, что строка RRULE анализируется дважды.

Можно ли обрабатывать отсутствие tzinfo по-другому?

Что-то еще?

15 голосов | спросил nicoco 6 AM000000110000003731 2016, 11:16:37

1 ответ


1
  

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

Если вы собираетесь использовать открытый API модуля rrule, тогда да, ваш подход - лучший способ сделать это.

ответил J_H 30 J000000Sunday17 2017, 23:42:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132