kopia lustrzana https://github.com/collective/icalendar
Correct the handling of rrules within timezone definitions.
Fix for https://github.com/collective/icalendar/issues/303pull/320/head
rodzic
8047148a7b
commit
2a82c88c65
|
@ -14,7 +14,7 @@ New features:
|
|||
|
||||
Bug fixes:
|
||||
|
||||
- *add item here*
|
||||
- fixed rrule handling, re-enabled test_create_america_new_york()
|
||||
|
||||
|
||||
4.0.6 (2020-05-06)
|
||||
|
|
|
@ -17,7 +17,7 @@ from icalendar.prop import vText, vDDDLists
|
|||
from icalendar.timezone_cache import _timezone_cache
|
||||
|
||||
import pytz
|
||||
import dateutil.rrule
|
||||
import dateutil.rrule, dateutil.tz
|
||||
from pytz.tzinfo import DstTzInfo
|
||||
|
||||
from icalendar.compat import unicode_type
|
||||
|
@ -536,15 +536,23 @@ class Timezone(Component):
|
|||
|
||||
# expand recurrences
|
||||
if 'RRULE' in component:
|
||||
# to be paranoid about correct weekdays
|
||||
# evaluate the rrule with the current offset
|
||||
tzi = dateutil.tz.tzoffset ("(offsetfrom)", offsetfrom)
|
||||
rrstart = dtstart.replace (tzinfo=tzi)
|
||||
|
||||
rrulestr = component['RRULE'].to_ical().decode('utf-8')
|
||||
rrule = dateutil.rrule.rrulestr(rrulestr, dtstart=dtstart)
|
||||
rrule = dateutil.rrule.rrulestr(rrulestr, dtstart=rrstart)
|
||||
if not {'UNTIL', 'COUNT'}.intersection(component['RRULE'].keys()):
|
||||
# pytz.timezones don't know any transition dates after 2038
|
||||
# either
|
||||
rrule._until = datetime(2038, 12, 31)
|
||||
elif 'UNTIL' in component['RRULE'] and rrule._until.tzinfo:
|
||||
rrule._until = rrule._until.replace(tzinfo=None)
|
||||
transtimes = rrule
|
||||
rrule._until = datetime(2038, 12, 31, tzinfo=pytz.UTC)
|
||||
|
||||
# constructing the pytz-timezone requires UTC transition times.
|
||||
# here we construct local times without tzinfo, the offset to UTC
|
||||
# gets subtracted in to_tz().
|
||||
transtimes = [dt.replace (tzinfo=None) for dt in rrule]
|
||||
|
||||
# or rdates
|
||||
elif 'RDATE' in component:
|
||||
if not isinstance(component['RDATE'], list):
|
||||
|
|
|
@ -149,14 +149,9 @@ class TestTimezoned(unittest.TestCase):
|
|||
|
||||
class TestTimezoneCreation(unittest.TestCase):
|
||||
|
||||
@unittest.expectedFailure
|
||||
def test_create_america_new_york(self):
|
||||
"""testing America/New_York, the most complex example from the
|
||||
RFC"""
|
||||
# FIXME
|
||||
# This currently fails because of mixed naive and timezone
|
||||
# aware datetimes in dtstart and until which breaks
|
||||
# dateutil recurrence.
|
||||
|
||||
directory = os.path.dirname(__file__)
|
||||
with open(os.path.join(directory, 'america_new_york.ics'), 'rb') as fp:
|
||||
|
|
Ładowanie…
Reference in New Issue