From 86e36bc64ac8fb2bc4a8e6f3b9941a0f0ff63697 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sat, 28 Feb 2026 18:59:18 -0600 Subject: [PATCH] fix: make AllLogView inherit from LogMasterView and improve asset rendering for those grids --- src/wuttafarm/db/model/log.py | 8 ++ src/wuttafarm/web/views/logs.py | 136 +++++++++++++++----------------- 2 files changed, 70 insertions(+), 74 deletions(-) diff --git a/src/wuttafarm/db/model/log.py b/src/wuttafarm/db/model/log.py index fd59478..8352a8e 100644 --- a/src/wuttafarm/db/model/log.py +++ b/src/wuttafarm/db/model/log.py @@ -26,6 +26,7 @@ Model definition for Logs import sqlalchemy as sa from sqlalchemy import orm from sqlalchemy.ext.declarative import declared_attr +from sqlalchemy.ext.associationproxy import association_proxy from wuttjamaican.db import model @@ -155,6 +156,12 @@ class Log(model.Base): _assets = orm.relationship("LogAsset", back_populates="log") + assets = association_proxy( + "_assets", + "asset", + creator=lambda asset: LogAsset(asset=asset), + ) + def __str__(self): return self.message or "" @@ -184,6 +191,7 @@ def add_log_proxies(subclass): Log.make_proxy(subclass, "log", "timestamp") Log.make_proxy(subclass, "log", "status") Log.make_proxy(subclass, "log", "notes") + Log.make_proxy(subclass, "log", "assets") class LogAsset(model.Base): diff --git a/src/wuttafarm/web/views/logs.py b/src/wuttafarm/web/views/logs.py index 7f5d9cf..fe46298 100644 --- a/src/wuttafarm/web/views/logs.py +++ b/src/wuttafarm/web/views/logs.py @@ -26,6 +26,7 @@ Base views for Logs from collections import OrderedDict import colander +from webhelpers2.html import tags from wuttaweb.forms.schema import WuttaDictEnum from wuttaweb.db import Session @@ -89,78 +90,6 @@ class LogTypeView(WuttaFarmMasterView): return buttons -class AllLogView(WuttaFarmMasterView): - """ - Master view for All Logs - """ - - model_class = Log - route_prefix = "log" - url_prefix = "/logs" - - farmos_refurl_path = "/logs" - - viewable = False - creatable = False - editable = False - deletable = False - model_is_versioned = False - - labels = { - "message": "Log Name", - } - - grid_columns = [ - "status", - "drupal_id", - "timestamp", - "message", - "log_type", - "assets", - "location", - "quantity", - "groups", - "is_group_assignment", - ] - - sort_defaults = ("timestamp", "desc") - - filter_defaults = { - "message": {"active": True, "verb": "contains"}, - } - - def configure_grid(self, grid): - g = grid - super().configure_grid(g) - session = self.Session() - - # drupal_id - g.set_label("drupal_id", "ID", column_only=True) - - # timestamp - g.set_renderer("timestamp", "date") - g.set_link("timestamp") - - # message - g.set_link("message") - - # log_type - g.set_enum("log_type", get_log_type_enum(self.config, session=session)) - - # assets - g.set_renderer("assets", self.render_assets_for_grid) - - # view action links to final log record - def log_url(log, i): - return self.request.route_url(f"logs_{log.log_type}.view", uuid=log.uuid) - - g.add_action("view", icon="eye", url=log_url) - - def render_assets_for_grid(self, log, field, value): - assets = [str(a.asset) for a in log._assets] - return ", ".join(assets) - - class LogMasterView(WuttaFarmMasterView): """ Base class for Asset master views @@ -212,7 +141,10 @@ class LogMasterView(WuttaFarmMasterView): model = self.app.model model_class = self.get_model_class() session = session or self.Session() - return session.query(model_class).join(model.Log) + query = session.query(model_class) + if model_class is not model.Log: + query = query.join(model.Log) + return query def configure_grid(self, grid): g = grid @@ -250,7 +182,17 @@ class LogMasterView(WuttaFarmMasterView): g.set_renderer("assets", self.render_assets_for_grid) def render_assets_for_grid(self, log, field, value): - return ", ".join([a.asset.asset_name for a in log.log._assets]) + + if self.farmos_style_grid_links: + links = [] + for asset in log.assets: + url = self.request.route_url( + f"{asset.asset_type}_assets.view", uuid=asset.uuid + ) + links.append(tags.link_to(str(asset), url)) + return ", ".join(links) + + return ", ".join([str(a) for a in log.assets]) def grid_row_class(self, log, data, i): if log.status == "pending": @@ -361,6 +303,52 @@ class LogMasterView(WuttaFarmMasterView): ] +class AllLogView(LogMasterView): + """ + Master view for All Logs + """ + + model_class = Log + route_prefix = "log" + url_prefix = "/logs" + + farmos_refurl_path = "/logs" + + viewable = False + creatable = False + editable = False + deletable = False + model_is_versioned = False + + grid_columns = [ + "status", + "drupal_id", + "timestamp", + "message", + "log_type", + "assets", + "location", + "quantity", + "groups", + "is_group_assignment", + "owner", + ] + + def configure_grid(self, grid): + g = grid + super().configure_grid(g) + session = self.Session() + + # log_type + g.set_enum("log_type", get_log_type_enum(self.config, session=session)) + + # view action links to final log record + def log_url(log, i): + return self.request.route_url(f"logs_{log.log_type}.view", uuid=log.uuid) + + g.add_action("view", icon="eye", url=log_url) + + def defaults(config, **kwargs): base = globals()