update() crashes with 'Object of type datetime is not JSON serializable' after load_from_abraflexi()

Abierto
#4 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
72/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
python
Área
api, backend

Línea de trabajo

Reproduce the failure through load_from_abraflexi() followed by update(), then inspect read_only.py around lines 694–709 and read_write.py::_get_jsonized_data() around line 320. Check both json.dumps() calls and the existing update path; done means a loaded record can be updated without a serialization error and date/datetime values are sent in an API-compatible form.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Popis

FlexiBeeRW.update() (přes MCP evidence_update v mcp-server-abraflexi) spadne s

Object of type datetime is not JSON serializable

na jakémkoliv update payloadu, jakmile záznam byl předtím načten přes load_from_abraflexi().

Root cause

  • read_only.py (~řádky 694–709) v load_from_abraflexi() konvertuje datumová/datetime pole
    ze stringů na skutečné Python datetime/date objekty.
  • read_write.py::update()_get_jsonized_data() (řádek ~320) volá
    json.dumps(payload, ensure_ascii=False) bez default= handleru pro neserializovatelné typy.
  • Typický flow (přesně to, co dělá evidence_update v mcp-server-abraflexi/server.py):
    client.load_from_abraflexi(identifier)   # naplní self.data, vč. datetime/date objektů
    client.set_data_value(key, value)         # jen nastaví nová pole
    client.update()                            # get_data() vrátí VŠECHNA pole vč. datetime → json.dumps() spadne
    

Reprodukce

  1. load_from_abraflexi() na libovolný záznam s datumovým polem (např. faktura-prijata, které má
    datVyst, datSplat, lastUpdate apod.).
  2. Zavolat update() (bez ohledu na to, jaká pole se mění) → 100% pád na json.dumps.

Obejití, které funguje: batch update (mass_update/batch_update v MCP vrstvě) — ten zjevně
nejde přes load_from_abraflexi() + get_data(), ale posílá jen čistý dict polí zadaných voláním,
takže žádné datetime objekty v payloadu nejsou.

Návrh opravy

V _get_jsonized_data() přidat default=str (nebo vlastní serializer, který datetime/date
formátuje zpět do formátu, co AbraFlexi REST API očekává, např. YYYY-MM-DD /
YYYY-MM-DD+HH:MM) do obou json.dumps() volání:

def _json_default(obj):
    if isinstance(obj, (datetime, date)):
        return obj.isoformat()
    raise TypeError(f"Object of type {type(obj).__name__} is not JSON serializable")

...
return json.dumps(payload, ensure_ascii=False, default=_json_default)

Alternativně (nebo navíc): load_from_abraflexi() by měl při ukládání do self.data držet
zpět serializovatelnou reprezentaci (string) a poskytovat parsované datetime/date jen přes
samostatný accessor, ne přímo v self.data, které se pak recyklovaně posílá zpátky na update.

Dopad

Zasahuje mcp-server-abraflexi nástroj evidence_update (a pravděpodobně i save()/insert_to_abraflexi() cesty, pokud se používá načtený záznam) — v praxi znemožňuje jakoukoliv jednotlivou úpravu záznamu (např. faktury) přes tento tool, dokud se needitne obejít přes batch update.

Prostředí

  • python-abraflexi 1.1.2
  • volání přišlo přes mcp-server-abraflexi (evidence_update tool), server abraflexi-vitexsoftware (company vitex_software, evidence faktura-prijata)
Lenguaje dominante
Python
Estrellas
1
Forks
1
Métricas de merge de PR
Sin PR fusionados en 30 d

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.