Projet

Général

Profil

Bug #39858

decimal vs bytes pickle python 3

Ajouté par Frédéric Péters il y a environ 4 ans. Mis à jour il y a environ 4 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
14 février 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

Description

Exception:
  type = '<class 'TypeError'>', value = 'conversion from bytes to Decimal is not supported'

Stack trace (most recent call first):
  File "/usr/lib/python3/dist-packages/wcs/sql.py", line 72, in pickle_loads
    70     if hasattr(value, 'tobytes'):
    71         value = value.tobytes()
>   72     obj = UnpicklerClass(BytesIO(force_bytes(value)), **PICKLE_KWARGS).load()
    73     if six.PY3:
    74         obj = deep_bytes2str(obj)

  locals:
     value =
b'\x80\x02]q\x01(cmodules.payments\nInvoiceEvolutionPart\nq\x02oq\x03}q\x04(U\x06actionq\x05U\x06createU\x06amountq\x06cdecimal\nDecimal\nq\x07U
\x0575.40\x85Rq\x08U\x0btransactionq\tNU\x02idq\nU\x1920200213-r1-f121-74571-83U\x07subjectq\x0bU\x07Cantineuba.'

Historique

#2

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

  • Statut changé de Nouveau à Solution déployée

Évitement du module décimal écrit en C, /usr/lib/python3.5/decimal.py,

try:
+   raise ImportError
    from _decimal import *
    from _decimal import __doc__
    from _decimal import __version__
    from _decimal import __libmpdec_version__
except ImportError:
    from _pydecimal import *
    from _pydecimal import __doc__
    from _pydecimal import __version__
    from _pydecimal import __libmpdec_version__

Hack au module Python,

+        if isinstance(value, bytes):
+            value = value.decode('ascii')

Chargement/enregistrement des données concernées,

from wcs.formdef import FormDef

for formdef in FormDef.select():
    for formdata in formdef.data_class().select():
        print(formdata)
        for evolution in formdata.evolution:
            for part in evolution.parts or []:
                if part.__class__.__name__ == 'InvoiceEvolutionPart':
                    print(formdata)
                    formdata.store()
                    break
            else:
                continue
            break

Puis retrait des hacks.

Formats disponibles : Atom PDF