Hooray! Updates to updates!

This commit is contained in:
Yaro Kasear 2025-10-02 14:38:02 -05:00
parent 85b0e576c7
commit bcf14cf251
3 changed files with 106 additions and 33 deletions

View file

@ -9,6 +9,28 @@ from crudkit.core import normalize_payload
bp_entry = Blueprint("entry", __name__)
def _apply_worklog_updates(worklog, updates, delete_ids):
note_cls = type(worklog).updates.property.mapper.class_
note_svc = crudkit.crud.get_service(note_cls)
sess = note_svc.session
existing = {u.id: u for u in worklog.updates if not getattr(u, "is_deleted", False)}
for item in updates:
uid = item.get("id")
content = (item.get("content") or "").strip()
if not content and not uid:
continue
if uid:
# per-note version log preserved, but commit deferred.
note_svc.update(uid, {"content": content}, actor="bulk_child_update", commit=False)
else:
note_svc.create({"work_log_id": worklog.id, "content": content}, actor="bulk_child_create", commit=False)
for uid in delete_ids:
if uid in existing:
note_svc.delete(uid, actor="bulk_child_delete", commit=False)
def init_entry_routes(app):
@bp_entry.get("/entry/<model>/<int:id>")
@ -168,6 +190,9 @@ def init_entry_routes(app):
cls = crudkit.crud.get_model(model)
payload = normalize_payload(request.get_json(), cls)
updates = payload.pop("updates", None) or []
delete_ids = payload.pop("delete_update_ids", None) or []
params = {}
if model == "inventory":
pass
@ -197,13 +222,19 @@ def init_entry_routes(app):
else:
raise TypeError("Invalid model.")
print(payload)
service = crudkit.crud.get_service(cls)
service.update(id, data=payload, actor="update_entry")
sess = service.session
obj = service.update(id, data=payload, actor="update_entry", commit=False)
if model == "worklog" and (updates or delete_ids):
_apply_worklog_updates(obj, updates, delete_ids)
sess.commit()
return {"status": "success", "payload": payload}
except Exception as e:
print(e)
return {"status": "failure", "error": str(e)}
app.register_blueprint(bp_entry)