Projet

Général

Profil

Bug #49452

ValueError: year 0 is out of range

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

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
14 décembre 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

https://sentry.entrouvert.org/entrouvert/publik/issues/6216/

ValueError: year 0 is out of range
(11 additional frame(s) were not displayed)
...
  File "wcs/backoffice/management.py", line 2446, in stats
    values = self.formdef.data_class().select(criterias)
  File "wcs/sql.py", line 432, in f
    return func(*args, **kwargs)
  File "wcs/sql.py", line 1325, in select
    where_clauses, parameters, func_clause = parse_clause(clause)
  File "wcs/sql.py", line 288, in parse_clause
    parameters.update(sql_element.as_sql_param())
  File "wcs/sql.py", line 100, in as_sql_param
    value = datetime.datetime.fromtimestamp(time.mktime(self.value))

Fichiers

0001-wip.patch (1,81 ko) 0001-wip.patch Lauréline Guérin, 17 décembre 2020 15:28

Révisions associées

Révision a3e596ac (diff)
Ajouté par Frédéric Péters il y a 3 mois

sql: pass date/datetime objects in criterias (#49452)

Historique

#1

Mis à jour par Lauréline Guérin il y a plus de 3 ans

  • Projet changé de Suivi des traces à w.c.s.
#2

Mis à jour par Lauréline Guérin il y a plus de 3 ans

  • Assigné à mis à Lauréline Guérin
#3

Mis à jour par Lauréline Guérin il y a plus de 3 ans

Bon, le soucis c'est que ici:

    def as_sql_param(self):
        if isinstance(self.value, time.struct_time):
            ts = time.mktime(self.value)
            value = datetime.datetime.fromtimestamp(time.mktime(self.value))
        else:
            value = self.value
        return {'c%s' % id(self.value): value}

time.mktime(self.value) donne un timestamp qui est plus petit que datetime.datetime.min (à cause de la timezone) lorsque self.value vaut time.struct_time(tm_year=1, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1) (le user a tapé 01/01/0001 dans le widget de sélection de date)

Si on passe directement le datetime renvoyé par misc.get_as_datetime (datetime(1, 1, 1)), pas d'échec, la requête SQL se comporte comme il faut.

Question: pourquoi on passe un timetuple dans les critères de recherche, et pas le datetime directement ?

Sinon, pour le cas où on passe un timetuple, avec cette modif:

+            #value = datetime.datetime.fromtimestamp(time.mktime(self.value))
+            value = datetime.datetime(*self.value[:6])

Ca passe

#4

Mis à jour par Lauréline Guérin il y a plus de 3 ans

  • Assigné à Lauréline Guérin supprimé
#5

Mis à jour par Robot Gitea il y a 4 mois

  • Assigné à mis à Frédéric Péters

Frédéric Péters (fpeters) a ouvert une pull request sur Gitea concernant cette demande :

#6

Mis à jour par Robot Gitea il y a 4 mois

  • Statut changé de En cours à Solution proposée
#7

Mis à jour par Robot Gitea il y a 4 mois

  • Statut changé de Solution proposée à Solution validée

Lauréline Guérin (lguerin) a approuvé une pull request sur Gitea concernant cette demande :

#8

Mis à jour par Robot Gitea il y a 3 mois

  • Statut changé de Solution validée à Résolu (à déployer)

Frédéric Péters (fpeters) a mergé une pull request sur Gitea concernant cette demande :

#9

Mis à jour par Transition automatique il y a 3 mois

  • Statut changé de Résolu (à déployer) à Solution déployée
#10

Mis à jour par Transition automatique il y a environ un mois

Automatic expiration

Formats disponibles : Atom PDF