# -*- coding: utf-8; -*-
################################################################################
#
# WuttaFarm --Web app to integrate with and extend farmOS
# Copyright © 2026 Lance Edgar
#
# This file is part of WuttaFarm.
#
# WuttaFarm is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# WuttaFarm is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# WuttaFarm. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
WuttaFarm Menu
"""
from wuttaweb import menus as base
[docs]
class WuttaFarmMenuHandler(base.MenuHandler):
"""
WuttaFarm menu handler
"""
[docs]
def make_menus(self, request, **kwargs):
enum = self.app.enum
mode = self.app.get_farmos_integration_mode()
quick_menu = self.make_quick_menu(request)
admin_menu = self.make_admin_menu(request, include_people=True)
if mode == enum.FARMOS_INTEGRATION_MODE_WRAPPER:
return [
quick_menu,
self.make_farmos_asset_menu(request),
self.make_farmos_log_menu(request),
self.make_farmos_other_menu(request),
admin_menu,
]
elif mode == enum.FARMOS_INTEGRATION_MODE_MIRROR:
return [
quick_menu,
self.make_asset_menu(request),
self.make_log_menu(request),
self.make_farmos_full_menu(request),
admin_menu,
]
else: # FARMOS_INTEGRATION_MODE_NONE
return [
quick_menu,
self.make_asset_menu(request),
self.make_log_menu(request),
admin_menu,
]
def make_quick_menu(self, request):
return {
"title": "Quick",
"type": "menu",
"items": [
{
"title": "Eggs",
"route": "quick.eggs",
"perm": "quick.eggs",
},
],
}
def make_asset_menu(self, request):
return {
"title": "Assets",
"type": "menu",
"items": [
{
"title": "All Assets",
"route": "assets",
"perm": "assets.list",
},
{
"title": "Animal",
"route": "animal_assets",
"perm": "animal_assets.list",
},
{
"title": "Compost",
"route": "compost_assets",
"perm": "compost_assets.list",
},
{
"title": "Equipment",
"route": "equipment_assets",
"perm": "equipment_assets.list",
},
{
"title": "Group",
"route": "group_assets",
"perm": "group_assets.list",
},
{
"title": "Land",
"route": "land_assets",
"perm": "land_assets.list",
},
{
"title": "Plant",
"route": "plant_assets",
"perm": "plant_assets.list",
},
{
"title": "Structure",
"route": "structure_assets",
"perm": "structure_assets.list",
},
{
"title": "Water",
"route": "water_assets",
"perm": "water_assets.list",
},
{"type": "sep"},
{
"title": "Animal Types",
"route": "animal_types",
"perm": "animal_types.list",
},
{
"title": "Equipment Types",
"route": "equipment_types",
"perm": "equipment_types.list",
},
{
"title": "Land Types",
"route": "land_types",
"perm": "land_types.list",
},
{
"title": "Material Types",
"route": "material_types",
"perm": "material_types.list",
},
{
"title": "Plant Types",
"route": "plant_types",
"perm": "plant_types.list",
},
{
"title": "Seasons",
"route": "seasons",
"perm": "seasons.list",
},
{
"title": "Structure Types",
"route": "structure_types",
"perm": "structure_types.list",
},
{
"title": "Asset Types",
"route": "asset_types",
"perm": "asset_types.list",
},
],
}
def make_log_menu(self, request):
return {
"title": "Logs",
"type": "menu",
"items": [
{
"title": "All Logs",
"route": "log",
"perm": "log.list",
},
{
"title": "Activity",
"route": "logs_activity",
"perm": "logs_activity.list",
},
{
"title": "Harvest",
"route": "logs_harvest",
"perm": "logs_harvest.list",
},
{
"title": "Medical",
"route": "logs_medical",
"perm": "logs_medical.list",
},
{
"title": "Observation",
"route": "logs_observation",
"perm": "logs_observation.list",
},
{
"title": "Seeding",
"route": "logs_seeding",
"perm": "logs_seeding.list",
},
{"type": "sep"},
{
"title": "All Quantities",
"route": "quantities",
"perm": "quantities.list",
},
{
"title": "Material Quantities",
"route": "quantities_material",
"perm": "quantities_material.list",
},
{
"title": "Standard Quantities",
"route": "quantities_standard",
"perm": "quantities_standard.list",
},
{"type": "sep"},
{
"title": "Log Types",
"route": "log_types",
"perm": "log_types.list",
},
{
"title": "Measures",
"route": "measures",
"perm": "measures.list",
},
{
"title": "Quantity Types",
"route": "quantity_types",
"perm": "quantity_types.list",
},
{
"title": "Units",
"route": "units",
"perm": "units.list",
},
],
}
def make_farmos_full_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": "Animal Assets",
"route": "farmos_animal_assets",
"perm": "farmos_animal_assets.list",
},
{
"title": "Compost Assets",
"route": "farmos_compost_assets",
"perm": "farmos_compost_assets.list",
},
{
"title": "Equipment Assets",
"route": "farmos_equipment_assets",
"perm": "farmos_equipment_assets.list",
},
{
"title": "Group Assets",
"route": "farmos_group_assets",
"perm": "farmos_group_assets.list",
},
{
"title": "Land Assets",
"route": "farmos_land_assets",
"perm": "farmos_land_assets.list",
},
{
"title": "Plant Assets",
"route": "farmos_plant_assets",
"perm": "farmos_plant_assets.list",
},
{
"title": "Structure Assets",
"route": "farmos_structure_assets",
"perm": "farmos_structure_assets.list",
},
{
"title": "Water Assets",
"route": "farmos_water_assets",
"perm": "farmos_water_assets.list",
},
{"type": "sep"},
{
"title": "Activity Logs",
"route": "farmos_logs_activity",
"perm": "farmos_logs_activity.list",
},
{
"title": "Harvest Logs",
"route": "farmos_logs_harvest",
"perm": "farmos_logs_harvest.list",
},
{
"title": "Medical Logs",
"route": "farmos_logs_medical",
"perm": "farmos_logs_medical.list",
},
{
"title": "Observation Logs",
"route": "farmos_logs_observation",
"perm": "farmos_logs_observation.list",
},
{
"title": "Seeding Logs",
"route": "farmos_logs_seeding",
"perm": "farmos_logs_seeding.list",
},
{"type": "sep"},
{
"title": "Animal Types",
"route": "farmos_animal_types",
"perm": "farmos_animal_types.list",
},
{
"title": "Equipment Types",
"route": "farmos_equipment_types",
"perm": "farmos_equipment_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": "Seasons",
"route": "farmos_seasons",
"perm": "farmos_seasons.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",
},
{
"title": "Log Types",
"route": "farmos_log_types",
"perm": "farmos_log_types.list",
},
{
"title": "Material Types",
"route": "farmos_material_types",
"perm": "farmos_material_types.list",
},
{
"title": "Quantity Types",
"route": "farmos_quantity_types",
"perm": "farmos_quantity_types.list",
},
{
"title": "Material Quantities",
"route": "farmos_quantities_material",
"perm": "farmos_quantities_material.list",
},
{
"title": "Standard Quantities",
"route": "farmos_quantities_standard",
"perm": "farmos_quantities_standard.list",
},
{
"title": "Units",
"route": "farmos_units",
"perm": "farmos_units.list",
},
{"type": "sep"},
{
"title": "Users",
"route": "farmos_users",
"perm": "farmos_users.list",
},
],
}
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_animal_assets",
"perm": "farmos_animal_assets.list",
},
{
"title": "Compost",
"route": "farmos_compost_assets",
"perm": "farmos_compost_assets.list",
},
{
"title": "Equipment",
"route": "farmos_equipment_assets",
"perm": "farmos_equipment_assets.list",
},
{
"title": "Group",
"route": "farmos_group_assets",
"perm": "farmos_group_assets.list",
},
{
"title": "Land",
"route": "farmos_land_assets",
"perm": "farmos_land_assets.list",
},
{
"title": "Plant",
"route": "farmos_plant_assets",
"perm": "farmos_plant_assets.list",
},
{
"title": "Structure",
"route": "farmos_structure_assets",
"perm": "farmos_structure_assets.list",
},
{
"title": "Water",
"route": "farmos_water_assets",
"perm": "farmos_water_assets.list",
},
{"type": "sep"},
{
"title": "Animal Types",
"route": "farmos_animal_types",
"perm": "farmos_animal_types.list",
},
{
"title": "Equipment Types",
"route": "farmos_equipment_types",
"perm": "farmos_equipment_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": "Seasons",
"route": "farmos_seasons",
"perm": "farmos_seasons.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",
},
{
"title": "Seeding",
"route": "farmos_logs_seeding",
"perm": "farmos_logs_seeding.list",
},
{"type": "sep"},
{
"title": "Log Types",
"route": "farmos_log_types",
"perm": "farmos_log_types.list",
},
{
"title": "Material Types",
"route": "farmos_material_types",
"perm": "farmos_material_types.list",
},
{
"title": "Quantity Types",
"route": "farmos_quantity_types",
"perm": "farmos_quantity_types.list",
},
{
"title": "Material Quantities",
"route": "farmos_quantities_material",
"perm": "farmos_quantities_material.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",
},
],
}