Projet

Général

Profil

Bug #51849

AssertionError sur stockage code de suivi

Ajouté par Sentry Io il y a environ 3 ans. Mis à jour il y a environ 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
09 mars 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

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

AssertionError: 
(13 additional frame(s) were not displayed)
...
  File "wcs/forms/root.py", line 1411, in set_tracking_code
    code.formdata = formdata  # this will .store() the code
  File "wcs/tracking_code.py", line 71, in formdata
    self.store()
  File "wcs/sql.py", line 447, in f
    return func(*args, **kwargs)
  File "wcs/qommon/substitution.py", line 26, in f
    return func(*args, **kwargs)
  File "wcs/sql.py", line 2598, in store
    raise AssertionError()

Fichiers

Révisions associées

Révision 3d551101 (diff)
Ajouté par Frédéric Péters il y a environ 3 ans

misc: insert tracking code if not found (#51849)

Historique

#1

Mis à jour par Frédéric Péters il y a environ 3 ans

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

Mis à jour par Frédéric Péters il y a environ 3 ans

A priori, on est dans la situation où un futur code de suivi a été assigné,

  File "/usr/lib/python3/dist-packages/wcs/forms/root.py", line 1411, in set_tracking_code
  1409         if magictoken_data and 'future_tracking_code' in magictoken_data:
  1410             code.id = magictoken_data['future_tracking_code']
> 1411         code.formdata = formdata  # this will .store() the code
  1412

et on se trouve à ce moment à l'enregistrer.

Mais un .store() sur un objet qui a déjà un id, ça va faire un UPDATE,

        conn, cur = get_connection_and_cursor()
        if not self.id:
...
        else:
            column_names = sql_dict.keys()
            sql_dict['id'] = self.id
            sql_statement = '''UPDATE %s SET %s WHERE id = %%(id)s RETURNING id''' % (
                self._table_name,
                ', '.join(['%s = %%(%s)s' % (x, x) for x in column_names]),
            )
            cur.execute(sql_statement, sql_dict)
            if cur.fetchone() is None:
                raise AssertionError()

et donc on fait un UPDATE avec WHERE id d'un id qui n'est pas encore en db, et plouf.

À partir de postgresql 9.6 on peut faire "upsert", https://www.postgresql.org/docs/9.6/sql-insert.html#SQL-ON-CONFLICT (je n'ai pas regardé si ça s'appliquait pile à la situation).

#3

Mis à jour par Frédéric Péters il y a environ 3 ans

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

Mis à jour par Frédéric Péters il y a environ 3 ans

  • Statut changé de Nouveau à En cours

Reste que je ne trouve pas le chemin qui amène à ça, on a la création future_tracking_code en même temps que son enregistrement dans la db :

                tracking_code = get_publisher().tracking_code_class()
                tracking_code.store()
                token = randbytes(8)
                get_request().form['magictoken'] = token
                session.add_magictoken(token, {'future_tracking_code': tracking_code.id})

je ne vois pas comment on pourrait avoir un future_tracking_code sans passer par là.

#5

Mis à jour par Frédéric Péters il y a environ 3 ans

Ah boulet je pensais avoir attaché le patch.

#6

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

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

Mis à jour par Frédéric Péters il y a environ 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 3d551101a6b9429b63e519e62b02f0932ca02da1
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Tue Mar 9 16:30:52 2021 +0100

    misc: insert tracking code if not found (#51849)
#8

Mis à jour par Frédéric Péters il y a environ 3 ans

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

Formats disponibles : Atom PDF