package.py 7.82 KB
Newer Older
1 2 3
'''
Author: your name
Date: 2021-06-30 18:03:41
4
LastEditTime: 2021-07-22 16:09:28
5 6 7 8 9 10 11 12 13 14
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\package.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-

import os
import re
import shutil
15
from pathlib import Path
wanli's avatar
wanli committed
16
from datetime import datetime
17 18 19 20
from application.app import db, config
from models.annex import AnnexModel
from models.app import AppModel
from models.user import UserModel
wanli's avatar
wanli committed
21
from models.package import PackageModel
22
from webcreator.utils.epk import EpkApp
wanli's avatar
wanli committed
23
from webcreator.log import logger
24
from webcreator.response import ResponseCode
wanli's avatar
wanli committed
25 26 27 28 29

class PackageResource(object):
    def __init__(self):
        super().__init__()

30
    def get(self, uuid, jwt):
wanli's avatar
wanli committed
31
        # handle business
32 33 34
        filters = [PackageModel.is_delete==False, PackageModel.uuid==uuid]
        result = PackageModel.query.filter(*filters).first()
        if result:
35 36
            return result, ResponseCode.HTTP_SUCCESS
        return None, ResponseCode.HTTP_NOT_FOUND
wanli's avatar
wanli committed
37

38
    def getList(self, params, jwt):
wanli's avatar
wanli committed
39 40
        # handle business
        logger.warn(params)
41 42 43 44
        # filters = [PackageModel.is_delete==False]
        # result = PackageModel.query.filter(*filters).order_by(PackageModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
        # if result:
        #     return result, ResponseCode.HTTP_SUCCESS
wanli's avatar
wanli committed
45

46
        user = UserModel.query.filter(UserModel.uuid==jwt.get('uuid')).one_or_none()
47 48 49 50
        if not user:
            return False, ResponseCode.USER_NOT_EXISTS

        temp = {}
51 52
        if user.role == 1:
            temp.update({ "is_delete": False })
53 54 55
        else:
            temp.update({ "create_by": user.id, "is_delete": False })

56
        if "scope" in params and params.get("scope") == "list":
57 58 59 60
            result = PackageModel.query.filter_by(**temp).order_by(PackageModel.create_at.desc())
            temp = []
            for item in result:
                temp.append({ "name": item.app.app_name, "uuid": str(item.uuid) })
61 62 63 64
            if len(temp):
                return temp, ResponseCode.HTTP_SUCCESS
            else:
                return None, ResponseCode.HTTP_NOT_FOUND
65

66
        temp = [PackageModel.is_delete==False, PackageModel.create_by==user.id]
67 68 69 70 71 72 73
        if params.get("app") and isinstance(params.get("app"), str):
            app = AppModel.query.filter(AppModel.uuid==params.get("app")).one_or_none()
            if app:
                params.update({ "app": app.id })
                temp.append(PackageModel.app==app.id)
            else:
                return None, ResponseCode.HTTP_NOT_FOUND
74

75 76 77 78 79 80 81 82 83 84 85
        if params.get("app_version"):
            temp.append(PackageModel.app_version==params.get("app_version"))
        if params.get("algorithm"):
            temp.append(PackageModel.algorithm==params.get("algorithm"))
        if params.get("source"):
            temp.append(PackageModel.source==params.get("source"))

        # for p in params:
        #     if hasattr(PackageModel, p) and params[p] != None:
        #         logger.info(p)
        #         temp[p] = params[p]
86

87
        result = db.session.query(PackageModel).join(AppModel, PackageModel.app==AppModel.id).filter(*temp).order_by(PackageModel.create_at.desc()).add_entity(AppModel).paginate(params.get("page", 1), params.get("pageSize", 15), error_out=False)
88
        if result.total and len(result.items):
89
            return result, ResponseCode.HTTP_SUCCESS
90
        return result, ResponseCode.HTTP_NO_DATA
wanli's avatar
wanli committed
91

92
    def post(self, params, jwt={}):
93
        # 判断用户是否存在
94
        user = UserModel.query.filter(UserModel.uuid==jwt.get('uuid'))
95 96 97 98 99 100 101 102 103 104 105 106 107 108
        if not user:
            return False, ResponseCode.USER_NOT_EXISTS

        # 判断app是否存在
        app = AppModel.query.filter(AppModel.id==params.get("app"))
        if not app:
            return False, ResponseCode.HTTP_NOT_FOUND

        # 根据应用查找有哪些源文件
        source_files = AnnexModel.query.filter(AnnexModel.app==app.id).all()
        if not source_files:
            return None, ResponseCode.HTTP_NO_DATA

        dir_format = "{}-{}-{}".format(app.app_name, app.app_version, datetime.now().strftime("%Y%m%d%H%M%S"))
109 110 111 112 113 114 115 116
        upload_dir = Path(config.UPLOAD_ROOT_DIR).joinpath("uploads").joinpath("evueapps")
        # upload_dir = os.sep.join([config.UPLOAD_ROOT_DIR, "uploads", "evueapps"])
        target_dir = upload_dir.joinpath(user.account).joinpath(dir_format)
        # target_dir = os.sep.join([upload_dir, user.account, dir_format])
        dest_dir = target_dir.joinpath("src")
        # dest_dir = os.sep.join([target_dir, "src"])
        if not dest_dir.exists():
            os.makedirs(dest_dir.resolve().as_posix())
117 118 119

        app_files = []
        for sf in source_files:
120 121 122 123 124 125
            target_file = Path(config.UPLOAD_ROOT_DIR).joinpath(sf.path)
            name = re.sub(r"_\d{14}$", "", target_file.stem)
            suffix = target_file.suffix
            dst_file = dest_dir.joinpath(name + suffix)
            shutil.move(target_file.resolve().as_posix(), dst_file.resolve().as_posix())
            app_files.append([sf.id, dst_file.resolve().as_posix()])
126 127 128

        # 打包成EPK文件
        app_info = {}
129 130
        params = { 'appName': app.app_name, 'appDir': dest_dir, 'appVersion': app.app_version, 'output': target_dir.resolve().as_posix() }
        if user.role == 1:
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
            params['algorithm'] = "h"
        epk = EpkApp(**params)
        app_info = epk.pack()
        if app_info:
            app_info['md5'] = str(app_info['md5'])

        # 更新数据库对应文件路径
        # for sf in source_files:
        #     for af in app_files:
        #         if sf.id == af[0]:
        #             t = os.path.normpath(af[1].replace(config.UPLOAD_ROOT_DIR, "")).replace('\\', '/')
        #             sf.set(path=t)
        #             db.session.flush()
        # db.session.commit()

146
        epk_path = target_dir.relative_to(config.UPLOAD_ROOT_DIR).joinpath("{}.epk".format(app.app_name)).resolve().as_posix()
wanli's avatar
wanli committed
147
        # handle business
148 149 150 151 152 153 154 155 156
        # result = PackageModel.query.filter(PackageModel.app == params.get('app')).first()
        # if result and result.is_delete:
        #     result.is_delete = False
        #     result.update_by = jwt.get("id", "")
        #     result.update_date = datetime.now()
        #     db.session.commit()
        #     return True, ResponseCode.HTTP_SUCCESS
        # elif result and result.is_delete == False:
        #     return False, ResponseCode.HTTP_INVAILD_REQUEST
wanli's avatar
wanli committed
157

158
        result = PackageModel(app=app.id, file_path=epk_path, package_info=app_info, app_version=params.get("app_version"), create_by=user.id, create_at=datetime.now(), update_by=user.id, update_at=datetime.now())
wanli's avatar
wanli committed
159 160
        db.session.add(result)
        db.session.commit()
161
        return True, ResponseCode.HTTP_SUCCESS
wanli's avatar
wanli committed
162

163
    def put(self, uuid, params, jwt={}):
wanli's avatar
wanli committed
164
        # handle business
165 166
        result = PackageModel.query.filter(PackageModel.uuid==uuid).first()
        if not result:
167
            return None, ResponseCode.HTTP_NOT_FOUND
168

wanli's avatar
wanli committed
169 170 171
        if params:
            for key, value in params.items():
                if value != None: setattr(result, key, value)
172
            result.update_by = jwt.get("id", "")
wanli's avatar
wanli committed
173 174
            result.update_date = datetime.now()
            db.session.commit()
175
            return True, ResponseCode.HTTP_SUCCESS
wanli's avatar
wanli committed
176
        else:
177
            return False, ResponseCode.HTTP_INVAILD_REQUEST
wanli's avatar
wanli committed
178

179
    def delete(self, uuid, jwt={}):
wanli's avatar
wanli committed
180
        # handle business
181 182
        result = PackageModel.query.filter(PackageModel.uuid==uuid).first()
        if not result:
183
            return False, ResponseCode.HTTP_NOT_FOUND
184 185 186 187 188 189

        result.update_by = jwt.get("id", "")
        result.update_date = datetime.now()
        result.is_delete = True
        db.session.delete(result)
        db.session.commit()
190
        return True, ResponseCode.HTTP_SUCCESS
wanli's avatar
wanli committed
191 192

packageManager = PackageResource()