From 6165feaeb77bf943a6b29e3afcb2c98776b49aaa Mon Sep 17 00:00:00 2001 From: Yaro Kasear Date: Thu, 11 Sep 2025 10:06:49 -0500 Subject: [PATCH] Downstream fixes. --- crudkit/core/service.py | 6 +++++- crudkit/core/spec.py | 15 ++++++++++++--- crudkit/ui/fragments.py | 4 ++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/crudkit/core/service.py b/crudkit/core/service.py index f84d276..07f51ca 100644 --- a/crudkit/core/service.py +++ b/crudkit/core/service.py @@ -54,6 +54,9 @@ class CRUDService(Generic[T]): def list(self, params=None) -> list[T]: query, root_alias = self.get_query() + root_fields = [] + rel_field_names = {} + if params: if self.supports_soft_delete: include_deleted = _is_truthy(params.get('include_deleted')) @@ -73,7 +76,8 @@ class CRUDService(Generic[T]): isouter=True ) - root_fields, rel_field_names = spec.parse_fields() + if params: + root_fields, rel_field_names = spec.parse_fields() if root_fields: query = query.options(Load(root_alias).load_only(*root_fields)) diff --git a/crudkit/core/spec.py b/crudkit/core/spec.py index f895e6e..1b6ea31 100644 --- a/crudkit/core/spec.py +++ b/crudkit/core/spec.py @@ -157,17 +157,26 @@ class CRUDSpec: for path in self.eager_paths: current = root_alias loader = None + for idx, name in enumerate(path): rel_attr = getattr(current, name) - loader = (selectinload(rel_attr) if loader is None else loader.selectinload(name)) + + if loader is None: + loader = selectinload(rel_attr) + else: + loader = loader.selectinload(rel_attr) + + current = rel_attr.property.mapper.class_ + if fields_map and idx == len(path) - 1 and path in fields_map: - target_cls = rel_attr.property.mapper.class_ + target_cls = current cols = [getattr(target_cls, n) for n in fields_map[path] if hasattr(target_cls, n)] if cols: loader = loader.load_only(*cols) - current = rel_attr.property.mapper.class_ + if loader is not None: loads.append(loader) + return loads def get_join_paths(self): diff --git a/crudkit/ui/fragments.py b/crudkit/ui/fragments.py index bfc8b47..6a3b7a4 100644 --- a/crudkit/ui/fragments.py +++ b/crudkit/ui/fragments.py @@ -121,7 +121,7 @@ def render_field(field, value): options=field.get('options', None) ) -def render_table(objects: List[Any], columns: Optional[List[Dict[str, Any]]] = None): +def render_table(objects: List[Any], columns: Optional[List[Dict[str, Any]]] = None, **opts): env = get_env() template = get_crudkit_template(env, 'table.html') @@ -146,7 +146,7 @@ def render_table(objects: List[Any], columns: Optional[List[Dict[str, Any]]] = N cells.append({"text": text, "href": href, "class": cls}) disp_rows.append({"id": rd.get("id"), "cells": cells}) - return template.render(columns=cols, rows=disp_rows) + return template.render(columns=cols, rows=disp_rows, kwargs=opts) def render_form(model_cls, values, session=None): env = get_env()