Bug #51849
AssertionError sur stockage code de suivi
0%
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
Historique
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).
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à.
Mis à jour par Frédéric Péters il y a environ 3 ans
- Fichier 0001-misc-insert-tracking-code-if-not-found-51849.patch 0001-misc-insert-tracking-code-if-not-found-51849.patch ajouté
- Statut changé de En cours à Solution proposée
- Patch proposed changé de Non à Oui
Ah boulet je pensais avoir attaché le patch.
Mis à jour par Lauréline Guérin il y a environ 3 ans
- Statut changé de Solution proposée à Solution validée
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)
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
misc: insert tracking code if not found (#51849)