From e5b27ea8e53145f4d9153ad4b5c8ba8c93feaf79 Mon Sep 17 00:00:00 2001
From: ValueOn AG
Date: Thu, 11 Jun 2026 15:41:12 +0200
Subject: [PATCH] fix: trustee options endpoints handle dict records from
interface layer
Co-authored-by: Cursor
---
.../features/trustee/routeFeatureTrustee.py | 39 +++++++++++++------
1 file changed, 28 insertions(+), 11 deletions(-)
diff --git a/modules/features/trustee/routeFeatureTrustee.py b/modules/features/trustee/routeFeatureTrustee.py
index 8b5ba94a..dbc96013 100644
--- a/modules/features/trustee/routeFeatureTrustee.py
+++ b/modules/features/trustee/routeFeatureTrustee.py
@@ -81,6 +81,13 @@ def _parsePagination(pagination: Optional[str]) -> Optional[PaginationParams]:
return None
+def _recordField(record, field: str, default=None):
+ """Read a field from a DB record dict or model instance."""
+ if isinstance(record, dict):
+ return record.get(field, default)
+ return getattr(record, field, default)
+
+
def _validateInstanceAccess(instanceId: str, context: RequestContext) -> str:
"""
Validate that the user has access to the feature instance.
@@ -365,7 +372,7 @@ def get_contract_options(
result = interface.getAllContracts(None)
items = result.items if hasattr(result, 'items') else result
- return [{"value": c.id, "label": c.label or c.name or c.id} for c in items]
+ return [{"value": _recordField(c, "id"), "label": _recordField(c, "label") or _recordField(c, "name") or _recordField(c, "id")} for c in items]
@router.get("/{instanceId}/documents/options", response_model=List[Dict[str, Any]])
@@ -381,7 +388,14 @@ def get_document_options(
result = interface.getAllDocuments(None)
items = result.items if hasattr(result, 'items') else result
# Include 'id' for FK resolution in tables
- return [{"id": d.id, "value": d.id, "label": d.documentName or d.id} for d in items]
+ return [
+ {
+ "id": _recordField(d, "id"),
+ "value": _recordField(d, "id"),
+ "label": _recordField(d, "documentName") or _recordField(d, "id"),
+ }
+ for d in items
+ ]
@router.get("/{instanceId}/positions/options", response_model=List[Dict[str, Any]])
@@ -397,18 +411,21 @@ def get_position_options(
result = interface.getAllPositions(None)
items = result.items if hasattr(result, 'items') else result
- def _makePositionLabel(p: TrusteePosition) -> str:
+ def _makePositionLabel(p) -> str:
parts = []
- if p.valuta:
- parts.append(datetime.fromtimestamp(p.valuta, tz=timezone.utc).strftime("%Y-%m-%d"))
- if p.company:
- parts.append(p.company[:30])
- if p.desc:
- parts.append(p.desc[:30])
- return " - ".join(parts) if parts else p.id
+ valuta = _recordField(p, "valuta")
+ if valuta:
+ parts.append(datetime.fromtimestamp(valuta, tz=timezone.utc).strftime("%Y-%m-%d"))
+ company = _recordField(p, "company")
+ if company:
+ parts.append(str(company)[:30])
+ desc = _recordField(p, "desc")
+ if desc:
+ parts.append(str(desc)[:30])
+ return " - ".join(parts) if parts else _recordField(p, "id")
# Include 'id' for FK resolution in tables
- return [{"id": p.id, "value": p.id, "label": _makePositionLabel(p)} for p in items]
+ return [{"id": _recordField(p, "id"), "value": _recordField(p, "id"), "label": _makePositionLabel(p)} for p in items]
# ============================================================================