From 81fa22bbd8339b1e988cea7936190227db864c7d Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Wed, 4 Mar 2026 14:49:12 -0600 Subject: [PATCH] feat: show link to Log record when viewing Quantity --- src/wuttafarm/db/model/log.py | 1 + src/wuttafarm/db/model/quantities.py | 21 +++++++++++++++++++++ src/wuttafarm/web/forms/schema.py | 25 +++++++++++++++++++++++++ src/wuttafarm/web/views/quantities.py | 10 +++++++++- 4 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/wuttafarm/db/model/log.py b/src/wuttafarm/db/model/log.py index 020b39d..7823353 100644 --- a/src/wuttafarm/db/model/log.py +++ b/src/wuttafarm/db/model/log.py @@ -376,6 +376,7 @@ class LogQuantity(model.Base): quantity = orm.relationship( "Quantity", foreign_keys=quantity_uuid, + back_populates="_log", ) diff --git a/src/wuttafarm/db/model/quantities.py b/src/wuttafarm/db/model/quantities.py index 4f537b9..4bed6a0 100644 --- a/src/wuttafarm/db/model/quantities.py +++ b/src/wuttafarm/db/model/quantities.py @@ -26,6 +26,7 @@ Model definition for Quantities 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 @@ -161,6 +162,25 @@ class Quantity(model.Base): """, ) + _log = orm.relationship( + "LogQuantity", + uselist=False, + cascade="all, delete-orphan", + cascade_backrefs=False, + back_populates="quantity", + ) + + def make_log_quantity(log): + from wuttafarm.db.model import LogQuantity + + return LogQuantity(log=log) + + log = association_proxy( + "_log", + "log", + creator=make_log_quantity, + ) + def render_as_text(self, config=None): measure = str(self.measure or self.measure_id or "") value = self.value_numerator / self.value_denominator @@ -202,6 +222,7 @@ def add_quantity_proxies(subclass): Quantity.make_proxy(subclass, "quantity", "units_uuid") Quantity.make_proxy(subclass, "quantity", "units") Quantity.make_proxy(subclass, "quantity", "label") + Quantity.make_proxy(subclass, "quantity", "log") class StandardQuantity(QuantityMixin, model.Base): diff --git a/src/wuttafarm/web/forms/schema.py b/src/wuttafarm/web/forms/schema.py index a2a72b5..6bf434e 100644 --- a/src/wuttafarm/web/forms/schema.py +++ b/src/wuttafarm/web/forms/schema.py @@ -77,6 +77,31 @@ class LogQuick(WuttaSet): return LogQuickWidget(**kwargs) +class LogRef(ObjectRef): + """ + Custom schema type for a + :class:`~wuttafarm.db.model.log.Log` reference field. + + This is a subclass of + :class:`~wuttaweb:wuttaweb.forms.schema.ObjectRef`. + """ + + @property + def model_class(self): # pylint: disable=empty-docstring + """ """ + model = self.app.model + return model.Log + + def sort_query(self, query): # pylint: disable=empty-docstring + """ """ + return query.order_by(self.model_class.message) + + def get_object_url(self, obj): # pylint: disable=empty-docstring + """ """ + log = obj + return self.request.route_url(f"logs_{log.log_type}.view", uuid=log.uuid) + + class FarmOSUnitRef(colander.SchemaType): def serialize(self, node, appstruct): diff --git a/src/wuttafarm/web/views/quantities.py b/src/wuttafarm/web/views/quantities.py index 6f8bdec..d4112cf 100644 --- a/src/wuttafarm/web/views/quantities.py +++ b/src/wuttafarm/web/views/quantities.py @@ -29,7 +29,7 @@ from wuttaweb.db import Session from wuttafarm.web.views import WuttaFarmMasterView from wuttafarm.db.model import QuantityType, Quantity, StandardQuantity -from wuttafarm.web.forms.schema import UnitRef +from wuttafarm.web.forms.schema import UnitRef, LogRef def get_quantity_type_enum(config): @@ -119,6 +119,7 @@ class QuantityMasterView(WuttaFarmMasterView): "value", "units", "label", + "log", "drupal_id", "farmos_uuid", ] @@ -231,6 +232,13 @@ class QuantityMasterView(WuttaFarmMasterView): # TODO: ugh f.set_default("units", quantity.quantity.units) + # log + if self.creating or self.editing: + f.remove("log") + else: + f.set_node("log", LogRef(self.request)) + f.set_default("log", quantity.log) + def get_xref_buttons(self, quantity): buttons = super().get_xref_buttons(quantity)