Bug #60011
TypeError: can't compare offset-naive and offset-aware datetimes dans refresh_timeperiod_exceptions_from_ics
0%
Description
https://sentry.entrouvert.org/entrouvert/publik/issues/54165/
TypeError: can't compare offset-naive and offset-aware datetimes (1 additional frame(s) were not displayed) ... File "chrono/utils/spooler.py", line 41, in refresh_exception_source source.refresh_timeperiod_exceptions_from_ics() File "chrono/agendas/models.py", line 2371, in refresh_timeperiod_exceptions_from_ics elif vevent.rruleset.count(): File "dateutil/rrule.py", line 186, in count for x in self: File "dateutil/rrule.py", line 1394, in _iter while exlist and exlist[0] < ritem: File "dateutil/rrule.py", line 1331, in __lt__ return self.dt < other.dt
Historique
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Projet changé de Suivi des traces à Chrono
- Sujet changé de TypeError: can't compare offset-naive and offset-aware datetimes à TypeError: can't compare offset-naive and offset-aware datetimes dans refresh_timeperiod_exceptions_from_ics
Mis à jour par Thomas Noël il y a plus de 2 ans
Crash reproduit (l'ics problématique est visible dans le code) :
import vobject data = """BEGIN:VCALENDAR METHOD:PUBLISH PRODID:Microsoft Exchange Server 2010 VERSION:2.0 X-WR-CALNAME:Rendez-vous XXXXX BEGIN:VTIMEZONE TZID:Romance Standard Time BEGIN:STANDARD DTSTART:16010101T030000 TZOFFSETFROM:+0200 TZOFFSETTO:+0100 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 END:STANDARD BEGIN:DAYLIGHT DTSTART:16010101T020000 TZOFFSETFROM:+0100 TZOFFSETTO:+0200 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT DESCRIPTION:\n RRULE:FREQ=WEEKLY;UNTIL=20221217T230000Z;INTERVAL=1;BYDAY=SU,SA;WKST=MO EXDATE;TZID=Romance Standard Time:20211226T000000 UID:040000008200E00074C5B7101A82E00800000000705A48811FF6D601000000000000000 010000000BE143F6ADEF9FD4B91C9B69B9739918C SUMMARY:Non ouvert (w-e) DTSTART;VALUE=DATE:20210206 DTEND;VALUE=DATE:20210207 CLASS:PUBLIC PRIORITY:5 DTSTAMP:20211222T154422Z TRANSP:OPAQUE STATUS:CONFIRMED SEQUENCE:0 LOCATION: X-MICROSOFT-CDO-APPT-SEQUENCE:0 X-MICROSOFT-CDO-BUSYSTATUS:BUSY X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY X-MICROSOFT-CDO-ALLDAYEVENT:TRUE X-MICROSOFT-CDO-IMPORTANCE:1 X-MICROSOFT-CDO-INSTTYPE:1 X-MICROSOFT-DONOTFORWARDMEETING:FALSE X-MICROSOFT-DISALLOW-COUNTER:FALSE END:VEVENT END:VCALENDAR """ parsed = vobject.readOne(data) for vevent in parsed.contents.get('vevent', []): if vevent.rruleset: print(vevent) vevent.rruleset.count()
Résultat de ce script de test :
$ python3 test_rruleset.py <VEVENT| [<UID{}040000008200E00074C5B7101A82E00800000000705A48811FF6D601000000000000000010000000BE143F6ADEF9FD4B91C9B69B9739918C>, <DTSTART{'VALUE': ['DATE']}2021-02-06>, <DTEND{'VALUE': ['DATE']}2021-02-07>, <CLASS{}PUBLIC>, <DESCRIPTION{}>, <DTSTAMP{}2021-12-22 15:44:22+00:00>, <EXDATE{'TZID': ['Romance Standard Time']}[datetime.datetime(2021, 12, 26, 0, 0, tzinfo=<tzicalvtz 'Romance Standard Time'>)]>, <LOCATION{}>, <PRIORITY{}5>, <RRULE{}FREQ=WEEKLY;UNTIL=20221217T230000Z;INTERVAL=1;BYDAY=SU,SA;WKST=MO>, <SEQUENCE{}0>, <STATUS{}CONFIRMED>, <SUMMARY{}Non ouvert (w-e)>, <TRANSP{}OPAQUE>, <X-MICROSOFT-CDO-ALLDAYEVENT{}TRUE>, <X-MICROSOFT-CDO-APPT-SEQUENCE{}0>, <X-MICROSOFT-CDO-BUSYSTATUS{}BUSY>, <X-MICROSOFT-CDO-IMPORTANCE{}1>, <X-MICROSOFT-CDO-INSTTYPE{}1>, <X-MICROSOFT-CDO-INTENDEDSTATUS{}BUSY>, <X-MICROSOFT-DISALLOW-COUNTER{}FALSE>, <X-MICROSOFT-DONOTFORWARDMEETING{}FALSE>]> Traceback (most recent call last): File "/home/thomas/test_rruleset.py", line 54, in <module> vevent.rruleset.count() File "/home/thomas/dev/publik/venv3/lib/python3.9/site-packages/dateutil/rrule.py", line 185, in count for x in self: File "/home/thomas/dev/publik/venv3/lib/python3.9/site-packages/dateutil/rrule.py", line 1399, in _iter while exlist and exlist[0] < ritem: File "/home/thomas/dev/publik/venv3/lib/python3.9/site-packages/dateutil/rrule.py", line 1336, in __lt__ return self.dt < other.dt TypeError: can't compare offset-naive and offset-aware datetimes
Mis à jour par Thomas Noël il y a plus de 2 ans
Ce qui ne va pas ici, c'est que les dates de début et fin (dtstart et dtend) sont de simples dates, sans fuseau horaire :
DTSTART;VALUE=DATE:20210206 DTEND;VALUE=DATE:20210207
mais il y a une date d'excption EXDATE qui elle est fournie sous forme d'une date+heure avec fuseau :
EXDATE;TZID=Romance Standard Time:20211226T000000
Le module de lecture des rruleset ne sait pas gérer ce mix.
Je n'imagine pas de contournement facile...
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
C'est peut-être ce ticket le souci https://github.com/dateutil/dateutil/issues/410, c'est corrigé à partir de la 2.8.0 (on est en 2.7.3, mais bullseye est en 2.8.1). Thomas pourrais-tu tester ton script avec cette version ?
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
Et ce ticket1 aussi qui semble résolu depuis 2019, mais comme aucune release depuis 2018 ça n'aide pas.
[1]: https://github.com/eventable/vobject/issues/139
PS: le fix pour vobject est là : https://github.com/eventable/vobject/pull/146
Mis à jour par Thomas Noël il y a plus de 2 ans
Benjamin Dauvergne a écrit :
C'est peut-être ce ticket le souci https://github.com/dateutil/dateutil/issues/410, c'est corrigé à partir de la 2.8.0 (on est en 2.7.3, mais bullseye est en 2.8.1). Thomas pourrais-tu tester ton script avec cette version ?
Je l'avais lancé sur la 2.8.1, ça crashe.
Mais ça roule bien avec le patch sur vobject https://github.com/eventable/vobject/pull/146
Voili voilà.
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
Va falloir sortir notre propre version de vobject parce que ni le projet upstream ni le paquet Debian ne semblent vraiment maintenus.