diff --git a/CHANGES.rst b/CHANGES.rst index 260f0ff..6faf27d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -17,6 +17,11 @@ Bug fixes: - Don't break on parameter values which contain equal signs, e.g. base64 encoded binary data [geier] +- Fix handling of VTIMEZONEs with subcomponents with the same DTSTARTs. + [geier] + +- *add item here* + 3.11.3 (2017-02-15) ------------------- diff --git a/src/icalendar/cal.py b/src/icalendar/cal.py index 9ace041..5b8b915 100644 --- a/src/icalendar/cal.py +++ b/src/icalendar/cal.py @@ -517,19 +517,11 @@ class Timezone(Component): singletons = ('TZID', 'LAST-MODIFIED', 'TZURL',) @staticmethod - def _extract_offsets(component, zone): + def _extract_offsets(component, tzname): """extract offsets and transition times from a VTIMEZONE component :param component: a STANDARD or DAYLIGHT component - :param zone: the name of the zone, used for constructing a TZNAME if - this component has none + :param tzname: the name of the zone """ - try: - tzname = str(component['TZNAME']) - except KeyError: - tzname = '{0}_{1}'.format( - zone, - component['DTSTART'].to_ical().decode('utf-8') - ) offsetfrom = component['TZOFFSETFROM'].td offsetto = component['TZOFFSETTO'].td dtstart = component['DTSTART'].dt @@ -586,12 +578,14 @@ class Timezone(Component): try: tzname = str(component['TZNAME']) except KeyError: - tzname = '{0}_{1}'.format( + tzname = '{0}_{1}_{2}_{3}'.format( zone, - component['DTSTART'].to_ical().decode('utf-8') + component['DTSTART'].to_ical().decode('utf-8'), + component['TZOFFSETFROM'].to_ical(), # for whatever reason this is str/unicode + component['TZOFFSETTO'].to_ical(), # for whatever reason this is str/unicode ) dst[tzname], component_transitions = self._extract_offsets( - component, zone + component, tzname ) transitions.extend(component_transitions) @@ -622,6 +616,7 @@ class Timezone(Component): if not dst[transitions[index][3]]: # [3] is the name dst_offset = osto - transitions[index][2] # [2] is osto # noqa break + assert dst_offset is not False transition_info.append((osto, dst_offset, name)) cls = type(zone, (DstTzInfo,), { diff --git a/src/icalendar/tests/test_timezoned.py b/src/icalendar/tests/test_timezoned.py index 858e4d5..e93abfa 100644 --- a/src/icalendar/tests/test_timezoned.py +++ b/src/icalendar/tests/test_timezoned.py @@ -266,39 +266,39 @@ class TestTimezoneCreation(unittest.TestCase): [( datetime.timedelta(0, 43200), datetime.timedelta(0), - 'custom_Pacific/Fiji_19151026T000000' + 'custom_Pacific/Fiji_19151026T000000_+115544_+1200' )] + 3 * [( datetime.timedelta(0, 46800), datetime.timedelta(0, 3600), - 'custom_Pacific/Fiji_19981101T020000' + 'custom_Pacific/Fiji_19981101T020000_+1200_+1300' ), ( datetime.timedelta(0, 43200), datetime.timedelta(0), - 'custom_Pacific/Fiji_19990228T030000') + 'custom_Pacific/Fiji_19990228T030000_+1300_+1200') ] + 3 * [( datetime.timedelta(0, 46800), datetime.timedelta(0, 3600), - 'custom_Pacific/Fiji_20101024T020000' + 'custom_Pacific/Fiji_20101024T020000_+1200_+1300' ), ( datetime.timedelta(0, 43200), datetime.timedelta(0), - 'custom_Pacific/Fiji_19990228T030000' + 'custom_Pacific/Fiji_19990228T030000_+1300_+1200' )] + 25 * [( datetime.timedelta(0, 46800), datetime.timedelta(0, 3600), - 'custom_Pacific/Fiji_20101024T020000' + 'custom_Pacific/Fiji_20101024T020000_+1200_+1300' ), ( datetime.timedelta(0, 43200), datetime.timedelta(0), - 'custom_Pacific/Fiji_20140119T020000' + 'custom_Pacific/Fiji_20140119T020000_+1300_+1200' )] + [( datetime.timedelta(0, 46800), datetime.timedelta(0, 3600), - 'custom_Pacific/Fiji_20101024T020000' + 'custom_Pacific/Fiji_20101024T020000_+1200_+1300' )] ) @@ -306,7 +306,7 @@ class TestTimezoneCreation(unittest.TestCase): ( datetime.timedelta(0, 46800), datetime.timedelta(0, 3600), - 'custom_Pacific/Fiji_19981101T020000' + 'custom_Pacific/Fiji_19981101T020000_+1200_+1300' ), tz._tzinfos.keys() ) @@ -314,7 +314,7 @@ class TestTimezoneCreation(unittest.TestCase): ( datetime.timedelta(0, 43200), datetime.timedelta(0), - 'custom_Pacific/Fiji_19990228T030000' + 'custom_Pacific/Fiji_19990228T030000_+1300_+1200' ), tz._tzinfos.keys() )