MrDoc/app_doc/utils.py
2023-07-14 11:40:00 +08:00

115 lines
4.8 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.

from app_doc.models import Doc,Project
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError
from urllib.parse import urlparse
# 查找文档的下级文档
def find_doc_next(doc_id):
doc = Doc.objects.get(id=int(doc_id)) # 当前文档
# 获取文档的下级文档
subdoc = Doc.objects.filter(parent_doc=doc.id,top_doc=doc.top_doc, status=1)
# 如果存在子级文档,那么下一篇文档为第一篇子级文档
if subdoc.count() != 0:
next_doc = subdoc.order_by('sort')[0]
# 如果不存在子级文档,获取兄弟文档
else:
sibling_docs = Doc.objects.filter(parent_doc=doc.parent_doc,top_doc=doc.top_doc, status=1).order_by('sort','create_time')
sibling_list = [d.id for d in sibling_docs]
# 如果当前文档不是兄弟文档中的最后一个,那么下一篇文档是当前文档的下一个兄弟文档
if sibling_list.index(doc.id) != len(sibling_list) - 1:
next_id = sibling_list[sibling_list.index(doc.id) + 1]
next_doc = Doc.objects.get(id=next_id)
# 如果当前文档是兄弟文档中的最后一个,那么从上级文档中查找
else:
# 如果文档的上级文档为0说明文档没有上级文档
if doc.parent_doc == 0:
next_doc = None
else:
next_doc = find_doc_parent_sibling(doc.parent_doc)
return next_doc
# 查找文档的上级文档的同级文档(用于遍历获取文档的下一篇文档)
def find_doc_parent_sibling(doc_id):
doc = Doc.objects.get(id=int(doc_id)) # 当前文档
# 获取兄弟文档
sibling_docs = Doc.objects.filter(parent_doc=doc.parent_doc, top_doc=doc.top_doc, status=1).order_by('sort',
'create_time')
sibling_list = [d.id for d in sibling_docs]
# 如果当前文档不是兄弟文档中的最后一个,那么下一篇文档是当前文档的下一个兄弟文档
if sibling_list.index(doc.id) != len(sibling_list) - 1:
next_id = sibling_list[sibling_list.index(doc.id) + 1]
next_doc = Doc.objects.get(id=next_id)
# 如果当前文档是兄弟文档中的最后一个,那么从上级文档中查找
else:
# 如果文档的上级文档为0说明文档没有上级文档
if doc.parent_doc == 0:
next_doc = None
else:
next_doc = find_doc_parent_sibling(doc.parent_doc,sort)
return next_doc
# 查找文档的上一篇文档
def find_doc_previous(doc_id):
doc = Doc.objects.get(id=int(doc_id)) # 当前文档
# 获取文集的文档默认排序方式
sort = Project.objects.get(id=doc.top_doc)
# 获取文档的兄弟文档
# 获取兄弟文档
sibling_docs = Doc.objects.filter(parent_doc=doc.parent_doc, top_doc=doc.top_doc, status=1).order_by('sort',
'create_time')
sibling_list = [d.id for d in sibling_docs]
# 如果文档为兄弟文档的第一个,那么其上级文档即为上一篇文档
if sibling_list.index(doc.id) == 0:
# 如果其为顶级文档,那么没有上一篇文档
if doc.parent_doc == 0:
previous_doc = None
# 如果其为次级文档,那么其上一篇文档为上级文档
else:
previous_doc = Doc.objects.get(id=doc.parent_doc)
# 如果文档不为兄弟文档的第一个,从兄弟文档中查找
else:
previous_id = sibling_list[sibling_list.index(doc.id) - 1]
previous_doc = find_doc_sibling_sub(previous_id,sort)
return previous_doc
# 查找文档的最下级文档(用于遍历获取文档的上一篇文档)
def find_doc_sibling_sub(doc_id,sort):
doc = Doc.objects.get(id=int(doc_id)) # 当前文档
# 查询文档的下级文档
if sort == 1:
subdoc = Doc.objects.filter(parent_doc=doc.id, top_doc=doc.top_doc, status=1).order_by(
'-create_time')
else:
subdoc = Doc.objects.filter(parent_doc=doc.id, top_doc=doc.top_doc, status=1).order_by('sort','create_time')
subdoc_list = [d.id for d in subdoc]
# 如果文档没有下级文档,那么返回自己
if subdoc.count() == 0:
previous_doc = doc
# 如果文档存在下级文档,查找最靠后的下级文档
else:
previous_doc = find_doc_sibling_sub(subdoc_list[len(subdoc) - 1],sort)
return previous_doc
# 验证URL的有效性以及排除本地URL
def validate_url(url):
try:
validate = URLValidator()
validate(url)
parsed_url = urlparse(url)
if parsed_url.hostname in ['localhost', '127.0.0.1']:
return False
return url
except:
return False