update. 完善新闻接口权限处理
This commit is contained in:
+28
-1
@@ -1,12 +1,16 @@
|
|||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
from loguru import logger
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
from ninja import Router
|
from ninja import Router
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
|
from ninja.errors import HttpError
|
||||||
from ninja.pagination import paginate, PageNumberPagination
|
from ninja.pagination import paginate, PageNumberPagination
|
||||||
|
|
||||||
|
from users.permission import has_permission, require_permissions
|
||||||
|
from utils.dept_utils import get_dept_children_ids
|
||||||
from .models import NewsSection, News
|
from .models import NewsSection, News
|
||||||
from .schema import (
|
from .schema import (
|
||||||
NewsSectionSchema, NewsSectionCreateSchema, NewsSectionUpdateSchema,
|
NewsSectionSchema, NewsSectionCreateSchema, NewsSectionUpdateSchema,
|
||||||
@@ -55,25 +59,47 @@ def delete_section(request, section_id: int):
|
|||||||
|
|
||||||
@router.get("/news/", response=List[NewsSchema])
|
@router.get("/news/", response=List[NewsSchema])
|
||||||
@paginate(PageNumberPagination, page_size=20)
|
@paginate(PageNumberPagination, page_size=20)
|
||||||
|
@require_permissions("news:list")
|
||||||
def list_news(request, section_id: int = 0, title: str = ''):
|
def list_news(request, section_id: int = 0, title: str = ''):
|
||||||
news = News.objects.filter(title__contains=title)
|
user = request.auth
|
||||||
|
if not has_permission(user.id, "news:list"):
|
||||||
|
raise
|
||||||
|
news = News.objects.all()
|
||||||
|
|
||||||
|
# 板块筛选
|
||||||
if section_id > 0:
|
if section_id > 0:
|
||||||
return news.filter(section_id=section_id).all()
|
return news.filter(section_id=section_id).all()
|
||||||
|
|
||||||
|
# 根据用户权限筛选
|
||||||
|
if has_permission(user.id, 'news:manage'):
|
||||||
|
dept_ids = get_dept_children_ids(user.dept_id)
|
||||||
|
# 筛选:作者属于这些部门中的任意一个
|
||||||
|
news = news.filter(author__dept_id__in=dept_ids)
|
||||||
|
else:
|
||||||
|
logger.info(user)
|
||||||
|
news = news.filter(author=user)
|
||||||
|
|
||||||
|
# 根据新闻标题筛选
|
||||||
|
if title:
|
||||||
|
news = news.filter(title__contains=title)
|
||||||
return news
|
return news
|
||||||
|
|
||||||
|
|
||||||
@router.get("/news/{news_id}", response=NewsSchema)
|
@router.get("/news/{news_id}", response=NewsSchema)
|
||||||
|
@require_permissions("news:view")
|
||||||
def retrieve_news(request, news_id: int):
|
def retrieve_news(request, news_id: int):
|
||||||
return get_object_or_404(News, id=news_id)
|
return get_object_or_404(News, id=news_id)
|
||||||
|
|
||||||
|
|
||||||
@router.post("/news/", response=NewsSchema)
|
@router.post("/news/", response=NewsSchema)
|
||||||
|
@require_permissions("news:create")
|
||||||
def create_news(request, data: NewsCreateSchema):
|
def create_news(request, data: NewsCreateSchema):
|
||||||
news = News.objects.create(**data.dict())
|
news = News.objects.create(**data.dict())
|
||||||
return news
|
return news
|
||||||
|
|
||||||
|
|
||||||
@router.put("/news/{news_id}", response=NewsSchema)
|
@router.put("/news/{news_id}", response=NewsSchema)
|
||||||
|
@require_permissions("news:update")
|
||||||
def update_news(request, news_id: int, data: NewsUpdateSchema):
|
def update_news(request, news_id: int, data: NewsUpdateSchema):
|
||||||
news = get_object_or_404(News, id=news_id)
|
news = get_object_or_404(News, id=news_id)
|
||||||
for attr, value in data.dict(exclude_unset=True).items():
|
for attr, value in data.dict(exclude_unset=True).items():
|
||||||
@@ -83,6 +109,7 @@ def update_news(request, news_id: int, data: NewsUpdateSchema):
|
|||||||
|
|
||||||
|
|
||||||
@router.delete("/news/{news_id}", response={"success": bool})
|
@router.delete("/news/{news_id}", response={"success": bool})
|
||||||
|
@require_permissions("news:delete")
|
||||||
def delete_news(request, news_id: int):
|
def delete_news(request, news_id: int):
|
||||||
news = get_object_or_404(News, id=news_id)
|
news = get_object_or_404(News, id=news_id)
|
||||||
news.delete()
|
news.delete()
|
||||||
|
|||||||
Reference in New Issue
Block a user