diff --git a/src/wuttafarm/app.py b/src/wuttafarm/app.py index 087c48a..2df38e9 100644 --- a/src/wuttafarm/app.py +++ b/src/wuttafarm/app.py @@ -51,6 +51,30 @@ class WuttaFarmAppHandler(base.AppHandler): self.handlers["farmos"] = factory(self.config) 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): """ Get a farmOS URL. This is a convenience wrapper around diff --git a/src/wuttafarm/farmos/handler.py b/src/wuttafarm/farmos/handler.py index 6eee14f..393d121 100644 --- a/src/wuttafarm/farmos/handler.py +++ b/src/wuttafarm/farmos/handler.py @@ -34,6 +34,35 @@ class FarmOSHandler(GenericHandler): :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): """ Returns a new farmOS API client. diff --git a/src/wuttafarm/web/menus.py b/src/wuttafarm/web/menus.py index 448fb8d..408fd2e 100644 --- a/src/wuttafarm/web/menus.py +++ b/src/wuttafarm/web/menus.py @@ -32,12 +32,31 @@ class WuttaFarmMenuHandler(base.MenuHandler): """ def make_menus(self, request, **kwargs): - return [ - self.make_asset_menu(request), - self.make_log_menu(request), - self.make_farmos_menu(request), - self.make_admin_menu(request, include_people=True), - ] + 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 [ + self.make_asset_menu(request), + self.make_log_menu(request), + self.make_admin_menu(request, include_people=True), + ] def make_asset_menu(self, request): return { @@ -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 app = config.get_app() 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", + }, + ], + } diff --git a/src/wuttafarm/web/views/__init__.py b/src/wuttafarm/web/views/__init__.py index 5e31d84..6f77e57 100644 --- a/src/wuttafarm/web/views/__init__.py +++ b/src/wuttafarm/web/views/__init__.py @@ -29,6 +29,10 @@ from .master import WuttaFarmMasterView 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 essential.defaults( @@ -42,20 +46,22 @@ def includeme(config): ) # native table views - config.include("wuttafarm.web.views.units") - config.include("wuttafarm.web.views.quantities") - config.include("wuttafarm.web.views.asset_types") - config.include("wuttafarm.web.views.assets") - config.include("wuttafarm.web.views.land") - config.include("wuttafarm.web.views.structures") - config.include("wuttafarm.web.views.animals") - config.include("wuttafarm.web.views.groups") - config.include("wuttafarm.web.views.plants") - config.include("wuttafarm.web.views.logs") - config.include("wuttafarm.web.views.logs_activity") - config.include("wuttafarm.web.views.logs_harvest") - config.include("wuttafarm.web.views.logs_medical") - config.include("wuttafarm.web.views.logs_observation") + if mode != enum.FARMOS_INTEGRATION_MODE_WRAPPER: + config.include("wuttafarm.web.views.units") + config.include("wuttafarm.web.views.quantities") + config.include("wuttafarm.web.views.asset_types") + config.include("wuttafarm.web.views.assets") + config.include("wuttafarm.web.views.land") + config.include("wuttafarm.web.views.structures") + config.include("wuttafarm.web.views.animals") + config.include("wuttafarm.web.views.groups") + config.include("wuttafarm.web.views.plants") + config.include("wuttafarm.web.views.logs") + config.include("wuttafarm.web.views.logs_activity") + config.include("wuttafarm.web.views.logs_harvest") + config.include("wuttafarm.web.views.logs_medical") + config.include("wuttafarm.web.views.logs_observation") # views for farmOS - config.include("wuttafarm.web.views.farmos") + if mode != enum.FARMOS_INTEGRATION_MODE_NONE: + config.include("wuttafarm.web.views.farmos") diff --git a/src/wuttafarm/web/views/settings.py b/src/wuttafarm/web/views/settings.py index 3b2c858..6372c40 100644 --- a/src/wuttafarm/web/views/settings.py +++ b/src/wuttafarm/web/views/settings.py @@ -61,7 +61,7 @@ class AppInfoView(base.AppInfoView): {"name": "farmos.url.base"}, { "name": f"{self.app.appname}.farmos_integration_mode", - "default": "wrapper", + "default": self.app.get_farmos_integration_mode(), }, ] )