fix: make AllLogView inherit from LogMasterView

and improve asset rendering for those grids
This commit is contained in:
Lance Edgar 2026-02-28 18:59:18 -06:00
parent d1817a3611
commit 86e36bc64a
2 changed files with 70 additions and 74 deletions

View file

@ -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):

View file

@ -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()