app.py 8.42 KB
Newer Older
1
import os
2 3
import traceback
from pathlib import Path
4
from datetime import datetime
wanli's avatar
wanli committed
5 6 7 8
from flask import current_app, jsonify, request
from flask_restful import Resource
from flask_restful.reqparse import RequestParser
from flask_jwt_extended import ( jwt_required, get_jwt_identity )
9
from werkzeug.datastructures import FileStorage
10 11
from werkzeug.utils import secure_filename
from application.config import config
wanli's avatar
wanli committed
12
from application.signal_manager import signalManager
wanli's avatar
wanli committed
13
from models.app import  postAppSchema, deleteAppSchema, getListAppSchema, getListAppsSchema, getAppSchema, putAppSchema
wanli's avatar
wanli committed
14
from webcreator.log import logger
wanli's avatar
wanli committed
15 16
from webcreator.response import ResponseCode, response_result

wanli's avatar
wanli committed
17
class AppResourceList(Resource):
wanli's avatar
wanli committed
18 19
    def __init__(self):
        # 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
20
        self.parser = RequestParser()
wanli's avatar
wanli committed
21

22
    @jwt_required(locations=["headers"])
wanli's avatar
wanli committed
23 24
    def get(self):
        # 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
25
        self.parser.add_argument('User-Agent', location='headers')
26 27
        self.parser.add_argument("app", type=str, location="args", nullable=True, required=False)
        self.parser.add_argument("scope", type=str, location="args", nullable=True, required=False)
28 29 30 31 32 33 34 35
        self.parser.add_argument("app_name", type=str, location="args", nullable=True, required=False)
        self.parser.add_argument("app_version", type=str, location="args", nullable=True, required=False)
        self.parser.add_argument("category", type=str, location="args", nullable=True, required=False)
        self.parser.add_argument("app_screen_size", type=str, location="args", nullable=True, required=False)
        self.parser.add_argument("app_arch", type=str, location="args", nullable=True, required=False)
        self.parser.add_argument("page", type=int, location="args", default=1)
        self.parser.add_argument("pageSize", type=int, location="args", default=15)
        args = self.parser.parse_args()
wanli's avatar
wanli committed
36 37

        try:
38 39 40 41 42 43
            jwt = get_jwt_identity()
            # data = getListAppSchema.load(args)
            data = dict()
            for key, value in args.items():
                if value != None:
                    data[key] = value
44
            result, message = signalManager.actionGetlistApp.emit(data, jwt)
wanli's avatar
wanli committed
45
            json_dumps = getListAppSchema.dump(result)
46
            if result:
47 48 49 50 51
                if isinstance(result, list):
                    json_dumps = result
                    return response_result(ResponseCode.HTTP_SUCCESS, data=json_dumps)
                else:
                    json_dumps = getListAppsSchema.dump(result.items)
52 53
                    for item in json_dumps:
                        item['file_dir'] = os.path.dirname(item['download_url'])
54
                    return response_result(ResponseCode.HTTP_SUCCESS, data=json_dumps, total=result.total, pageSize=args.pageSize)
55
            return response_result(message)
wanli's avatar
wanli committed
56
        except Exception as e:
57
            traceback.print_exc()
wanli's avatar
wanli committed
58
            current_app.logger.error(e)
59
            return response_result(ResponseCode.HTTP_SERVER_ERROR)
wanli's avatar
wanli committed
60

61
    @jwt_required(locations=["headers"])
wanli's avatar
wanli committed
62
    def post(self):
63
        self.parser.add_argument('User-Agent', location='headers')
wanli's avatar
wanli committed
64
        self.parser.add_argument("meta_data", type=str, location="form", default="{}", required=False)
65 66 67 68 69 70 71 72 73 74 75
        self.parser.add_argument("app_name", type=str, location="form", required=True)
        self.parser.add_argument("app_version", type=str, location="form", required=True)
        self.parser.add_argument("category", type=str, location="form", required=True)
        self.parser.add_argument("app_screen_size", type=str, location="form", required=True)
        self.parser.add_argument("app_arch", type=str, location="form", required=True)
        self.parser.add_argument("algorithm", type=str, location="form", required=True)
        self.parser.add_argument("remarks", type=str, location="form", required=True)
        self.parser.add_argument("logo", type=FileStorage, location="files", required=True)
        self.parser.add_argument("fileList", type=FileStorage, location="files", required=True)
        args = self.parser.parse_args()

wanli's avatar
wanli committed
76
        try:
77 78 79
            jwt = get_jwt_identity()

            # 获取request.files参数
80 81
            # json_payload = request.json
            params = postAppSchema.load(args)
82 83 84 85

            now_str = datetime.now().strftime("%Y%m%d%H%M%S")
            # 获取相对路径
            dirname = "{}-{}-{}-{}".format(params["app_name"], params["app_version"], params["category"], now_str)
86
            relative_path = Path(config.UPLOAD_ROOT_DIR)
87
            # 获取最终存储的绝对路径
88
            upload_path = Path(config.EPK_DIR).joinpath(dirname)
89

90 91
            if not upload_path.exists():
                os.makedirs(upload_path.resolve().as_posix())
92 93 94

            files = []
            # 应用logo
95
            logo = request.files.get("logo") # args.get('picture')
96 97
            if logo:
                filename = secure_filename(logo.filename)
98
                file_path = upload_path.joinpath(filename)
99
                logo.save(file_path)
100
                params.update({ "app_icon": file_path.relative_to(relative_path).as_posix() })
101 102

            # 应用源文件
103
            fileList = request.files.getlist('fileList')
104
            if fileList:
105 106 107
                upload_path = upload_path.joinpath("src")
                if not upload_path.exists():
                    os.mkdir(upload_path.resolve().as_posix())
108 109 110

                for f in fileList:
                    filename = secure_filename(f.filename)
111 112
                    file_path = upload_path.joinpath(filename)
                    f.save(file_path.resolve().as_posix())
113
                    files.append(file_path.relative_to(relative_path).as_posix())
114

115
            params.update({ "fileList": files, "epk_path": upload_path, 'real_ip': request.headers.get('X-Forwarded-For', '127.0.0.1') })
116
            result, message = signalManager.actionPostApp.emit(params, jwt)
117
            if result:
118
                return response_result(ResponseCode.HTTP_SUCCESS, data=result)
119
            return response_result(message)
wanli's avatar
wanli committed
120
        except Exception as e:
121
            traceback.print_exc()
wanli's avatar
wanli committed
122
            current_app.logger.error(e)
123
            return response_result(ResponseCode.HTTP_SERVER_ERROR)
wanli's avatar
wanli committed
124 125


wanli's avatar
wanli committed
126
class AppResource(Resource):
wanli's avatar
wanli committed
127 128 129 130 131
    def __init__(self):
        pass
        # 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
        # self.parser = RequestParser()

132
    @jwt_required(locations=["headers"])
wanli's avatar
wanli committed
133
    def get(self, uuid):
wanli's avatar
wanli committed
134 135 136 137 138 139
        # 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
        # self.parser.add_argument("page", type=int, location="args", default=1)
        # self.parser.add_argument("pageSize", type=int, location="args", default=15)
        # args = self.parser.parse_args()

        try:
140 141
            jwt = get_jwt_identity()
            result, message = signalManager.actionGetApp.emit(uuid, jwt)
142
            if result:
143 144
                return response_result(ResponseCode.HTTP_SUCCESS, data=result)
            return response_result(message)
wanli's avatar
wanli committed
145
        except Exception as e:
146
            traceback.print_exc()
wanli's avatar
wanli committed
147
            current_app.logger.error(e)
148
            return response_result(ResponseCode.HTTP_SERVER_ERROR)
wanli's avatar
wanli committed
149 150


151
    @jwt_required(locations=["headers"])
wanli's avatar
wanli committed
152
    def put(self, uuid):
wanli's avatar
wanli committed
153
        try:
154
            jwt = get_jwt_identity()
wanli's avatar
wanli committed
155 156
            json_payload = request.json
            data = putAppSchema.load(json_payload)
157
            result, message = signalManager.actionPutApp.emit(uuid, data, jwt)
158
            if result:
159 160
                return response_result(ResponseCode.HTTP_SUCCESS, data=result)
            return response_result(message)
wanli's avatar
wanli committed
161
        except Exception as e:
162
            traceback.print_exc()
wanli's avatar
wanli committed
163
            current_app.logger.error(e)
164
            return response_result(ResponseCode.HTTP_SERVER_ERROR)
wanli's avatar
wanli committed
165 166


167
    @jwt_required(locations=["headers"])
wanli's avatar
wanli committed
168
    def delete(self, uuid):
wanli's avatar
wanli committed
169 170
        try:
            json_payload = request.json
171 172
            # data = deleteAppSchema.load(json_payload)
            print("========>", uuid, json_payload)
173 174
            result, message = signalManager.actionDeleteApp.emit(uuid)
            if result:
175 176
                return response_result(ResponseCode.HTTP_SUCCESS, data=result)
            return response_result(message)
wanli's avatar
wanli committed
177
        except Exception as e:
178
            traceback.print_exc()
wanli's avatar
wanli committed
179
            current_app.logger.error(e)
180
            return response_result(ResponseCode.HTTP_SERVER_ERROR)