Files
SMANAGE/gvsds/apps/doc/manager.py
T

159 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""模块:doc 服务层
社区文档与系列的统一操作入口——供 GERP 文档视图与 doc app 自身复用,
消除视图层裸 ORM。所有方法遵循帕斯卡命名法。
"""
import uuid
from gvsdsdk.model_utils import UUIDObj
from gvsds.apps.doc.models import CommunityDocument, CommunitySeries
class DocManager:
"""文档/系列管理器——社区文档的增删改查与系列管理"""
# ========== 文档 ==========
@staticmethod
def ListDocuments(Keyword=''):
"""获取文档列表(不含 DocContent 全文,仅标题与创建时间)"""
qs = CommunityDocument.objects.all()
if Keyword:
qs = qs.filter(DocTitle__icontains=Keyword)
data = []
for d in qs:
data.append({
'DocUUID': UUIDObj(d.DocUUID).str,
'DocTitle': d.DocTitle,
'DocCreateTime': d.DocCreateTime.isoformat() if d.DocCreateTime else None,
})
return data
@staticmethod
def GetDocument(DocUUID):
"""获取文档实例(不存在返回 None)"""
try:
return CommunityDocument.objects.get(DocUUID=UUIDObj(DocUUID).bytes)
except (CommunityDocument.DoesNotExist, ValueError, AttributeError):
return None
@staticmethod
def AddDocument(Title, Content='', SerieUUID=None):
"""新建文档(可选绑定系列)"""
create_data = {
'DocUUID': uuid.uuid4().bytes,
'DocTitle': Title,
'DocContent': Content,
}
if SerieUUID:
serie = DocManager.GetSerie(SerieUUID)
if serie is not None:
# DocSerieUUID 为 ForeignKey:传实例
create_data['DocSerieUUID'] = serie
return CommunityDocument.objects.create(**create_data)
@staticmethod
def ModifyDocument(DocUUID, Data):
"""修改文档标题与内容
Returns:
(成功?, 错误消息 or None)
"""
doc = DocManager.GetDocument(DocUUID)
if doc is None:
return False, '文档不存在'
for field in ('DocTitle', 'DocContent'):
if field in Data:
setattr(doc, field, Data[field])
doc.save()
return True, None
@staticmethod
def DeleteDocument(DocUUID):
"""删除文档
Returns:
(成功?, 错误消息 or None)
"""
doc = DocManager.GetDocument(DocUUID)
if doc is None:
return False, '文档不存在'
doc.delete()
return True, None
# ========== 系列 ==========
@staticmethod
def ListSeries():
"""获取系列列表"""
data = []
for s in CommunitySeries.objects.all():
data.append({
'SerieUUID': UUIDObj(s.DocSerieUUID).str,
'SerieName': s.DocSerieName,
})
return data
@staticmethod
def AddSeries(Data):
"""新建系列(Data 为已验证字段 dict)"""
return CommunitySeries.objects.create(
DocSerieUUID=uuid.uuid4().bytes,
**Data,
)
@staticmethod
def ModifySerie(DocSerieUUID, Data):
"""修改系列名称
Returns:
(成功?, 错误消息 or None)
"""
try:
serie = CommunitySeries.objects.get(DocSerieUUID=UUIDObj(DocSerieUUID).bytes)
except (CommunitySeries.DoesNotExist, ValueError, AttributeError):
return False, '系列不存在'
for field in ('DocSerieName',):
if field in Data:
setattr(serie, field, Data[field])
serie.save()
return True, None
@staticmethod
def DeleteSerie(DocSerieUUID):
"""删除系列
Returns:
(成功?, 错误消息 or None)
"""
try:
serie = CommunitySeries.objects.get(DocSerieUUID=UUIDObj(DocSerieUUID).bytes)
except (CommunitySeries.DoesNotExist, ValueError, AttributeError):
return False, '系列不存在'
serie.delete()
return True, None
# ========== 系列附加查询(供视图收敛裸 ORM) ==========
@staticmethod
def GetSerie(DocSerieUUID):
"""获取系列实例(不存在返回 None)"""
try:
return CommunitySeries.objects.get(DocSerieUUID=UUIDObj(DocSerieUUID).bytes)
except (CommunitySeries.DoesNotExist, ValueError, AttributeError):
return None
@staticmethod
def SerieNameExists(DocSerieName):
"""判断系列名是否已存在"""
return CommunitySeries.objects.filter(DocSerieName=DocSerieName).exists()
@staticmethod
def SerieHasDocuments(DocSerieUUID):
"""判断系列下是否还有文档(防删除)"""
serie = DocManager.GetSerie(DocSerieUUID)
if serie is None:
return False
return CommunityDocument.objects.filter(DocSerieUUID=serie).exists()