from typing import List from django.shortcuts import get_object_or_404 from loguru import logger from ninja import Router from users.models import Menu from users.permission import require_permissions from users.schema import MenuOut, MenuCreate, MenuUpdate router = Router(tags=['menus']) @router.get("/", response=List[MenuOut], summary="获取菜单列表") @require_permissions("menu:list") def list_menus(request): menus = Menu.objects.all() logger.info(menus) permissions = [m.permission_code for m in menus] logger.info(permissions) return menus @router.post("/", response=MenuOut, summary="创建菜单") @require_permissions("menu:create") def create_menu(request, payload: MenuCreate): data = payload.dict() parent_id = data.pop('parent_id', None) if parent_id: data['parent_id'] = parent_id menu = Menu.objects.create(**data) return menu @router.get("/{menu_id}/", response=MenuOut, summary="获取菜单详情") @require_permissions("menu:view") def get_menu(request, menu_id: int): menu = get_object_or_404(Menu, id=menu_id) return menu @router.put("/{menu_id}/", response=MenuOut, summary="更新菜单") @require_permissions("menu:update") def update_menu(request, menu_id: int, payload: MenuUpdate): logger.debug(payload) menu = get_object_or_404(Menu, id=menu_id) data = payload.dict() parent_id = data.pop('parent_id', None) if parent_id: data['parent_id'] = parent_id else: data['parent'] = None logger.info(data) for attr, value in data.items(): setattr(menu, attr, value) logger.info(menu.parent_id) menu.save() return menu @router.delete("/{menu_id}/", summary="删除菜单") @require_permissions("menu:delete") def delete_menu(request, menu_id: int): menu = get_object_or_404(Menu, id=menu_id) menu.delete() return {"success": True}