feat: add "See raw JSON data" button for farmOS API views

This commit is contained in:
Lance Edgar 2026-02-10 18:29:08 -06:00
parent 9cc7237bfb
commit 09042747a0
13 changed files with 78 additions and 3 deletions

View file

@ -0,0 +1,45 @@
## -*- coding: utf-8; -*-
<%inherit file="/master/view.mako" />
<%def name="tool_panels()">
${parent.tool_panels()}
${self.tool_panel_tools()}
</%def>
<%def name="tool_panel_tools()">
% if raw_json:
<wutta-tool-panel heading="Tools">
<b-button type="is-primary"
icon-pack="fas"
icon-left="code"
@click="viewJsonShowDialog = true">
See raw JSON data
</b-button>
</wutta-tool-panel>
<${b}-modal :width="1200"
% if request.use_oruga:
v-model:active="viewJsonShowDialog"
% else:
:active.sync="viewJsonShowDialog"
% endif
>
<div class="card">
<div class="card-content">
${rendered_json|n}
</div>
</div>
</${b}-modal>
% endif
</%def>
<%def name="modify_vue_vars()">
${parent.modify_vue_vars()}
% if raw_json:
<script>
ThisPageData.viewJsonShowDialog = false
</script>
% endif
</%def>

View file

@ -79,6 +79,7 @@ class AnimalTypeView(FarmOSMasterView):
animal_type = self.farmos_client.resource.get_id(
"taxonomy_term", "animal_type", self.request.matchdict["uuid"]
)
self.raw_json = animal_type
return self.normalize_animal_type(animal_type["data"])
def get_instance_title(self, animal_type):

View file

@ -99,6 +99,7 @@ class AnimalView(FarmOSMasterView):
animal = self.farmos_client.resource.get_id(
"asset", "animal", self.request.matchdict["uuid"]
)
self.raw_json = animal
# instance data
data = self.normalize_animal(animal["data"])

View file

@ -69,6 +69,7 @@ class AssetTypeView(FarmOSMasterView):
asset_type = self.farmos_client.resource.get_id(
"asset_type", "asset_type", self.request.matchdict["uuid"]
)
self.raw_json = asset_type
return self.normalize_asset_type(asset_type["data"])
def get_instance_title(self, asset_type):

View file

@ -88,11 +88,10 @@ class GroupView(FarmOSMasterView):
g.set_renderer("changed", "datetime")
def get_instance(self):
group = self.farmos_client.resource.get_id(
"asset", "group", self.request.matchdict["uuid"]
)
self.raw_json = group
return self.normalize_group(group["data"])
def get_instance_title(self, group):

View file

@ -95,6 +95,7 @@ class LandAssetView(FarmOSMasterView):
land_asset = self.farmos_client.resource.get_id(
"asset", "land", self.request.matchdict["uuid"]
)
self.raw_json = land_asset
return self.normalize_land_asset(land_asset["data"])
def get_instance_title(self, land_asset):

View file

@ -64,6 +64,7 @@ class LandTypeView(FarmOSMasterView):
land_type = self.farmos_client.resource.get_id(
"land_type", "land_type", self.request.matchdict["uuid"]
)
self.raw_json = land_type
return self.normalize_land_type(land_type["data"])
def get_instance_title(self, land_type):

View file

@ -66,6 +66,7 @@ class LogTypeView(FarmOSMasterView):
log_type = self.farmos_client.resource.get_id(
"log_type", "log_type", self.request.matchdict["uuid"]
)
self.raw_json = log_type
return self.normalize_log_type(log_type["data"])
def get_instance_title(self, log_type):

View file

@ -79,6 +79,7 @@ class ActivityLogView(FarmOSMasterView):
def get_instance(self):
log = self.farmos_client.log.get_id("activity", self.request.matchdict["uuid"])
self.raw_json = log
return self.normalize_log(log["data"])
def get_instance_title(self, log):

View file

@ -23,6 +23,10 @@
Base class for farmOS master views
"""
import json
import markdown
from wuttaweb.views import MasterView
from wuttafarm.web.util import save_farmos_oauth2_token
@ -54,6 +58,7 @@ class FarmOSMasterView(MasterView):
def __init__(self, request, context=None):
super().__init__(request, context=context)
self.farmos_client = self.get_farmos_client()
self.raw_json = None
def get_farmos_client(self):
token = self.request.session.get("farmos.oauth2.token")
@ -71,9 +76,26 @@ class FarmOSMasterView(MasterView):
return self.app.get_farmos_client(token=token, token_updater=token_updater)
def get_fallback_templates(self, template):
""" """
templates = super().get_fallback_templates(template)
if template == "view":
templates.insert(0, "/farmos/master/view.mako")
return templates
def get_template_context(self, context):
if self.listing and self.farmos_refurl_path:
context["farmos_refurl"] = self.app.get_farmos_url(self.farmos_refurl_path)
if self.viewing and self.raw_json:
context["raw_json"] = self.raw_json
code = "```json\n" + json.dumps(self.raw_json, indent=2) + "\n```"
# TODO: this does not seem to be adding syntax highlight
context["rendered_json"] = markdown.markdown(
code, extensions=["fenced_code", "codehilite"]
)
return context

View file

@ -66,6 +66,7 @@ class StructureTypeView(FarmOSMasterView):
structure_type = self.farmos_client.resource.get_id(
"structure_type", "structure_type", self.request.matchdict["uuid"]
)
self.raw_json = structure_type
return self.normalize_structure_type(structure_type["data"])
def get_instance_title(self, structure_type):

View file

@ -94,7 +94,7 @@ class StructureView(FarmOSMasterView):
structure = self.farmos_client.resource.get_id(
"asset", "structure", self.request.matchdict["uuid"]
)
self.raw_json = structure
data = self.normalize_structure(structure["data"])
if relationships := structure["data"].get("relationships"):

View file

@ -77,6 +77,7 @@ class UserView(FarmOSMasterView):
user = self.farmos_client.resource.get_id(
"user", "user", self.request.matchdict["uuid"]
)
self.raw_json = user
return self.normalize_user(user["data"])
def get_instance_title(self, user):