feat: include/exclude certain views, menus based on integration mode

refs: #3
This commit is contained in:
Lance Edgar 2026-02-19 19:21:23 -06:00
parent 1f254ca775
commit 87101d6b04
5 changed files with 235 additions and 23 deletions

View file

@ -51,6 +51,30 @@ class WuttaFarmAppHandler(base.AppHandler):
self.handlers["farmos"] = factory(self.config) self.handlers["farmos"] = factory(self.config)
return self.handlers["farmos"] return self.handlers["farmos"]
def get_farmos_integration_mode(self):
"""
Returns the integration mode for farmOS, i.e. to control the
app's behavior regarding that.
"""
handler = self.get_farmos_handler()
return handler.get_farmos_integration_mode()
def is_farmos_mirror(self):
"""
Returns ``True`` if the app is configured in "mirror"
integration mode with regard to farmOS.
"""
handler = self.get_farmos_handler()
return handler.is_farmos_mirror()
def is_farmos_wrapper(self):
"""
Returns ``True`` if the app is configured in "wrapper"
integration mode with regard to farmOS.
"""
handler = self.get_farmos_handler()
return handler.is_farmos_wrapper()
def get_farmos_url(self, *args, **kwargs): def get_farmos_url(self, *args, **kwargs):
""" """
Get a farmOS URL. This is a convenience wrapper around Get a farmOS URL. This is a convenience wrapper around

View file

@ -34,6 +34,35 @@ class FarmOSHandler(GenericHandler):
:term:`handler`. :term:`handler`.
""" """
def get_farmos_integration_mode(self):
"""
Returns the integration mode for farmOS, i.e. to control the
app's behavior regarding that.
"""
enum = self.app.enum
return self.config.get(
f"{self.app.appname}.farmos_integration_mode",
default=enum.FARMOS_INTEGRATION_MODE_WRAPPER,
)
def is_farmos_mirror(self):
"""
Returns ``True`` if the app is configured in "mirror"
integration mode with regard to farmOS.
"""
enum = self.app.enum
mode = self.get_farmos_integration_mode()
return mode == enum.FARMOS_INTEGRATION_MODE_MIRROR
def is_farmos_wrapper(self):
"""
Returns ``True`` if the app is configured in "wrapper"
integration mode with regard to farmOS.
"""
enum = self.app.enum
mode = self.get_farmos_integration_mode()
return mode == enum.FARMOS_INTEGRATION_MODE_WRAPPER
def get_farmos_client(self, hostname=None, **kwargs): def get_farmos_client(self, hostname=None, **kwargs):
""" """
Returns a new farmOS API client. Returns a new farmOS API client.

View file

@ -32,10 +32,29 @@ class WuttaFarmMenuHandler(base.MenuHandler):
""" """
def make_menus(self, request, **kwargs): def make_menus(self, request, **kwargs):
enum = self.app.enum
mode = self.app.get_farmos_integration_mode()
if mode == enum.FARMOS_INTEGRATION_MODE_WRAPPER:
return [
self.make_farmos_asset_menu(request),
self.make_farmos_log_menu(request),
self.make_farmos_other_menu(request),
self.make_admin_menu(request, include_people=True),
]
elif mode == enum.FARMOS_INTEGRATION_MODE_MIRROR:
return [
self.make_asset_menu(request),
self.make_log_menu(request),
self.make_farmos_full_menu(request),
self.make_admin_menu(request, include_people=True),
]
else: # FARMOS_INTEGRATION_MODE_NONE
return [ return [
self.make_asset_menu(request), self.make_asset_menu(request),
self.make_log_menu(request), self.make_log_menu(request),
self.make_farmos_menu(request),
self.make_admin_menu(request, include_people=True), self.make_admin_menu(request, include_people=True),
] ]
@ -168,7 +187,7 @@ class WuttaFarmMenuHandler(base.MenuHandler):
], ],
} }
def make_farmos_menu(self, request): def make_farmos_full_menu(self, request):
config = request.wutta_config config = request.wutta_config
app = config.get_app() app = config.get_app()
return { return {
@ -282,3 +301,137 @@ class WuttaFarmMenuHandler(base.MenuHandler):
}, },
], ],
} }
def make_farmos_asset_menu(self, request):
config = request.wutta_config
app = config.get_app()
return {
"title": "Assets",
"type": "menu",
"items": [
{
"title": "Animal",
"route": "farmos_animals",
"perm": "farmos_animals.list",
},
{
"title": "Group",
"route": "farmos_groups",
"perm": "farmos_groups.list",
},
{
"title": "Land",
"route": "farmos_land_assets",
"perm": "farmos_land_assets.list",
},
{
"title": "Plant",
"route": "farmos_asset_plant",
"perm": "farmos_asset_plant.list",
},
{
"title": "Structure",
"route": "farmos_structures",
"perm": "farmos_structures.list",
},
{"type": "sep"},
{
"title": "Animal Types",
"route": "farmos_animal_types",
"perm": "farmos_animal_types.list",
},
{
"title": "Land Types",
"route": "farmos_land_types",
"perm": "farmos_land_types.list",
},
{
"title": "Plant Types",
"route": "farmos_plant_types",
"perm": "farmos_plant_types.list",
},
{
"title": "Structure Types",
"route": "farmos_structure_types",
"perm": "farmos_structure_types.list",
},
{"type": "sep"},
{
"title": "Asset Types",
"route": "farmos_asset_types",
"perm": "farmos_asset_types.list",
},
],
}
def make_farmos_log_menu(self, request):
config = request.wutta_config
app = config.get_app()
return {
"title": "Logs",
"type": "menu",
"items": [
{
"title": "Activity",
"route": "farmos_logs_activity",
"perm": "farmos_logs_activity.list",
},
{
"title": "Harvest",
"route": "farmos_logs_harvest",
"perm": "farmos_logs_harvest.list",
},
{
"title": "Medical",
"route": "farmos_logs_medical",
"perm": "farmos_logs_medical.list",
},
{
"title": "Observation",
"route": "farmos_logs_observation",
"perm": "farmos_logs_observation.list",
},
{"type": "sep"},
{
"title": "Log Types",
"route": "farmos_log_types",
"perm": "farmos_log_types.list",
},
{
"title": "Quantity Types",
"route": "farmos_quantity_types",
"perm": "farmos_quantity_types.list",
},
{
"title": "Standard Quantities",
"route": "farmos_quantities_standard",
"perm": "farmos_quantities_standard.list",
},
{
"title": "Units",
"route": "farmos_units",
"perm": "farmos_units.list",
},
],
}
def make_farmos_other_menu(self, request):
config = request.wutta_config
app = config.get_app()
return {
"title": "farmOS",
"type": "menu",
"items": [
{
"title": "Go to farmOS",
"url": app.get_farmos_url(),
"target": "_blank",
},
{"type": "sep"},
{
"title": "Users",
"route": "farmos_users",
"perm": "farmos_users.list",
},
],
}

View file

@ -29,6 +29,10 @@ from .master import WuttaFarmMasterView
def includeme(config): def includeme(config):
wutta_config = config.registry.settings.get("wutta_config")
app = wutta_config.get_app()
enum = app.enum
mode = app.get_farmos_integration_mode()
# wuttaweb core # wuttaweb core
essential.defaults( essential.defaults(
@ -42,6 +46,7 @@ def includeme(config):
) )
# native table views # native table views
if mode != enum.FARMOS_INTEGRATION_MODE_WRAPPER:
config.include("wuttafarm.web.views.units") config.include("wuttafarm.web.views.units")
config.include("wuttafarm.web.views.quantities") config.include("wuttafarm.web.views.quantities")
config.include("wuttafarm.web.views.asset_types") config.include("wuttafarm.web.views.asset_types")
@ -58,4 +63,5 @@ def includeme(config):
config.include("wuttafarm.web.views.logs_observation") config.include("wuttafarm.web.views.logs_observation")
# views for farmOS # views for farmOS
if mode != enum.FARMOS_INTEGRATION_MODE_NONE:
config.include("wuttafarm.web.views.farmos") config.include("wuttafarm.web.views.farmos")

View file

@ -61,7 +61,7 @@ class AppInfoView(base.AppInfoView):
{"name": "farmos.url.base"}, {"name": "farmos.url.base"},
{ {
"name": f"{self.app.appname}.farmos_integration_mode", "name": f"{self.app.appname}.farmos_integration_mode",
"default": "wrapper", "default": self.app.get_farmos_integration_mode(),
}, },
] ]
) )