159 lines
4.9 KiB
Python
159 lines
4.9 KiB
Python
"""模块: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()
|