Projet

Général

Profil

Bug #60011

TypeError: can't compare offset-naive and offset-aware datetimes dans refresh_timeperiod_exceptions_from_ics

Ajouté par Sentry Io il y a plus de 2 ans. Mis à jour il y a plus de 2 ans.

Statut:
Nouveau
Priorité:
Normal
Assigné à:
-
Catégorie:
-
Version cible:
-
Début:
22 décembre 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

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

#1

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
#5

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
#6

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...

#9

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 ?

#10

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

#11

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à.

#12

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.

Formats disponibles : Atom PDF