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() diff --git a/inventory/routes/index.py b/inventory/routes/index.py index 8d2a688..5c009bf 100644 --- a/inventory/routes/index.py +++ b/inventory/routes/index.py @@ -22,7 +22,8 @@ def init_index_routes(app): "start_time", "contact.last_name", "contact.first_name", - "work_item.name" + "work_item.name", + "work_item.device_type.description" ], "sort": "start_time" }) @@ -33,11 +34,10 @@ def init_index_routes(app): "link": {"endpoint": "user.get_item", "params": {"id": "{contact.id}"}}}, {"field": "work_item.name", "label": "Work Item", "link": {"endpoint": "inventory.get_item", "params": {"id": "{work_item.id}"}}}, - {"field": "complete", "label": "Status", - "format": "yesno", "classes": {"true":"badge bg-success","false":"badge bg-warning","none":"text-muted"}}, + {"field": "work_item.device_type.description", "label": "Device Type"} ] - logs = render_table(work_logs, columns=columns) + logs = render_table(work_logs, columns=columns, opts={"object_class": "worklog"}) return render_template("index.html", logs=logs, columns=columns) diff --git a/inventory/templates/crudkit/table.html b/inventory/templates/crudkit/table.html index 06379cf..d25fe34 100644 --- a/inventory/templates/crudkit/table.html +++ b/inventory/templates/crudkit/table.html @@ -1,4 +1,4 @@ -
| {{ cell.text if cell.text is not none else '-' }} | +{{ cell.text if cell.text is not none else '-' }} | {% else %}{{ cell.text if cell.text is not none else '-' }} | {% endif %}