''' Author: your name Date: 2021-07-12 11:14:48 LastEditTime: 2021-07-12 11:29:36 LastEditors: Please set LastEditors Description: In User Settings Edit FilePath: \evm-store\tools\build_out\controllers\appi.py ''' import os import re import json import shutil from urllib import parse from datetime import datetime from application.app import db, config from models.annex import AnnexModel from models.app import AppModel from models.user import UserModel from models.package import PackageModel from webcreator.log import logger from webcreator import utils from webcreator.utils.epk import EpkApp from webcreator.response import ResponseCode class BuildAppResource(object): def __init__(self): super().__init__() def post(self, params, jwt={}): logger.info(params) user = UserModel.query.filter(UserModel.id==jwt['id']) if not user: return False, ResponseCode.USER_NOT_EXISTS if params.get("access_key"): params.pop("access_key") params.update({ 'create_by': user, 'create_at': datetime.now(), 'update_by': user, 'update_at': datetime.now(), }) app = AppModel(**params) db.session.add(app) db.session.commit() dir_format = "{}-{}-{}".format(app.app_name, app.app_version, datetime.now().strftime("%Y%m%d%H%M%S")) upload_dir = os.sep.join([config.UPLOAD_ROOT_DIR, "evueapps"]) target_dir = os.sep.join([upload_dir, user.account, dir_format]) dest_dir = os.sep.join([target_dir, "src"]) if not os.path.exists(dest_dir): os.makedirs(dest_dir) for target_file in params.get('files'): filename = os.path.basename(target_file) name, suffix = os.path.splitext(filename) name = re.sub(r"_\d{14}$", "", name) dst_file = os.path.normpath(os.sep.join([dest_dir, name + suffix])) shutil.copy(os.path.normpath(target_file), dst_file) res = AnnexModel(app=app, title=filename, path=dst_file.replace(config.UPLOAD_ROOT_DIR, ""), size=os.path.getsize(dst_file), create_by=user, create_at=datetime.now(), update_by=user, update_at=datetime.now()) db.session.add(res) db.session.flush() db.session.commit() # 打包成EPK文件 app_info = {} params = { 'appName': app.app_name, 'appDir': dest_dir, 'appVersion': app.app_version, 'output': target_dir } if user.role == "administrator" or user.role == "community": params['algorithm'] = "h" epk = EpkApp(**params) app_info = epk.pack() app_info['md5'] = str(app_info['md5']) # 更新数据库对应文件路径 # 将文件拷贝过去后,需要重新更新数据库文件记录 epk_path = os.sep.join([target_dir.replace(config.UPLOAD_ROOT_DIR, ""), "{}.epk".format(app.app_name)]).replace('\\', '/') result = PackageModel.query.filter(PackageModel.app==app.id).one_or_none() if result: result.app_path = epk_path result.app_info = app_info result.update_by = user result.update_at = datetime.now() db.session.commit() else: result = PackageModel(app=app.id, file_path=epk_path, package_info=app_info, app_version=params.get("app_version"), source=2, create_by=user, create_at=datetime.now(), update_by=user, update_at=datetime.now()) db.session.add(result) db.session.commit() with open(os.sep.join([target_dir, "epk.json"]), "w") as f: json.dump(app.to_dict(), f) return { 'app_name': app.app_name, 'app_file': "{}.epk".format(app.app_name), 'app_url': parse.urljoin(config['UPLOAD_SERVER'], epk_path) }, ResponseCode.HTTP_SUCCESS buildAppResource = BuildAppResource()