Files
server/users/menus.py
T

76 lines
2.2 KiB
Python

# 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}