ValueError: attribute TZNAME can only be set once, second occurrence is TZNAME='CET'
JulienPalard opened this issue · comments
Julien Palard commented
reproducer:
from ics import Calendar
import requests
Calendar(requests.get('https://fr.ftp.opendatasoft.com/openscol/fr-en-calendrier-scolaire/Zone-C.ics').text)
It gives:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/icalendar.py", line 90, in __init__
self.populate(container)
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/component.py", line 55, in populate
ComponentMeta.BY_TYPE[type(self)].populate_instance(self, container, context)
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/component.py", line 147, in populate_instance
self._populate_attrs(instance, container, context)
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/types/calendar.py", line 34, in _populate_attrs
tz = Timezone.from_container(child)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/component.py", line 47, in from_container
return ComponentMeta.BY_TYPE[cls].load_instance(container, context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/types/timezone.py", line 28, in load_instance
instance = super().load_instance(container, context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/component.py", line 197, in load_instance
self.populate_instance(comp, container, context)
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/component.py", line 147, in populate_instance
self._populate_attrs(instance, container, context)
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/component.py", line 155, in _populate_attrs
if conv.populate(instance, line, context):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/types/timezone.py", line 52, in populate
component, TimezoneDaylightObservance.from_container(item, context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/component.py", line 47, in from_container
return ComponentMeta.BY_TYPE[cls].load_instance(container, context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/component.py", line 197, in load_instance
self.populate_instance(comp, container, context)
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/component.py", line 147, in populate_instance
self._populate_attrs(instance, container, context)
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/component.py", line 155, in _populate_attrs
if conv.populate(instance, line, context):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mdk/Org/.venv/lib/python3.11/site-packages/ics/converter/value.py", line 75, in populate
raise ValueError(
ValueError: attribute TZNAME can only be set once, second occurrence is TZNAME='CET'
with:
$ pip list
Package Version
------------------- ----------
attrs 22.2.0
certifi 2022.12.7
charset-normalizer 3.0.1
ics 0.8.0.dev0
ics-vtimezones 2020.1
idna 3.4
importlib-resources 1.5.0
jours-feries-france 0.7.0
Levenshtein 0.20.9
pip 23.0
python-dateutil 2.8.2
rapidfuzz 2.13.7
requests 2.28.2
setuptools 66.1.1
six 1.16.0
urllib3 1.26.14
0xC4 commented
Hi,
By looking at the file you try to parse, you can see this (L11-L18)
BEGIN:DAYLIGHT
DTSTART:19700329T020000
TZNAME:CEST
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
TZNAME:CET
END:DAYLIGHT
And there is indeed twice a line declaring TZNAME
(CEST
on L11 and CET
on L17).
This is not allowed by the RFC5545: The following is OPTIONAL, but MUST NOT occur more than once.
This means your ics file is invalid and so ics-py refuses to parse it, there is not much more we can do on our side. If you remove L17 'by hand', you should be able to parse it :)
Julien Palard commented
You're right, thanks for the explanations, happy holidays!