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 import sqlalchemy as sa
from sqlalchemy import orm from sqlalchemy import orm
from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.ext.associationproxy import association_proxy
from wuttjamaican.db import model from wuttjamaican.db import model
@ -155,6 +156,12 @@ class Log(model.Base):
_assets = orm.relationship("LogAsset", back_populates="log") _assets = orm.relationship("LogAsset", back_populates="log")
assets = association_proxy(
"_assets",
"asset",
creator=lambda asset: LogAsset(asset=asset),
)
def __str__(self): def __str__(self):
return self.message or "" return self.message or ""
@ -184,6 +191,7 @@ def add_log_proxies(subclass):
Log.make_proxy(subclass, "log", "timestamp") Log.make_proxy(subclass, "log", "timestamp")
Log.make_proxy(subclass, "log", "status") Log.make_proxy(subclass, "log", "status")
Log.make_proxy(subclass, "log", "notes") Log.make_proxy(subclass, "log", "notes")
Log.make_proxy(subclass, "log", "assets")
class LogAsset(model.Base): class LogAsset(model.Base):

View file

@ -26,6 +26,7 @@ Base views for Logs
from collections import OrderedDict from collections import OrderedDict
import colander import colander
from webhelpers2.html import tags
from wuttaweb.forms.schema import WuttaDictEnum from wuttaweb.forms.schema import WuttaDictEnum
from wuttaweb.db import Session from wuttaweb.db import Session
@ -89,78 +90,6 @@ class LogTypeView(WuttaFarmMasterView):
return buttons 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): class LogMasterView(WuttaFarmMasterView):
""" """
Base class for Asset master views Base class for Asset master views
@ -212,7 +141,10 @@ class LogMasterView(WuttaFarmMasterView):
model = self.app.model model = self.app.model
model_class = self.get_model_class() model_class = self.get_model_class()
session = session or self.Session() 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): def configure_grid(self, grid):
g = grid g = grid
@ -250,7 +182,17 @@ class LogMasterView(WuttaFarmMasterView):
g.set_renderer("assets", self.render_assets_for_grid) g.set_renderer("assets", self.render_assets_for_grid)
def render_assets_for_grid(self, log, field, value): 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): def grid_row_class(self, log, data, i):
if log.status == "pending": 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): def defaults(config, **kwargs):
base = globals() base = globals()