doc:DocManager 新增 QueryDocuments/QuerySeries 返回查询集,视图 get_queryset 改为委托;invite:新增 InviteManager(QuerySet/GetByInviteID/Create);sve:新增 SveManager(QuerySet/GetByCandidates/Upsert 支持 CreateDefaults);community:新增 CommunityManager(板块/分类/帖子/回复/点赞共 20 处,ToggleLike 封装点赞切换与计数同步,聚合查询保留原 values_list+annotate)。 视图层不再直接操作 ORM,类级 queryset 属性保留(DRF 必需);QueryPosts 收 Filters 字典以保持原边界行为。
174 lines
6.9 KiB
Python
174 lines
6.9 KiB
Python
"""模块:Doc 社区文档视图
|
|
提供社区文档与系列的增删改查与访问控制。"""
|
|
|
|
import datetime
|
|
from rest_framework import viewsets
|
|
from rest_framework.decorators import action
|
|
from rest_framework.response import Response
|
|
from rest_framework.permissions import IsAuthenticated, AllowAny
|
|
|
|
from .models import CommunityDocument, CommunitySeries
|
|
from .serializers import (
|
|
CommunityDocumentSerializer, CommunitySeriesSerializer,
|
|
DocAddSerializer, DocModifySerializer,
|
|
SerieAddSerializer, SerieDeleteSerializer,
|
|
)
|
|
from .manager import DocManager
|
|
from gvsdsdk.model_utils import UUIDObj
|
|
|
|
|
|
class CommunityDocumentViewSet(viewsets.ModelViewSet):
|
|
queryset = CommunityDocument.objects.all()
|
|
serializer_class = CommunityDocumentSerializer
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def get_queryset(self):
|
|
return DocManager.QueryDocuments(
|
|
Keyword=self.request.query_params.get('keyword', ''),
|
|
DocSerieUUID=self.request.query_params.get('DocSerieUUID', ''),
|
|
)
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
qs = self.get_queryset()
|
|
data = []
|
|
for d in qs:
|
|
data.append({
|
|
'DocUUID': UUIDObj(d.DocUUID).str,
|
|
'DocSerieUUID': UUIDObj(d.DocSerieUUID).str if d.DocSerieUUID else None,
|
|
'DocTitle': d.DocTitle,
|
|
'DocCreateTime': d.DocCreateTime.isoformat() if d.DocCreateTime else None,
|
|
})
|
|
return Response({'code': 0, 'data': data})
|
|
|
|
@action(detail=False, methods=['post'])
|
|
def read_doc(self, request):
|
|
doc_uuid = request.data.get('DocUUID')
|
|
if not doc_uuid:
|
|
return Response({'code': 1, 'msg': '缺少DocUUID'}, status=400)
|
|
doc_bytes = UUIDObj(doc_uuid).bytes
|
|
if not doc_bytes:
|
|
return Response({'code': 1, 'msg': 'DocUUID格式错误'}, status=400)
|
|
doc = DocManager.GetDocument(doc_uuid)
|
|
if doc is None:
|
|
return Response({'code': 1, 'msg': '文档不存在'}, status=404)
|
|
return Response({
|
|
'code': 0,
|
|
'DocUUID': UUIDObj(doc.DocUUID).str,
|
|
'DocTitle': doc.DocTitle,
|
|
'DocContent': doc.DocContent or '',
|
|
'DocFormat': doc.DocFormat,
|
|
'DocCreateTime': doc.DocCreateTime.isoformat() if doc.DocCreateTime else None,
|
|
})
|
|
|
|
@action(detail=False, methods=['post'])
|
|
def add_doc(self, request):
|
|
ser = DocAddSerializer(data=request.data)
|
|
ser.IsValid(raise_exception=True)
|
|
data = ser.ValidatedData
|
|
user_uuid = request.user.UserUUID
|
|
|
|
serie_uuid_str = data.get('DocSerieUUID')
|
|
if serie_uuid_str:
|
|
if not UUIDObj(serie_uuid_str).bytes:
|
|
return Response({'code': 1, 'msg': 'DocSerieUUID格式错误'}, status=400)
|
|
if DocManager.GetSerie(serie_uuid_str) is None:
|
|
return Response({'code': 1, 'msg': '系列不存在'}, status=400)
|
|
|
|
doc = DocManager.AddDocument(
|
|
Title=data['DocTitle'],
|
|
Content='',
|
|
SerieUUID=serie_uuid_str,
|
|
Format=data.get('DocFormat', 'markdown'),
|
|
)
|
|
return Response({
|
|
'code': 0,
|
|
'msg': '添加成功',
|
|
'data': CommunityDocumentSerializer(doc).data,
|
|
}, status=201)
|
|
|
|
@action(detail=False, methods=['post'])
|
|
def modify_doc(self, request):
|
|
ser = DocModifySerializer(data=request.data)
|
|
ser.IsValid(raise_exception=True)
|
|
data = ser.ValidatedData
|
|
doc_uuid_str = data.get('DocUUID')
|
|
if not UUIDObj(doc_uuid_str).bytes:
|
|
return Response({'code': 1, 'msg': 'DocUUID格式错误'}, status=400)
|
|
ok, err = DocManager.ModifyDocument(doc_uuid_str, data)
|
|
if not ok:
|
|
return Response({'code': 1, 'msg': err or '修改失败'}, status=404)
|
|
return Response({'code': 0, 'msg': '修改成功'})
|
|
|
|
@action(detail=False, methods=['post'])
|
|
def delete_doc(self, request):
|
|
doc_uuid = request.data.get('DocUUID')
|
|
if not doc_uuid:
|
|
return Response({'code': 1, 'msg': '缺少DocUUID'}, status=400)
|
|
doc_bytes = UUIDObj(doc_uuid).bytes
|
|
if not doc_bytes:
|
|
return Response({'code': 1, 'msg': 'DocUUID格式错误'}, status=400)
|
|
doc = DocManager.GetDocument(doc_uuid)
|
|
if doc is None:
|
|
return Response({'code': 1, 'msg': '文档不存在'}, status=404)
|
|
ok, err = DocManager.DeleteDocument(doc_uuid)
|
|
if not ok:
|
|
return Response({'code': 1, 'msg': err or '删除失败'}, status=404)
|
|
return Response({'code': 0, 'msg': '删除成功'})
|
|
|
|
|
|
class CommunitySeriesViewSet(viewsets.ModelViewSet):
|
|
queryset = CommunitySeries.objects.all()
|
|
serializer_class = CommunitySeriesSerializer
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def get_queryset(self):
|
|
return DocManager.QuerySeries(Keyword=self.request.query_params.get('keyword', ''))
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
qs = self.get_queryset()
|
|
data = []
|
|
for s in qs:
|
|
data.append({
|
|
'DocSerieUUID': UUIDObj(s.DocSerieUUID).str,
|
|
'DocSerieName': s.DocSerieName,
|
|
'DocSerieCreateTime': s.DocSerieCreateTime.isoformat() if s.DocSerieCreateTime else None,
|
|
})
|
|
return Response({'code': 0, 'data': data})
|
|
|
|
@action(detail=False, methods=['post'])
|
|
def add_serie(self, request):
|
|
ser = SerieAddSerializer(data=request.data)
|
|
ser.IsValid(raise_exception=True)
|
|
data = ser.ValidatedData
|
|
user_uuid = request.user.UserUUID
|
|
|
|
if DocManager.SerieNameExists(data['DocSerieName']):
|
|
return Response({'code': 1, 'msg': '系列名称已存在'}, status=409)
|
|
|
|
serie = DocManager.AddSeries({
|
|
'DocSerieName': data['DocSerieName'],
|
|
'DocAuthorUserUUID': user_uuid,
|
|
})
|
|
return Response({
|
|
'code': 0,
|
|
'msg': '添加成功',
|
|
'data': CommunitySeriesSerializer(serie).data,
|
|
}, status=201)
|
|
|
|
@action(detail=False, methods=['post'])
|
|
def delete_serie(self, request):
|
|
ser = SerieDeleteSerializer(data=request.data)
|
|
ser.IsValid(raise_exception=True)
|
|
data = ser.ValidatedData
|
|
serie_uuid_str = data.get('DocSerieUUID')
|
|
if not UUIDObj(serie_uuid_str).bytes:
|
|
return Response({'code': 1, 'msg': 'DocSerieUUID格式错误'}, status=400)
|
|
if DocManager.GetSerie(serie_uuid_str) is None:
|
|
return Response({'code': 1, 'msg': '系列不存在'}, status=404)
|
|
if DocManager.SerieHasDocuments(serie_uuid_str):
|
|
return Response({'code': 1, 'msg': '该系列下还有文档,无法删除'}, status=400)
|
|
ok, err = DocManager.DeleteSerie(serie_uuid_str)
|
|
if not ok:
|
|
return Response({'code': 1, 'msg': err or '删除失败'}, status=404)
|
|
return Response({'code': 0, 'msg': '删除成功'})
|