#!/usr/bin/env python # -*- coding: utf_8 -*- import os import shutil import copy import time import types import json import logging import traceback from datetime import datetime from pony.orm import * from app import signalManager, config from model import fullStackDB from model.annex import Annex from model.apps import Apps from model.user import User from model.build_logs import BuildLogs from utils import sql_filter, ThreadMaker from utils.tools_epk import EpkApp logger = logging.getLogger("AppsManager") @ThreadMaker def build_application(user, uuid): signalManager.actionAddBuildLog.emit(user, uuid) class AppsManager(object): def __init__(self): super(AppsManager, self).__init__() def add(self, user, data): with db_session: editor = User.get(id=user) if not editor: return False, "current user is not exists" data.update({ 'create_by': editor, 'create_at': datetime.now(), 'update_by': editor, 'update_at': datetime.now(), }) icon = Annex(title=data.get("app_icon").get("filename"), path=data.get("app_icon").get("filepath"), size=data.get("app_icon").get("filesize"), create_by=editor, create_at=datetime.now(), update_by=editor, update_at=datetime.now()) commit() app_files = [] if data.get("app_files"): app_files = data.get("app_files") data.pop("app_files") data.update({ "app_icon": icon }) app = Apps(**data) commit() target_path = os.sep.join([config.get("UPLOAD_PATH"), config.get("UPLOAD_DIR"), "evueapps", editor.account]) epk_dirname = "{}-{}-{}".format(app.app_name, app.app_version, datetime.now().strftime("%Y%m%d%H%M%S")) # EPK资源文件临时目录 target_dir = os.path.normpath(os.sep.join([target_path, epk_dirname])) target_path = os.sep.join([target_dir, "src"]) if not os.path.exists(target_path): os.makedirs(target_path) target_files = [] for f in app_files: filename = os.path.basename(f.get("filepath")) target_f = copy.deepcopy(f) target_filepath = os.sep.join([target_path, filename]) target_f['filepath'] = target_filepath target_files.append(target_f) shutil.copy(f.get("filepath"), target_f['filepath']) os.remove(f.get("filepath")) for a in target_files: Annex(app=app, title=a.get("filename"), path=a.get("filepath"), size=a.get("filesize"), create_by=editor, create_at=datetime.now(), update_by=editor, update_at=datetime.now()) flush() commit() # 打包成EPK文件 epk = EpkApp(appName=app.app_name, appDir=target_path, appVersion=app.app_version, output=target_dir) app_info = epk.pack() epk_filename = os.sep.join([target_dir.replace(config.get("UPLOAD_PATH"), ""), "{}.epk".format(app.app_name)]).replace('\\', '/') app_info['md5'] = str(app_info['md5']) app_info.update({ "epk_size": os.path.getsize(os.sep.join([config.get("UPLOAD_PATH"), epk_filename])) }) result = BuildLogs(app=app, app_path=epk_filename, app_info=app_info, create_by=editor, create_at=datetime.now(), update_by=editor, update_at=datetime.now()) commit() return result, "add app {}.".format("success" if result else "fail") def delete(self, user, uuid): with db_session: editor = User.get(id=user) if not editor: return False, "current user is not exists" result = Apps.get(uuid=uuid) if result: result.app_icon.delete() result.delete() return result, "delete app {}.".format("success" if result else "fail") def get(self, user, data): result = Apps.get(**data) if result: result = result.to_dict(only=["uuid", "name", "create_at", "update_at"]) return result, "get app {}.".format("success" if result else "no data") def getList(self, user, data): if not data or len(data) <= 0: return False, 0, "parameters can not be null." temp = copy.deepcopy(data) if 'pagenum' in temp: temp.pop('pagenum') if 'pagesize' in temp: temp.pop('pagesize') if 'scope_type' in temp: temp.pop('scope_type') temp.setdefault("is_delete", False) with db_session: if "scope_type" in data and data.get("scope_type") == "list": result = Apps.select().where(**temp).order_by(desc(Apps.create_at)) temp = [] for item in result: temp.append(item.to_dict(only=["uuid", "app_name"])) return temp, len(temp), "get app {}.".format("success" if temp else "fail") result = Apps.select().where(**temp).order_by(Apps.sort).page(data.get("pagenum", 1), pagesize=data.get("pagesize", 10)) count = Apps.select().where(**temp).count() if result and len(result): temp = [] for item in result: t = item.to_dict(with_collections=True, related_objects=True, exclude=["app_annex", "app_download", "app_icon", "is_delete", "delete_by", "delete_at"]) t.update({ "app_build_log": item.app_build_log.to_dict(exclude=["is_delete", "delete_by", "delete_at", "create_by", "update_by"]), "create_by": item.create_by.to_dict(only=["uuid", "username"]), "update_by": item.update_by.to_dict(only=["uuid", "username"]), "create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S") if item.create_at else None, "update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S") if item.update_at else None, }) temp.append(t) result = temp return result, count, "get app {}.".format("success" if result else "no data") def update(self, user, uuid, data): # 当参数为空时,直接返回错误 if len(data) <= 0 or (len(data.keys()) == 1 and "id" in data): return False, "app can not be null." with db_session: editor = User.get(id=user) if not editor: return False, "current user is not exists" result = Apps.get(uuid=uuid) if not result: return False, "app not found" if data.get("app_files"): app_files = data.get("app_files") for a in app_files: Annex(app=result, title=a.get("filename"), path=a.get("filepath"), size=a.get("filesize"), create_by=editor, create_at=datetime.now(), update_by=editor, update_at=datetime.now()) flush() commit() data.pop("app_files") if data.get("app_icon"): condition = { 'update_by': editor, 'update_at': datetime.now() } if data.get("app_icon").get("filename"): condition.update({"title": data.get("app_icon").get("filename")}) if data.get("app_icon").get("filepath"): condition.update({"path": data.get("app_icon").get("filepath")}) if data.get("app_icon").get("filesize"): condition.update({"size": data.get("app_icon").get("filesize")}) result.app_icon.set(**condition) commit() data.pop("app_icon") result.set(update_at=datetime.now(), update_by=editor, **data) commit() build_application(user, str(result.uuid)) return result, "update app {}.".format("success" if result else "fail") appsManager = AppsManager()