# api/menus.py from typing import List from django.shortcuts import get_object_or_404 from loguru import logger from ninja import Router from ninja.errors import HttpError from users.models import Menu from users.permission import has_permission from users.schema import MenuOut, MenuCreate, MenuUpdate router = Router(tags=['menus']) @router.post("/", response=MenuOut, summary="创建菜单") def create_menu(request, payload: MenuCreate): if not has_permission(request.auth.id, "menu:create"): raise HttpError(403, "权限不足") 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("/", response=List[MenuOut], summary="获取菜单列表") def list_menus(request): if not has_permission(request.auth.id, "menu:list"): raise HttpError(403, "权限不足") menus = Menu.objects.all() logger.info(menus) permissions = [m.permission_code for m in menus] logger.info(permissions) return menus @router.get("/{menu_id}/", response=MenuOut, summary="获取菜单详情") def get_menu(request, menu_id: int): if not has_permission(request.auth.id, "menu:view"): raise HttpError(403, "权限不足") menu = get_object_or_404(Menu, id=menu_id) return menu @router.put("/{menu_id}/", response=MenuOut, summary="更新菜单") def update_menu(request, menu_id: int, payload: MenuUpdate): # if not has_permission(request.auth.id, "menu:update"): # raise HttpError(403, "权限不足") 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="删除菜单") def delete_menu(request, menu_id: int): if not has_permission(request.auth.id, "menu:delete"): raise HttpError(403, "权限不足") menu = get_object_or_404(Menu, id=menu_id) menu.delete() return {"success": True}