# coding:utf-8
from django.shortcuts import render,redirect
from django.http.response import JsonResponse,Http404,HttpResponseNotAllowed,HttpResponse
from django.http import QueryDict
from django.http import HttpResponseForbidden
from django.contrib.auth.decorators import login_required # 登录需求装饰器
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods,require_GET,require_POST # 视图请求方法装饰器
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage,InvalidPage # 后端分页
from django.core.exceptions import PermissionDenied,ObjectDoesNotExist
from django.core.serializers import serialize
from app_doc.models import Project,Doc,DocTemp
from django.contrib.auth.models import User
from rest_framework.views import APIView # 视图
from rest_framework.response import Response # 响应
from rest_framework.pagination import PageNumberPagination # 分页
from rest_framework.authentication import SessionAuthentication # 认证
from django.db.models import Q
from django.db import transaction
from django.utils.html import strip_tags
from django.utils.translation import gettext_lazy as _
from loguru import logger
from app_api.serializers_app import *
from app_doc.report_utils import *
from app_admin.models import UserOptions,SysSetting
from app_admin.decorators import check_headers,allow_report_file
from app_api.auth_app import AppAuth,AppMustAuth # 自定义认证
import datetime
import traceback
import re
import json
import random
import os.path
import base64
import hashlib
import markdown
# HTML转义
def jsonXssFilter(data):
payloads = {
'\'':''',
'"':'"',
'<':'<',
'>':'>'
}
if type(data) == dict:
new = {}
for key,values in data.items():
new[key] = jsonXssFilter(values)
elif type(data) == list:
new = []
for i in data:
new.append(jsonXssFilter(i))
elif type(data) == int or type(data) == float:
new = data
elif type(data) == str:
new = data
for key,value in payloads.items():
new = new.replace(key,value)
elif type(data) ==bytes:
new = data
else:
# print('>>> unknown type:')
# print(type(data))
new = data
return new
def html_filter(data):
if len(data) == 0:
return ""
payloads = {
'\'':''',
'"':'"',
'<':'<',
'>':'>'
}
new = data
for key, value in payloads.items():
new = new.replace(key, value)
print(new)
return new
# 替换前端传来的非法字符
def validateTitle(title):
rstr = r"[\/\\\:\*\?\"\<\>\|\[\]]" # '/ \ : * ? " < > |'
new_title = re.sub(rstr, "_", title) # 替换为下划线
return new_title
# 文档文本生成摘要(不带markdown标记和html标签)
def remove_markdown_tag(docs):
for doc in docs:
try:
if doc.editor_mode == 3: # 富文本文档
doc.content = strip_tags(doc.content)[:201]
elif doc.editor_mode == 4:
doc.pre_content = "此为表格文档,进入文档查看详细内容"
else: # 其他文档
doc.pre_content = strip_tags(markdown.markdown(doc.pre_content))[:201]
except Exception as e:
doc.pre_content = doc.pre_content[:201]
# 获取文集的文档目录
def get_pro_toc(pro_id):
# try:
# project = Project.objects.get(id=pro_id)
# pro_toc = ProjectToc.objects.get(project=project)
# doc_list = json.loads(pro_toc.value)
# print("使用缓存")
# except:
# print("重新生成")
# 查询存在上级文档的文档
parent_id_list = Doc.objects.filter(
top_doc=pro_id,
status=1
).exclude(parent_doc=0).values_list('parent_doc',flat=True)
# 获取存在上级文档的上级文档ID
# print(parent_id_list)
doc_list = []
n = 0
# 获取一级文档
top_docs = Doc.objects.filter(top_doc=pro_id, parent_doc=0, status=1).values('id', 'name','open_children','editor_mode').order_by('sort')
# 遍历一级文档
for doc in top_docs:
top_item = {
'id': doc['id'],
'name': doc['name'],
'open_children':doc['open_children'],
'editor_mode':doc['editor_mode']
# 'spread': True,
# 'level': 1
}
# 如果一级文档存在下级文档,查询其二级文档
if doc['id'] in parent_id_list:
# 获取二级文档
sec_docs = Doc.objects.filter(
top_doc=pro_id,
parent_doc=doc['id'],
status=1
).values('id', 'name','open_children','editor_mode').order_by('sort')
top_item['children'] = []
for doc in sec_docs:
sec_item = {
'id': doc['id'],
'name': doc['name'],
'open_children': doc['open_children'],
'editor_mode': doc['editor_mode']
# 'level': 2
}
# 如果二级文档存在下级文档,查询第三级文档
if doc['id'] in parent_id_list:
# 获取三级文档
thr_docs = Doc.objects.filter(
top_doc=pro_id,
parent_doc=doc['id'],
status=1
).values('id','name','editor_mode').order_by('sort')
sec_item['children'] = []
for doc in thr_docs:
item = {
'id': doc['id'],
'name': doc['name'],
'editor_mode': doc['editor_mode']
# 'level': 3
}
sec_item['children'].append(item)
n += 1
top_item['children'].append(sec_item)
n += 1
else:
top_item['children'].append(sec_item)
n += 1
doc_list.append(top_item)
n += 1
# 如果一级文档没有下级文档,直接保存
else:
doc_list.append(top_item)
n += 1
# 将文集的大纲目录写入数据库
# ProjectToc.objects.create(
# project = project,
# value = json.dumps(doc_list)
# )
# print(doc_list,n)
# if n > 999:
# return ([],n)
# else:
return (doc_list,n)
# 文集列表(首页)
@logger.catch()
def project_list(request):
kw = request.GET.get('kw','') # 搜索词
sort = request.GET.get('sort','') # 排序,0表示按时间升序排序,1表示按时间降序排序,''表示按后台配置排序,默认为''
role = request.GET.get('role',-1) # 筛选文集权限,默认为显示所有可显示的文集
# 是否排序
if sort in [0,'0']:
sort_str = ''
elif sort == '':
try:
index_project_sort = SysSetting.objects.get(name='index_project_sort')
if index_project_sort.value == '-1':
sort_str = '-'
else:
sort_str = ''
except:
sort_str = ''
else:
sort_str = '-'
# 是否搜索
if kw == '':
is_kw = False
else:
is_kw = True
# 是否认证
if request.user.is_authenticated:
is_auth = True
else:
is_auth = False
# 是否筛选
if role in ['',-1,'-1']:
is_role = False
role_list = [0,3]
else:
is_role = True
# 没有搜索 and 认证用户 and 没有筛选
if (is_kw is False) and (is_auth) and (is_role is False):
colla_list = [i.project.id for i in ProjectCollaborator.objects.filter(user=request.user)] # 用户的协作文集列表


财云量化
- 粉丝: 1w+
- 资源: 1238
最新资源
- Java-网络相册.zip
- 基于PI控制的交流异步电机SVPWM控制策略:详解说明文件与仿真分析,交流异步电机SVPWM中的PI控制策略:说明、仿真及应用探究,交流异步电机svpwm采用pi控制 有说明文件和仿真 ,核心关键词:
- 教育领域高中地理高清思维导图:提升学习效率和地理理解力的有效工具
- 2010-2022年我国30余省【低温冷冻和雪灾受灾+绝收面积】(千公顷)-Excel文件
- LCL三相并网逆变器:基于准PR比例谐振控制的仿真与详细说明文件,基于仿真与说明文件的LCL三相并网逆变器准PR比例谐振控制策略解析,LCL三相并网逆变器,有仿真有说明文件文件 准PR比例谐振控制
- 基于Vue2+elementUI
- 2010-2022年我国30余省【风雹灾害受灾+绝收面积】(千公顷)-Excel文件
- LCC-S无线电能传输技术:高效移相控制输出电压的SS结构与拓扑应用,LCC-S无线电能传输:通过Pi移相控制实现高效输出电压,SS结构兼容多种拓扑,效果卓越,LCC-S无线电能传输pi移相控制输出电
- SpeedyBee快蜂手机APP调参软件
- 2010-2022年我国30余省【旱灾受灾+绝收面积】(千公顷)-Excel文件
- MATLAB程序:基于SVR和LSTM的预测模型构建与数据特征分析方法研究,MATLAB程序:深度探讨SVR与LSTM预测技术及数据特征分析方法,MATLAB程序:SVR和LSTM进行预测,还有数据得
- 基于Dijkstra算法移动机器人路径规划详解:附代码注释与原理阐述,基于Dijkstra算法移动机器人路径规划详解:附代码注释与原理阐述,基于Dijkstra算法移动机器人路径规划 内涵详细的代码注
- Matlab弹道仿真软件实时演示弹丸轨迹与姿态信息,源码及说明书全解析,Matlab弹道仿真软件:实时显示弹道轨迹、速度、姿态信息,结合柔格里半经验公式进行滚转仿真,源码与说明书齐全,Matlab弹道
- c++中bitset的常见用法.docx
- 基于Matlab的覆盖路径规划方法在FDM 3D打印机中的应用:理论速度提升26.57%,实验验证效率提升26.37%-详细解析与操作指南,Matlab网络覆盖路径规划方法在FDM 3D打印机上的应
- 蚁群算法融合动态窗口法的路径规划算法研究:多动态障碍物的解决方案,蚁群算法结合动态窗口法的路径规划:多动态障碍物环境中的优化策略,蚁群算法融合动态窗口法路径规划算法 多动态障碍物 ,蚁群算法;动态窗口
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


