diff --git a/src/wuttafarm/db/model/asset.py b/src/wuttafarm/db/model/asset.py index 3e4de6e..8c975c9 100644 --- a/src/wuttafarm/db/model/asset.py +++ b/src/wuttafarm/db/model/asset.py @@ -26,6 +26,7 @@ Model definition for Asset Types 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 @@ -186,6 +187,12 @@ class Asset(model.Base): cascade_backrefs=False, ) + parents = association_proxy( + "_parents", + "parent", + creator=lambda parent: AssetParent(parent=parent), + ) + def __str__(self): return self.asset_name or "" diff --git a/src/wuttafarm/web/views/assets.py b/src/wuttafarm/web/views/assets.py index 963fe78..b463953 100644 --- a/src/wuttafarm/web/views/assets.py +++ b/src/wuttafarm/web/views/assets.py @@ -49,79 +49,6 @@ def get_asset_type_enum(config): return asset_types -class AllAssetView(WuttaFarmMasterView): - """ - Master view for Assets - """ - - model_class = Asset - route_prefix = "assets" - url_prefix = "/assets" - - farmos_refurl_path = "/assets" - - viewable = False - creatable = False - editable = False - deletable = False - model_is_versioned = False - - grid_columns = [ - "thumbnail", - "drupal_id", - "asset_name", - "asset_type", - "parents", - "archived", - ] - - sort_defaults = "asset_name" - - filter_defaults = { - "asset_name": {"active": True, "verb": "contains"}, - "archived": {"active": True, "verb": "is_false"}, - } - - def configure_grid(self, grid): - g = grid - super().configure_grid(g) - - # thumbnail - g.set_renderer("thumbnail", self.render_grid_thumbnail) - g.set_label("thumbnail", "", column_only=True) - g.set_centered("thumbnail") - - # drupal_id - g.set_label("drupal_id", "ID", column_only=True) - - # asset_name - g.set_link("asset_name") - - # asset_type - g.set_enum("asset_type", get_asset_type_enum(self.config)) - - # parents - g.set_renderer("parents", self.render_parents_for_grid) - - # view action links to final asset record - def asset_url(asset, i): - return self.request.route_url( - f"{asset.asset_type}_assets.view", uuid=asset.uuid - ) - - g.add_action("view", icon="eye", url=asset_url) - - def render_parents_for_grid(self, asset, field, value): - parents = [str(p.parent) for p in asset._parents] - return ", ".join(parents) - - def grid_row_class(self, asset, data, i): - """ """ - if asset.archived: - return "has-background-warning" - return None - - class AssetTypeMasterView(WuttaFarmMasterView): """ Base class for "Asset Type" master views. @@ -181,7 +108,10 @@ class AssetMasterView(WuttaFarmMasterView): model = self.app.model model_class = self.get_model_class() session = session or self.Session() - return session.query(model_class).join(model.Asset) + query = session.query(model_class) + if model_class is not model.Asset: + query = query.join(model.Asset) + return query def configure_grid(self, grid): g = grid @@ -212,19 +142,17 @@ class AssetMasterView(WuttaFarmMasterView): g.set_filter("archived", model.Asset.archived) def render_parents_for_grid(self, asset, field, value): - parents = asset.asset._parents if self.farmos_style_grid_links: links = [] - for parent in parents: - parent = parent.parent + for parent in asset.parents: url = self.request.route_url( f"{parent.asset_type}_assets.view", uuid=parent.uuid ) links.append(tags.link_to(str(parent), url)) return ", ".join(links) - parents = [str(p.parent) for p in parents] + parents = [str(p.parent) for p in asset.parents] return ", ".join(parents) def grid_row_class(self, asset, data, i): @@ -365,6 +293,48 @@ class AssetMasterView(WuttaFarmMasterView): return self.request.route_url(f"logs_{log.log_type}.view", uuid=log.uuid) +class AllAssetView(AssetMasterView): + """ + Master view for Assets + """ + + model_class = Asset + route_prefix = "assets" + url_prefix = "/assets" + + farmos_refurl_path = "/assets" + + viewable = False + creatable = False + editable = False + deletable = False + model_is_versioned = False + + grid_columns = [ + "thumbnail", + "drupal_id", + "asset_name", + "asset_type", + "parents", + "archived", + ] + + def configure_grid(self, grid): + g = grid + super().configure_grid(g) + + # asset_type + g.set_enum("asset_type", get_asset_type_enum(self.config)) + + # view action links to final asset record + def asset_url(asset, i): + return self.request.route_url( + f"{asset.asset_type}_assets.view", uuid=asset.uuid + ) + + g.add_action("view", icon="eye", url=asset_url) + + def defaults(config, **kwargs): base = globals()