fix: add setting to toggle "farmOS-style grid links"

not sure yet if users prefer farmOS style, but will assume so by
default just to be safe.  but i want the "traditional" behavior
myself, so setting is needed either way
This commit is contained in:
Lance Edgar 2026-02-20 20:22:48 -06:00
parent 1af2b695dc
commit e5e3d38365
8 changed files with 85 additions and 22 deletions

View file

@ -7,6 +7,13 @@
<h3 class="block is-size-3">farmOS</h3> <h3 class="block is-size-3">farmOS</h3>
<div class="block" style="padding-left: 2rem; width: 50%;"> <div class="block" style="padding-left: 2rem; width: 50%;">
<b-field label="farmOS URL">
<b-input name="farmos.url.base"
v-model="simpleSettings['farmos.url.base']"
@input="settingsNeedSaved = true">
</b-input>
</b-field>
<b-field label="farmOS Integration Mode"> <b-field label="farmOS Integration Mode">
<b-select name="${app.appname}.farmos_integration_mode" <b-select name="${app.appname}.farmos_integration_mode"
v-model="simpleSettings['${app.appname}.farmos_integration_mode']" v-model="simpleSettings['${app.appname}.farmos_integration_mode']"
@ -17,12 +24,26 @@
</b-select> </b-select>
</b-field> </b-field>
<b-field label="farmOS URL"> <b-checkbox name="${app.appname}.farmos_style_grid_links"
<b-input name="farmos.url.base" v-model="simpleSettings['${app.appname}.farmos_style_grid_links']"
v-model="simpleSettings['farmos.url.base']" native-value="true"
@input="settingsNeedSaved = true"> @input="settingsNeedSaved = true">
</b-input> Use farmOS-style grid links
</b-field> </b-checkbox>
<${b}-tooltip position="${'right' if request.use_oruga else 'is-right'}">
<b-icon pack="fas" icon="info-circle" />
<template #content>
<p class="block">
If set, certain column values in a grid may link
to <span class="has-text-weight-bold">related</span>
records.
</p>
<p class="block">
If not set, column values will only link to view the
<span class="has-text-weight-bold">current</span> record.
</p>
</template>
</${b}-tooltip>
</div> </div>
</%def> </%def>

View file

@ -38,3 +38,7 @@ def save_farmos_oauth2_token(request, token):
# save token to user session # save token to user session
request.session["farmos.oauth2.token"] = token request.session["farmos.oauth2.token"] = token
def use_farmos_style_grid_links(config):
return config.get_bool(f"{config.appname}.farmos_style_grid_links", default=True)

View file

@ -23,6 +23,8 @@
Master view for Animals Master view for Animals
""" """
from webhelpers2.html import tags
from wuttaweb.forms.schema import WuttaDictEnum from wuttaweb.forms.schema import WuttaDictEnum
from wuttafarm.db.model import AnimalType, AnimalAsset from wuttafarm.db.model import AnimalType, AnimalAsset
@ -189,6 +191,10 @@ class AnimalAssetView(AssetMasterView):
g.set_joiner("animal_type", lambda q: q.join(model.AnimalType)) g.set_joiner("animal_type", lambda q: q.join(model.AnimalType))
g.set_sorter("animal_type", model.AnimalType.name) g.set_sorter("animal_type", model.AnimalType.name)
g.set_filter("animal_type", model.AnimalType.name) g.set_filter("animal_type", model.AnimalType.name)
if self.farmos_style_grid_links:
g.set_renderer("animal_type", self.render_animal_type_for_grid)
else:
g.set_link("animal_type")
# birthdate # birthdate
g.set_renderer("birthdate", "date") g.set_renderer("birthdate", "date")
@ -196,6 +202,10 @@ class AnimalAssetView(AssetMasterView):
# sex # sex
g.set_enum("sex", enum.ANIMAL_SEX) g.set_enum("sex", enum.ANIMAL_SEX)
def render_animal_type_for_grid(self, animal, field, value):
url = self.request.route_url("animal_types.view", uuid=animal.animal_type_uuid)
return tags.link_to(value, url)
def configure_form(self, form): def configure_form(self, form):
f = form f = form
super().configure_form(f) super().configure_form(f)

View file

@ -109,7 +109,10 @@ class AnimalView(AssetMasterView):
g.set_filter("produces_eggs", NullableBooleanFilter) g.set_filter("produces_eggs", NullableBooleanFilter)
# animal_type_name # animal_type_name
g.set_renderer("animal_type_name", self.render_animal_type_for_grid) if self.farmos_style_grid_links:
g.set_renderer("animal_type_name", self.render_animal_type_for_grid)
else:
g.set_link("animal_type_name")
g.set_sorter("animal_type_name", SimpleSorter("animal_type.name")) g.set_sorter("animal_type_name", SimpleSorter("animal_type.name"))
g.set_filter("animal_type_name", StringFilter, path="animal_type.name") g.set_filter("animal_type_name", StringFilter, path="animal_type.name")
@ -137,11 +140,16 @@ class AnimalView(AssetMasterView):
return tags.link_to(value, url) return tags.link_to(value, url)
def render_groups_for_grid(self, animal, field, value): def render_groups_for_grid(self, animal, field, value):
links = [] groups = []
for group in animal["group_objects"]: for group in animal["group_objects"]:
url = self.request.route_url("farmos_group_assets.view", uuid=group["uuid"]) if self.farmos_style_grid_links:
links.append(tags.link_to(group["name"], url)) url = self.request.route_url(
return ", ".join(links) "farmos_group_assets.view", uuid=group["uuid"]
)
groups.append(tags.link_to(group["name"], url))
else:
groups.append(group["name"])
return ", ".join(groups)
def get_instance(self): def get_instance(self):

View file

@ -104,20 +104,26 @@ class AssetMasterView(FarmOSMasterView):
g.set_filter("archived", BooleanFilter) g.set_filter("archived", BooleanFilter)
def render_owners_for_grid(self, asset, field, value): def render_owners_for_grid(self, asset, field, value):
links = [] owners = []
for user in value: for user in value:
url = self.request.route_url("farmos_users.view", uuid=user["uuid"]) if self.farmos_style_grid_links:
links.append(tags.link_to(user["name"], url)) url = self.request.route_url("farmos_users.view", uuid=user["uuid"])
return ", ".join(links) owners.append(tags.link_to(user["name"], url))
else:
owners.append(user["name"])
return ", ".join(owners)
def render_locations_for_grid(self, asset, field, value): def render_locations_for_grid(self, asset, field, value):
links = [] locations = []
for location in value: for location in value:
asset_type = location["type"].split("--")[1] if self.farmos_style_grid_links:
route = f"farmos_{asset_type}_assets.view" asset_type = location["type"].split("--")[1]
url = self.request.route_url(route, uuid=location["uuid"]) route = f"farmos_{asset_type}_assets.view"
links.append(tags.link_to(location["name"], url)) url = self.request.route_url(route, uuid=location["uuid"])
return ", ".join(links) locations.append(tags.link_to(location["name"], url))
else:
locations.append(location["name"])
return ", ".join(locations)
def grid_row_class(self, asset, data, i): def grid_row_class(self, asset, data, i):
""" """ """ """

View file

@ -32,7 +32,7 @@ import markdown
from wuttaweb.views import MasterView from wuttaweb.views import MasterView
from wuttaweb.forms.schema import WuttaDateTime from wuttaweb.forms.schema import WuttaDateTime
from wuttafarm.web.util import save_farmos_oauth2_token from wuttafarm.web.util import save_farmos_oauth2_token, use_farmos_style_grid_links
from wuttafarm.web.grids import ResourceData, StringFilter, SimpleSorter from wuttafarm.web.grids import ResourceData, StringFilter, SimpleSorter
@ -65,6 +65,7 @@ class FarmOSMasterView(MasterView):
self.farmos_client = self.get_farmos_client() self.farmos_client = self.get_farmos_client()
self.farmos_4x = self.app.is_farmos_4x(self.farmos_client) self.farmos_4x = self.app.is_farmos_4x(self.farmos_client)
self.raw_json = None self.raw_json = None
self.farmos_style_grid_links = use_farmos_style_grid_links(self.config)
def get_farmos_client(self): def get_farmos_client(self):
token = self.request.session.get("farmos.oauth2.token") token = self.request.session.get("farmos.oauth2.token")

View file

@ -27,6 +27,8 @@ from webhelpers2.html import tags
from wuttaweb.views import MasterView from wuttaweb.views import MasterView
from wuttafarm.web.util import use_farmos_style_grid_links
class WuttaFarmMasterView(MasterView): class WuttaFarmMasterView(MasterView):
""" """
@ -49,6 +51,10 @@ class WuttaFarmMasterView(MasterView):
"thumbnail_url": "Thumbnail URL", "thumbnail_url": "Thumbnail URL",
} }
def __init__(self, request, context=None):
super().__init__(request, context=context)
self.farmos_style_grid_links = use_farmos_style_grid_links(self.config)
def get_farmos_url(self, obj): def get_farmos_url(self, obj):
return None return None

View file

@ -27,6 +27,8 @@ from webhelpers2.html import tags
from wuttaweb.views import settings as base from wuttaweb.views import settings as base
from wuttafarm.web.util import use_farmos_style_grid_links
class AppInfoView(base.AppInfoView): class AppInfoView(base.AppInfoView):
""" """
@ -63,6 +65,11 @@ class AppInfoView(base.AppInfoView):
"name": f"{self.app.appname}.farmos_integration_mode", "name": f"{self.app.appname}.farmos_integration_mode",
"default": self.app.get_farmos_integration_mode(), "default": self.app.get_farmos_integration_mode(),
}, },
{
"name": f"{self.app.appname}.farmos_style_grid_links",
"type": bool,
"default": use_farmos_style_grid_links(self.config),
},
] ]
) )
return simple_settings return simple_settings