99 lines
4.4 KiB
Python
99 lines
4.4 KiB
Python
from pathlib import Path
|
||
from docxtpl import DocxTemplate
|
||
from docx.table import Table
|
||
from utils.chen_response import ChenResponse
|
||
from typing import Any
|
||
from apps.project.models import Project
|
||
from utils.path_utils import project_path
|
||
|
||
def merge_all_cell(table: Table) -> None:
|
||
"""生成需求研总对照表工具:逐个找第二列和第三列单元格的text,如果一致则合并"""
|
||
col_list = [table.columns[1], table.columns[2]]
|
||
# 合并第二列相同的单元格
|
||
for col_right in col_list:
|
||
index = 0
|
||
temp_text = ""
|
||
for cell in col_right.cells:
|
||
if index == 0:
|
||
temp_text = cell.text
|
||
else:
|
||
if cell.text == temp_text:
|
||
if cell.text == '': # 不知道什么原因必须这样判断下
|
||
cell.text = '/'
|
||
text_temp = cell.text
|
||
ce = cell.merge(col_right.cells[index - 1])
|
||
ce.text = text_temp
|
||
else:
|
||
temp_text = cell.text
|
||
index += 1
|
||
|
||
def create_sm_docx(template_name: str, context: dict, id: int) -> ChenResponse:
|
||
"""生成最终说明文档工具函数"""
|
||
input_path = Path.cwd() / 'media' / project_path(id) / 'form_template' / 'sm' / template_name
|
||
doc = DocxTemplate(input_path)
|
||
doc.render(context, autoescape=True)
|
||
try:
|
||
doc.save(Path.cwd() / "media" / project_path(id) / "output_dir/sm" / template_name)
|
||
return ChenResponse(status=200, code=200, message="文档生成成功!")
|
||
except PermissionError as e:
|
||
return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e))
|
||
|
||
def create_dg_docx(template_name: str, context: dict, id: int) -> ChenResponse:
|
||
"""生成最终大纲文档工具函数"""
|
||
input_path = Path.cwd() / 'media' / project_path(id) / 'form_template' / 'dg' / template_name
|
||
doc = DocxTemplate(input_path)
|
||
doc.render(context, autoescape=True)
|
||
try:
|
||
doc.save(Path.cwd() / "media" / project_path(id) / "output_dir" / template_name)
|
||
return ChenResponse(status=200, code=200, message="文档生成成功!")
|
||
except PermissionError as e:
|
||
return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e))
|
||
|
||
def create_bg_docx(template_name: str, context: dict, id: int) -> ChenResponse:
|
||
"""生成最终报告文档工具函数"""
|
||
input_path = Path.cwd() / 'media' / project_path(id) / 'form_template' / 'bg' / template_name
|
||
doc = DocxTemplate(input_path)
|
||
doc.render(context, autoescape=True)
|
||
try:
|
||
doc.save(Path.cwd() / "media" / project_path(id) / "output_dir/bg" / template_name)
|
||
return ChenResponse(status=200, code=200, message="文档生成成功!")
|
||
except PermissionError as e:
|
||
return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e))
|
||
|
||
def create_wtd_docx(template_name: str, context: dict, id: int) -> ChenResponse:
|
||
"""生成最终问题单文档工具函数"""
|
||
input_path = Path.cwd() / 'media' / project_path(id) / 'form_template' / 'wtd' / template_name
|
||
doc = DocxTemplate(input_path)
|
||
doc.render(context, autoescape=True)
|
||
try:
|
||
doc.save(Path.cwd() / "media" / project_path(id) / "output_dir/wtd" / template_name)
|
||
return ChenResponse(status=200, code=200, message="文档生成成功!")
|
||
except PermissionError as e:
|
||
return ChenResponse(status=400, code=400, message="模版文件已打开,请关闭后再试,{0}".format(e))
|
||
|
||
def get_round1_problem(project: Project) -> Any:
|
||
"""
|
||
从项目返回第一轮问题单
|
||
:param project: Project项目Model对象
|
||
:return: 问题单的列表
|
||
"""
|
||
all_problem_qs = project.projField.all()
|
||
# 遍历每个问题,找出第一轮的问题
|
||
problem_set = set()
|
||
for problem in all_problem_qs:
|
||
flag = False
|
||
for case in problem.case.all():
|
||
if case.round.key == '0':
|
||
flag = True
|
||
if flag:
|
||
problem_set.add(problem)
|
||
return list(problem_set)
|
||
|
||
def delete_dir_files(path: Path) -> Any:
|
||
"""传入一个Path对象,如果是文件夹则删除里面所有的文件(不删除文件夹)"""
|
||
if path.is_dir():
|
||
for file in path.iterdir():
|
||
if file.is_file():
|
||
file.unlink()
|
||
|