76 lines
2.2 KiB
Python
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}
|