api-datamanager/Modules/File/FileImpl.py

322 lines
13 KiB
Python
Raw Normal View History

2022-08-02 15:53:13 +08:00
import os
2022-08-08 21:45:13 +08:00
import shutil
2022-08-08 20:30:08 +08:00
import sys
import zipfile
2022-08-02 15:53:13 +08:00
2022-07-26 17:02:06 +08:00
class FileObjImpl(object):
"""对象文件创建"""
@staticmethod
2022-08-02 15:53:13 +08:00
def get_project_abs_path(**kwargs):
file_abs_path = os.path.abspath(os.path.dirname(__file__))
name = kwargs['name']
2022-08-02 16:17:15 +08:00
pdf_relative_path = '/static/{}'.format(name)
pdf_abs_path = os.path.abspath(file_abs_path + pdf_relative_path)
2022-08-02 15:53:13 +08:00
return pdf_abs_path
2022-08-09 16:53:08 +08:00
@staticmethod
def write_obj_file(**kwargs):
"""写入obj文件"""
path = kwargs['obj_path']
class_data = kwargs['class_data']
2022-07-26 17:02:06 +08:00
2022-08-09 16:53:08 +08:00
def hanlde_field(**args):
"""处理每个字段"""
2022-08-10 15:15:58 +08:00
sub_data = args['sub_data']
# 属性
field_name = sub_data['attribute']
# 类型
types = sub_data['type']
# 校验类型
verify = sub_data['verify']
if verify == 'type':
if len(types) != 1:
types = 'type={}'.format(types)
else:
types = 'type={}'.format(types[0])
elif verify == 'instance_list':
types = 'instance_list={}'.format(types[0])
else:
types = 'func=Validate.{}'.format(types[0])
# 默认
if 'default' in sub_data:
default = 'default={}'.format(sub_data['default'])
else:
default = ''
# 补充校验
if 'complement' in sub_data:
# 字符长度
if 'length' in sub_data['complement']:
length = 'length={}, '.format(sub_data['complement']['length'])
else:
length = ''
# 数据范围
if 'in_list' in sub_data['complement']:
in_list = 'in_list={}, '.format(sub_data['complement']['in_list'])
else:
in_list = ''
else:
length = ''
in_list = ''
temp = f"\t{field_name} = ValidateAttr(field='{field_name}', {length}{default}{in_list}{types})"
f.write(temp)
f.write('\n')
2022-07-26 17:02:06 +08:00
2022-08-09 16:53:08 +08:00
with open(path, 'w', encoding='utf-8') as f:
2022-07-26 17:02:06 +08:00
f.write('from Utils.ObjUtil import SpecObject')
f.write('\n')
f.write('from Utils.ValidateUtil import ValidateAttr, Validate')
f.write('\n')
2022-07-29 10:29:37 +08:00
2022-08-09 16:53:08 +08:00
# 遍历类数据
for item in class_data:
class_name = item['class_name']
2022-07-26 22:40:51 +08:00
f.write('\n')
2022-07-26 17:02:06 +08:00
f.write('\n')
2022-08-09 16:53:08 +08:00
f.write('class {}(SpecObject):'.format(class_name))
2022-07-26 17:02:06 +08:00
f.write('\n')
2022-08-09 16:53:08 +08:00
mapping_data = dict()
for sub in item['parameter']:
mapping_data[sub['attribute']] = sub['chinese']
hanlde_field(sub_data=sub)
2022-08-10 15:15:58 +08:00
temp_fields = '\tfields_map = {}'.format(str(mapping_data))
2022-07-26 22:40:51 +08:00
f.write('\n')
2022-07-26 17:02:06 +08:00
f.write(temp_fields)
f.write('\n')
2022-08-10 15:15:58 +08:00
@staticmethod
def write_impl_file(**kwargs):
"""写入impl文件"""
path = kwargs['impl_path']
package_data = kwargs['package_data']
package_name = package_data['package_name']
obj_name = package_data['obj_name']
impl_name = package_data['impl_name']
impl_range = package_data['impl_range']
obj_list = list()
for obj in package_data['class_data']:
obj_list.append(obj['class_name'])
obj = ', '.join(obj_list)
with open(path, 'w', encoding='utf-8') as f:
f.write('from DBHelper.MongoHelperInstance import DB_TEST')
f.write('\n')
f.write('from Modules.{package_name}.{obj_name} import {obj}'.format(package_name=package_name, obj_name=obj_name, obj=obj))
f.write('\n')
f.write('\n')
f.write('\n')
f.write('class {}(object):'.format(impl_name))
f.write('\n')
if '增加' in impl_range:
f.write('\n')
f.write('\t@staticmethod')
f.write('\n')
f.write('\tdef new_data(**kwargs):')
f.write('\n')
f.write('\t\tpass')
f.write('\n')
if '删除' in impl_range:
f.write('\n')
f.write('\t@staticmethod')
f.write('\n')
f.write('\tdef delete_data(**kwargs):')
f.write('\n')
f.write('\t\tpass')
f.write('\n')
if '修改' in impl_range:
f.write('\n')
f.write('\t@staticmethod')
f.write('\n')
f.write('\tdef update_data(**kwargs):')
f.write('\n')
f.write('\t\tpass')
f.write('\n')
if '查询' in impl_range:
f.write('\n')
f.write('\t@staticmethod')
f.write('\n')
f.write('\tdef search_data(**kwargs):')
f.write('\n')
f.write('\t\tpass')
f.write('\n')
@staticmethod
def write_route_file(**kwargs):
"""写入route文件"""
path = kwargs['route_path']
package_data = kwargs['package_data']
package_name = package_data['package_name']
impl_name = package_data['impl_name']
route_prefix = package_data['route_prefix']
impl_range = package_data['impl_range']
with open(path, 'w', encoding='utf-8') as f:
f.write('from flask import Blueprint, request')
f.write('\n')
f.write('from Utils.ErrorUtil import APIReturnError')
f.write('\n')
f.write('from Utils.RouteUtil import RouteParamsCheck')
f.write('\n')
f.write('from Modules.{package_name}.{impl_name} import {impl_name}'.format(package_name=package_name, impl_name=impl_name))
f.write('\n')
f.write('\n')
f.write('{route_prefix}_route = Blueprint("{route_prefix}", __name__)'.format(route_prefix=route_prefix))
f.write('\n')
if '增加' in impl_range:
f.write('\n')
f.write('\n')
f.write('@{route_prefix}_route.route("/new_data", methods=["POST"])'.format(route_prefix=route_prefix))
f.write('\n')
f.write('def new_data_route():')
f.write('\n')
f.write('\ttry:')
f.write('\n')
f.write('\t\tRouteParamsCheck(req=request.json, params=[]).required()')
f.write('\n')
f.write('\t\tdata = request.json')
f.write('\n')
f.write('\t\timpl = {}()'.format(impl_name))
f.write('\n')
f.write('\t\tresult = impl.new_data(data=data)')
f.write('\n')
f.write('\t\treturn {"info": "新增数据", "result": result}, 200')
f.write('\n')
f.write('\texcept APIReturnError as e:')
f.write('\n')
f.write('\t\treturn {"info": e.__str__()}, e.status_code')
f.write('\n')
if '删除' in impl_range:
f.write('\n')
f.write('\n')
f.write('@{route_prefix}_route.route("/delete_data", methods=["GET"])'.format(route_prefix=route_prefix))
f.write('\n')
f.write('def delete_data_route():')
f.write('\n')
f.write('\ttry:')
f.write('\n')
f.write('\t\tRouteParamsCheck(req=request.args, params=[]).required()')
f.write('\n')
f.write('\t\tdata = request.args')
f.write('\n')
f.write('\t\timpl = {}()'.format(impl_name))
f.write('\n')
f.write('\t\tresult = impl.delete_data(data=data)')
f.write('\n')
f.write('\t\treturn {"info": "删除数据", "result": result}, 200')
f.write('\n')
f.write('\texcept APIReturnError as e:')
f.write('\n')
f.write('\t\treturn {"info": e.__str__()}, e.status_code')
f.write('\n')
if '修改' in impl_range:
f.write('\n')
f.write('\n')
f.write('@{route_prefix}_route.route("/update_data", methods=["POST"])'.format(route_prefix=route_prefix))
f.write('\n')
f.write('def update_data_route():')
f.write('\n')
f.write('\ttry:')
f.write('\n')
f.write('\t\tRouteParamsCheck(req=request.json, params=[]).required()')
f.write('\n')
f.write('\t\tdata = request.json')
f.write('\n')
f.write('\t\timpl = {}()'.format(impl_name))
f.write('\n')
f.write('\t\tresult = impl.update_data(data=data)')
f.write('\n')
f.write('\t\treturn {"info": "修改数据", "result": result}, 200')
f.write('\n')
f.write('\texcept APIReturnError as e:')
f.write('\n')
f.write('\t\treturn {"info": e.__str__()}, e.status_code')
f.write('\n')
if '查询' in impl_range:
f.write('\n')
f.write('\n')
f.write('@{route_prefix}_route.route("/search_data", methods=["POST"])'.format(route_prefix=route_prefix))
f.write('\n')
f.write('def search_data_route():')
f.write('\n')
f.write('\ttry:')
f.write('\n')
f.write('\t\tRouteParamsCheck(req=request.json, params=[]).required()')
f.write('\n')
f.write('\t\tdata = request.json')
f.write('\n')
f.write('\t\timpl = {}()'.format(impl_name))
f.write('\n')
f.write('\t\tresult = impl.search_data(data=data)')
f.write('\n')
f.write('\t\treturn {"info": "查询数据", "result": result}, 200')
f.write('\n')
f.write('\texcept APIReturnError as e:')
f.write('\n')
f.write('\t\treturn {"info": e.__str__()}, e.status_code')
f.write('\n')
2022-08-09 16:53:08 +08:00
def create_package(self, **kwargs):
"""根据包名创建包"""
package_data = kwargs['package_data']
2022-08-08 20:30:08 +08:00
package_name = package_data['package_name']
route_name = package_data['route_name']
obj_name = package_data['obj_name']
impl_name = package_data['impl_name']
2022-08-09 16:53:08 +08:00
class_data = package_data['class_data']
path = self.get_project_abs_path(name=package_name)
if os.path.exists(path):
return False
os.makedirs(path)
init_path = os.path.join(path, '__init__.py')
route_path = os.path.join(path, r'{}.py'.format(route_name))
obj_path = os.path.join(path, r'{}.py'.format(obj_name))
impl_path = os.path.join(path, r'{}.py'.format(impl_name))
f = open(init_path, 'w')
f.close()
self.write_obj_file(obj_path=obj_path, class_data=class_data)
2022-08-10 15:15:58 +08:00
self.write_impl_file(impl_path=impl_path, package_data=package_data)
self.write_route_file(route_path=route_path, package_data=package_data)
2022-08-09 16:53:08 +08:00
def new_file_package(self, **kwargs):
"""新建package"""
package_data = kwargs['data']
package_name = package_data['package_name']
2022-08-08 20:30:08 +08:00
# 创建包
2022-08-10 15:15:58 +08:00
self.create_package(package_data=package_data)
2022-08-08 21:45:13 +08:00
package_path = self.get_project_abs_path(name=package_name)
2022-08-08 20:30:08 +08:00
return package_path
@staticmethod
2022-08-09 16:53:08 +08:00
def write_file_to_zip(**kwargs):
2022-08-08 20:30:08 +08:00
"""文件夹转为zip文件"""
src_dir = kwargs['src_dir']
zip_name = src_dir + '.zip'
z = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED)
for dirpath, dirnames, filenames in os.walk(src_dir):
fpath = dirpath.replace(src_dir, '')
fpath = fpath and fpath + os.sep or ''
for filename in filenames:
z.write(os.path.join(dirpath, filename), fpath + filename)
z.close()
2022-08-08 21:45:13 +08:00
def return_file_data(self, **kwargs):
2022-08-08 20:30:08 +08:00
"""返回文件数据流"""
2022-08-08 21:45:13 +08:00
package_name = '{}.zip'.format(kwargs['package_name'])
zip_path = self.get_project_abs_path(name=package_name)
2022-08-08 20:30:08 +08:00
zip_name = open(zip_path, 'rb').read()
2022-08-08 21:45:13 +08:00
return zip_name
def delete_all_file(self):
"""删除临时文件夹"""
file_path = self.get_project_abs_path(name='')
shutil.rmtree(file_path)