1
votes

I rebuild the main menu in wagtail admin with the file wagtail_hooks.py. When I update the database, the main menu will change according to the new content in the database. Part of the file wagtail_hooks.py are as follows:

factories = DicFactory.objects.all()
num = len(factories)
factoryMenus = []
equipmentMenus = []
simulationMenus = []
equipmentNum = []
simulationNum = []
for fac in factories:
    partURL = '/admin/home/dicequipment/?factory_id='
    fullURL = partURL + str(fac.id)
    factoryMenus.append(MenuItem(fac.name, fullURL, classnames='icon icon-pilcrow', order=10000))
    equipments = DicEquipment.objects.filter(factory_id = fac.id)
    equipmentNum.append(len(equipments))
    for eq in equipments:
        partURL = '/admin/home/simulation/?equipment_id='
        fullURL = partURL + str(eq.id)
        equipmentMenus.append(MenuItem(eq.name, fullURL, classnames='icon icon-chain-broken',     order=10000))
        simulations = Simulation.objects.filter(equipment_id = eq.id)
        simulationNum.append(len(simulations))
        for sim in simulations:
            partURL = '/admin/home/simulation/inspect/'
            fullURL = partURL + str(sim.id) +'/?integrityCheck=true'
            simulationMenus.append(MenuItem(sim.name, fullURL, classnames='icon icon-list-ol', order=10000))
  
#construct the main menu
@hooks.register('construct_main_menu')
def hide_images_menu_item(request, menu_items):
    menu_items[:] = [item for item in menu_items if item.name != 'images']
    menu_items[:] = [item for item in menu_items if item.name != 'documents']
    menu_items[:] = [item for item in menu_items if item.name != 'reports']
    menu_items[:] = [item for item in menu_items if item.name != 'settings']
    menu_items[:] = [item for item in menu_items if item.name != 'explorer']
    menu_items[:] = [item for item in menu_items if item.label != '工厂']
    menu_items[:] = [item for item in menu_items if item.label != '装置']
    menu_items[:] = [item for item in menu_items if item.label != '数字模型']
    menu_items[:] = [item for item in menu_items if item.label != '算例列表']
    menu_items[:] = [item for item in menu_items if item.label != '算例输入']
    menu_items[:] = [item for item in menu_items if item.label != '硬件环境']
    menu_items[:] = [item for item in menu_items if item.label != '模拟软件']
    menu_items[:] = [item for item in menu_items if item.label != '人员列表']
    menu_items[:] = [item for item in menu_items if item.label != '算例输入']
    menu_items.append(MenuItem('工厂', '/admin/home/dicfactory/', classnames='icon icon-folder-open-inverse', order=10000))
    equipmentMenuIndex = 0
    simulationMenuIndex = 0
    factoryIndex = 0
    equipmentIndex = 0
    for i in range(num):
        menu_items.append(factoryMenus[i])
        for j in range(equipmentNum[factoryIndex]):
            menu_items.append(equipmentMenus[equipmentMenuIndex])
            equipmentMenuIndex = equipmentMenuIndex +1
            for k in range(simulationNum[equipmentIndex]):
                menu_items.append(simulationMenus[simulationMenuIndex])
                simulationMenuIndex = simulationMenuIndex +1
            equipmentIndex = equipmentIndex + 1
        factoryIndex = factoryIndex + 1

How to automatically reload the file wagtail_hooks.py when database changed? Wish for your answer and help. Thank you.

This is the admin page in my website. When I add a factory, the new factory name should appear in the main menu. admin page

1

1 Answers

1
votes

Move all of your code into the hide_images_menu_item hook function. This will then be run on every page request - code that's not in a function but just in the body of wagtail_hooks.py will only be run once, at startup.