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

Aperta
#4 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
72/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
python
Ambito
api, backend

Direzione di ricerca

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.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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)
Lingua principale
Python
Stelle
1
Fork
1
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.