mirror of
https://github.com/lucaspalomodevelop/eventcally.git
synced 2026-03-13 00:07:22 +00:00
Merge pull request #401 from eventcally/issues/400
Bugfix iCalendar Recurrency Rule #400
This commit is contained in:
commit
d544557bdd
@ -5,6 +5,7 @@ import icalendar
|
|||||||
from dateutil.relativedelta import relativedelta
|
from dateutil.relativedelta import relativedelta
|
||||||
from flask import url_for
|
from flask import url_for
|
||||||
from flask_babelex import format_date, format_time, gettext
|
from flask_babelex import format_date, format_time, gettext
|
||||||
|
from icalendar.prop import vDDDLists
|
||||||
from sqlalchemy import and_, case, func, or_
|
from sqlalchemy import and_, case, func, or_
|
||||||
from sqlalchemy.orm import aliased, contains_eager, defaultload, joinedload, lazyload
|
from sqlalchemy.orm import aliased, contains_eager, defaultload, joinedload, lazyload
|
||||||
from sqlalchemy.sql import extract
|
from sqlalchemy.sql import extract
|
||||||
@ -530,9 +531,23 @@ def populate_ical_event_with_datish(
|
|||||||
ical_event.add("dtstart", start)
|
ical_event.add("dtstart", start)
|
||||||
|
|
||||||
if recurrence_rule:
|
if recurrence_rule:
|
||||||
ical_event.add(
|
recc_lines = recurrence_rule.splitlines()
|
||||||
"rrule", icalendar.vRecur.from_ical(recurrence_rule.replace("RRULE:", ""))
|
|
||||||
)
|
for recc_line in recc_lines:
|
||||||
|
recc_line_parts = recc_line.split(":", 1)
|
||||||
|
|
||||||
|
if len(recc_line_parts) != 2: # pragma: no cover
|
||||||
|
continue
|
||||||
|
|
||||||
|
recc_key, recc_value = recc_line_parts
|
||||||
|
recc_key_lower = recc_key.lower()
|
||||||
|
|
||||||
|
if recc_key_lower == "rrule":
|
||||||
|
ical_event.add("rrule", icalendar.vRecur.from_ical(recc_value))
|
||||||
|
elif recc_key_lower == "exdate":
|
||||||
|
ical_event.add("exdate", vDDDLists.from_ical(recc_value))
|
||||||
|
elif recc_key_lower == "rdate":
|
||||||
|
ical_event.add("rdate", vDDDLists.from_ical(recc_value))
|
||||||
|
|
||||||
if datish.end and datish.end > datish.start:
|
if datish.end and datish.end > datish.start:
|
||||||
end = datish.end.astimezone(berlin_tz)
|
end = datish.end.astimezone(berlin_tz)
|
||||||
@ -576,8 +591,11 @@ def create_ical_events_for_event(event: Event) -> list: # list[icalendar.Event]
|
|||||||
result = list()
|
result = list()
|
||||||
|
|
||||||
for date_definition in event.date_definitions:
|
for date_definition in event.date_definitions:
|
||||||
ical_event = create_ical_event_for_date_definition(date_definition)
|
try:
|
||||||
result.append(ical_event)
|
ical_event = create_ical_event_for_date_definition(date_definition)
|
||||||
|
result.append(ical_event)
|
||||||
|
except Exception as e: # pragma: no cover
|
||||||
|
app.logger.exception(e)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|||||||
@ -43,7 +43,7 @@ const OrganizerRead = {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<b-list-group class="mt-4">
|
<b-list-group class="mt-4">
|
||||||
<b-list-group-item :href="'/eventdates?organizer_id=' + organizer.organization.id">
|
<b-list-group-item :href="'/eventdates?organizer_id=' + organizer.id">
|
||||||
<i class="fa fa-fw fa-list"></i>
|
<i class="fa fa-fw fa-list"></i>
|
||||||
{{ $t("shared.models.event.listName") }}
|
{{ $t("shared.models.event.listName") }}
|
||||||
</b-list-group-item>
|
</b-list-group-item>
|
||||||
|
|||||||
@ -273,7 +273,10 @@ def test_get_events_fulltext(
|
|||||||
|
|
||||||
def test_create_ical_events_for_event(client, app, db, utils, seeder):
|
def test_create_ical_events_for_event(client, app, db, utils, seeder):
|
||||||
user_id, admin_unit_id = seeder.setup_base()
|
user_id, admin_unit_id = seeder.setup_base()
|
||||||
event_id = seeder.create_event(admin_unit_id)
|
event_id = seeder.create_event(
|
||||||
|
admin_unit_id,
|
||||||
|
recurrence_rule="RRULE:FREQ=DAILY;COUNT=10\nEXDATE:20300102T000000,20300104T000000\nRDATE:20300103T000000,20300105T000000",
|
||||||
|
)
|
||||||
|
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
from project.models import Event, EventStatus, Location
|
from project.models import Event, EventStatus, Location
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user