Downstream fixes.

This commit is contained in:
Yaro Kasear 2025-09-11 10:06:49 -05:00
parent f532e07a09
commit 6165feaeb7
3 changed files with 19 additions and 6 deletions

View file

@ -54,6 +54,9 @@ class CRUDService(Generic[T]):
def list(self, params=None) -> list[T]: def list(self, params=None) -> list[T]:
query, root_alias = self.get_query() query, root_alias = self.get_query()
root_fields = []
rel_field_names = {}
if params: if params:
if self.supports_soft_delete: if self.supports_soft_delete:
include_deleted = _is_truthy(params.get('include_deleted')) include_deleted = _is_truthy(params.get('include_deleted'))
@ -73,7 +76,8 @@ class CRUDService(Generic[T]):
isouter=True isouter=True
) )
root_fields, rel_field_names = spec.parse_fields() if params:
root_fields, rel_field_names = spec.parse_fields()
if root_fields: if root_fields:
query = query.options(Load(root_alias).load_only(*root_fields)) query = query.options(Load(root_alias).load_only(*root_fields))

View file

@ -157,17 +157,26 @@ class CRUDSpec:
for path in self.eager_paths: for path in self.eager_paths:
current = root_alias current = root_alias
loader = None loader = None
for idx, name in enumerate(path): for idx, name in enumerate(path):
rel_attr = getattr(current, name) 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: 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)] cols = [getattr(target_cls, n) for n in fields_map[path] if hasattr(target_cls, n)]
if cols: if cols:
loader = loader.load_only(*cols) loader = loader.load_only(*cols)
current = rel_attr.property.mapper.class_
if loader is not None: if loader is not None:
loads.append(loader) loads.append(loader)
return loads return loads
def get_join_paths(self): def get_join_paths(self):

View file

@ -121,7 +121,7 @@ def render_field(field, value):
options=field.get('options', None) 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() env = get_env()
template = get_crudkit_template(env, 'table.html') 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}) cells.append({"text": text, "href": href, "class": cls})
disp_rows.append({"id": rd.get("id"), "cells": cells}) 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): def render_form(model_cls, values, session=None):
env = get_env() env = get_env()