def get_detail_info(self, object_type, object_id): """ 獲取base_table中的資料細節 Parameters ---------- object_type: str product or project object_id: str project_id or product_id 共稱object_id Returns ------- 查詢結果: dict """ ss_time = time.time() if object_type == Type.product.value: try: result = self.__product_base_dao.select_by_id(object_id) except: logger.error(traceback.format_exc()) raise CommonRuntimeException("389900009") # if object_type == Type.project.value else: try: result = self.__project_base_dao.select_by_id(object_id) except: logger.error(traceback.format_exc()) raise CommonRuntimeException("389900009") result = _change_to_frontend_style(object_type, result) cost_time = round(time.time() - ss_time, 2) return result, cost_time
def activate(self, releaseVo): """ 修改release_table的running_status Parameters ---------- releaseVo: object Returns ------- str release_id """ ss_time = time.time() # 檢查是否能關閉 if releaseVo.running_status == 0: if self.__release_mapping_dao.check_parent_dependency( releaseVo.release_id) is True: raise CommonRuntimeException("389900011") # 若running_status為1 則所有套件 服務都必須啟動 if releaseVo.running_status == 1: release_status = self.__release_dao.get_release_status_by_id( releaseVo.release_id) if release_status != 1: raise CommonRuntimeException("389900016") # get dependency_id try: # 只建立出語法 dep_ids_from_view = self.__search_view_dao.get_dependency_id( releaseVo.release_id) list_of_dep_ids = list() # 連線到db並且拿出資料,並且判斷有無dependency if dep_ids_from_view.count() == 0: pass else: for data in dep_ids_from_view.dicts(): list_of_dep_ids.append(data["dependency_id"]) except: raise CommonRuntimeException("389900009") # update dependency_id running_status to 1 if len(list_of_dep_ids) > 0: self.__release_dao.update_by_parameters( list_of_dep_ids, running_status=releaseVo.running_status, mdy_date=datetime.utcnow(), mdy_user=releaseVo.user) # update release_id running_status release_id = self.__release_dao.update_by_parameters( str(releaseVo.release_id), running_status=releaseVo.running_status, mdy_date=datetime.utcnow(), mdy_user=releaseVo.user) if release_id is None: raise CommonRuntimeException("389900002") cost_time = round(time.time() - ss_time, 2) return release_id, cost_time
def verify(self, releaseVo): """ 修改release_table的release_status Parameters ---------- releaseVo :object of ReleaseVo Returns ------- str verify 的 release_id """ ss_time = time.time() result = self.__release_dao.update_by_parameters( release_id=releaseVo.release_id, release_status=releaseVo.release_status, mdy_user=releaseVo.user, mdy_date=datetime.utcnow()) # 查無資料 if result is None: raise CommonRuntimeException("389900002") cost_time = round(time.time() - ss_time, 2) return result, cost_time
def check_exist(self, object_type, name=None, service_port=None, service_url=None): """ 確認db中該筆資料是否已經存在 Parameters ---------- object_type: str product_id, project_id name: str 專案或產品名稱 service_port: int 服務之port號 若為product則無 service_url: str 服務所對應之url 若為product則無 Returns ------- boolean """ try: if object_type == Type.product.value: name_exist = self.__product_base_dao.check_insert_validation( name) return name_exist elif object_type == Type.project.value: data_exist = self.__project_base_dao.check_insert_validation( name, service_url, service_port) return data_exist except: logger.error(traceback.format_exc()) logger.error("Fail to check project/product name exist.") raise CommonRuntimeException("999999998")
def modify_db_data(self, object_type, versionVo): """ 更改base_table的資料 Parameters ---------- object_type: str project or product versionVo: object 驗證過的前端資料 Returns ------- object_id: str """ ss_time = time.time() # for product if object_type == Type.product.value: result = self.__product_base_dao.update_to_product_table( versionVo.object_id, note=versionVo.note, jira_api=versionVo.jira_api_id) # for project else: if versionVo.service_port or versionVo.service_url: data_exist = self.__project_base_dao.check_exist( versionVo.object_id, service_port=versionVo.service_port, service_url=versionVo.service_url) if data_exist is True: logger.error(traceback.format_exc()) raise CommonRuntimeException("389900002") result = self.__project_base_dao.update_to_project_table( versionVo.object_id, service_port=versionVo.service_port, git_url=versionVo.git_url, service_url=versionVo.service_url, language_type=versionVo.language_type, project_type=versionVo.project_type, jira_api=versionVo.jira_api_id, active_status=versionVo.active_status, note=versionVo.note) cost_time = round(time.time() - ss_time, 2) return result, cost_time
def modify_release(self, releaseVo): """ 更改 release info Parameters ---------- releaseVo: object 驗證過的前端資料 Returns ------- release_id: str """ ss_time = time.time() # 更新 release note if releaseVo.release_note is not None: self.__release_dao.update_by_parameters( release_id=releaseVo.release_id, release_note=releaseVo.release_note) # 更新 dependency release_status, running_status, dependency_list = self.__release_dao.get_status_and_dependency_by_id( releaseVo.release_id) if (release_status != 0 or running_status != 0 ) and dependency_list != releaseVo.dependency_id_list: raise CommonRuntimeException("389900013") # dependency 有做更動再寫入db if dependency_list != releaseVo.dependency_id_list: self.__release_mapping_dao.modify_dependency_by_release_id( release_id=releaseVo.release_id, dependency_id_list=releaseVo.dependency_id_list) result = releaseVo.release_id cost_time = round(time.time() - ss_time, 2) return result, cost_time
def validate(self, api_type=None): if api_type == "release_insert": # check if data exists if self.user is None or self.object_id is None or self.version is None: raise CommonRuntimeException("999900001") assert isinstance(self.user, str), "999900001" assert isinstance(self.object_id, str), "999900001" assert isinstance(self.version, str), "999900001" assert isinstance( self.release_note, (str, type(None))), "999900001" # check data is None or str assert isinstance(self.dependency_id_list, (list, type(None))), "999900001" if api_type == "latest_info": if self.user is None or self.object_id is None: raise CommonRuntimeException("999900001") assert isinstance(self.user, str), "999900001" assert isinstance(self.object_id, str), "999900001" if api_type == "activate": if self.user is None or self.release_id is None or self.running_status is None: raise CommonRuntimeException("999900001") assert isinstance(self.user, str), "999900001" assert isinstance(self.release_id, str), "999900001" assert isinstance(self.running_status, int), "999900001" if api_type == "verify": if self.user is None or self.release_id is None or self.release_status is None: raise CommonRuntimeException("999900001") assert isinstance(self.user, str), "999900001" assert isinstance(self.release_id, str), "999900001" assert isinstance(self.release_status, int), "999900001" if api_type == "history_info": if self.user is None or self.object_id is None or self.get_running is None: raise CommonRuntimeException("999900001") assert isinstance(self.user, str), "999900001" assert isinstance(self.object_id, str), "999900001" assert isinstance(self.get_running, bool), "999900001" if api_type == "release_overview": if self.user is None: raise CommonRuntimeException("999900001") assert isinstance(self.user, str), "999900001" if api_type == "get_release_info": if self.user is None or self.release_id_list is None: raise CommonRuntimeException("999900001") assert isinstance(self.user, str), "999900001" assert isinstance(self.release_id_list, list), "999900001" if api_type == "modify_release_info": if self.user is None or self.release_id is None: raise CommonRuntimeException("999900001") assert isinstance(self.user, str), "999900001" assert isinstance(self.release_id, str), "999900001" assert isinstance(self.dependency_id_list, list), "999900001" assert isinstance(self.release_note, (str, type(None))), "999900001"
def get_specific_releases_info(self, releaseVo): """ 依據 release_id_list 拿出對應的 release 資料 Returns ------- result: list 查詢結果 """ ss_time = time.time() cursor = self.__release_dao.search_by_id_list( releaseVo.release_id_list) # 過濾要給前端的column並且轉換格式 search_result = list(cursor) if not search_result: raise CommonRuntimeException("389900009") arranged_result = [] check_duplicate = search_result[0]["release_id"] dict_data = defaultdict(list) for value in search_result: if value["release_id"] != check_duplicate: # 若無 dependency 依然回傳一個空 list if not "dependency" in dict_data: dict_data["dependency"] = list() arranged_result.append(dict_data) dict_data = defaultdict(list) # 清空 check_duplicate = value["release_id"] else: if value["dependency_id"]: # 避免在第一筆資料插入空的dependency dict_data["dependency"].append({ "dependencyId": value["dependency_id"], "dependencyName": value["dependency_name"], "dependencyVersion": value["dependency_version"] }) dict_data["crtDate"] = self.__datetime.utc_to_localize( value["crt_date"]).strftime("%Y/%m/%d %H:%M") dict_data["crtUser"] = value["crt_user"] dict_data["mdyUser"] = value["mdy_user"] dict_data["releaseId"] = value["release_id"] dict_data["releaseNote"] = value["release_note"] dict_data["releaseStatus"] = value["release_status"] dict_data["runningStatus"] = value["running_status"] dict_data["version"] = value["version"] dict_data["languageType"] = value["language_type"] if value["product_name"] is not None: dict_data["name"] = value["product_name"] else: dict_data["name"] = value["project_name"] if value["mdy_date"] is not None: dict_data["mdyDate"] = self.__datetime.utc_to_localize( value["mdy_date"]).strftime("%Y/%m/%d %H:%M") else: dict_data["mdyDate"] = None if value["project_id"] is not None: dict_data["isProduct"] = False else: dict_data["isProduct"] = True # append 最後一筆 data if not "dependency" in dict_data: dict_data["dependency"] = list() arranged_result.append(dict_data) cost_time = round(time.time() - ss_time, 2) return arranged_result, cost_time
def latest_release_info(self, object_type, releaseVo): """ 獲取從資料庫search_view得到的最新所有相關的套件或服務之名字及版本號 Parameters ---------- object_type: str project or product releaseVo: object 驗證過的前端資料 Returns ------- list 查詢結果 """ ss_time = time.time() # 從 search view 中拿取 release info if object_type == Type.project.value: result_of_search_view = self.__search_view_dao.get_release_info( object_type, project_id=releaseVo.object_id) else: result_of_search_view = self.__search_view_dao.get_release_info( object_type, product_id=releaseVo.object_id) # 取得最新版本的單筆資料(view)(release_version) try: latest_view_data = result_of_search_view.limit(1).get() except: cost_time = round(time.time() - ss_time, 2) return None, cost_time # 從 release table 中拿取 release info if object_type == Type.project.value: result_of_release_table = self.__release_dao.get_release_info( object_type, project_id=releaseVo.object_id) else: result_of_release_table = self.__release_dao.get_release_info( object_type, product_id=releaseVo.object_id) # 取得最新版本的單筆資料(table) try: latest_data_of_release_table = result_of_release_table.limit( 1).get() except: raise CommonRuntimeException("389900009") # 檢查 dependency data 是否真的是上一個 release 的資料 if latest_data_of_release_table.version != latest_view_data.release_table.release_version: cost_time = round(time.time() - ss_time, 2) return None, cost_time else: result = list() result_dict = dict() for db_data in result_of_search_view.dicts(): # 如果crt_date相符(代表為the latest) if db_data[ "release_version"] == latest_data_of_release_table.version: if db_data["product_name"] is not None: result_dict["name"] = db_data["product_name"] else: result_dict["name"] = db_data["project_name"] result_dict["version"] = db_data["dependency_version"] result.append(result_dict) result_dict = {} cost_time = round(time.time() - ss_time, 2) return result, cost_time
def new_release_version(self, object_type, releaseVo): """ 新增release version to release table and release_mapping_table 如果沒有dependency 則只會新增到release table Parameters ---------- object_type: str product or project releaseVo: object 前端獲得之資料 Returns ------- str new_release_id """ ss_time = time.time() if object_type == Type.project.value: # check active status and version _is_active = False _version_duplicate = False cursor = self.__project_dao.get_active_and_version( releaseVo.object_id, active_status=1, version=releaseVo.version).dicts() for value in cursor: if value["active_status"] == 1: _is_active = True if value["version"] == releaseVo.version: _version_duplicate = True # 根據 boolean raise 不同的 error if _is_active is False and _version_duplicate is True: raise CommonRuntimeException("389900014") if _is_active is False: raise CommonRuntimeException("389900012") if _version_duplicate is True: raise CommonRuntimeException("389900015") new_release_id = self.__release_dao.insert_to_release_table( project_id=releaseVo.object_id, version=releaseVo.version, crt_user=releaseVo.user, release_note=releaseVo.release_note) self.__release_mapping_dao.insert_to_release_mapping_table( release_id=new_release_id, dependency_id_list=releaseVo.dependency_id_list) else: # check active status _is_active = self.__product_dao.check_exist(releaseVo.object_id, active_status=1) if _is_active is True: new_release_id = self.__release_dao.insert_to_release_table( product_id=releaseVo.object_id, version=releaseVo.version, crt_user=releaseVo.user, release_note=releaseVo.release_note) self.__release_mapping_dao.insert_to_release_mapping_table( release_id=new_release_id, dependency_id_list=releaseVo.dependency_id_list) else: raise CommonRuntimeException("389900012") cost_time = round(time.time() - ss_time, 2) return new_release_id, cost_time
def validate(self, objectType, api_type=None): """ 驗證前端資料 Parameters ---------- objectType: str """ if api_type == "create": # 驗證必填欄位 if self.user is None: raise CommonRuntimeException("999900001") if self.name is None: raise CommonRuntimeException("389900006") # 如果是project insert, 驗證其必填欄位 if objectType == Type.project.value: if self.project_type is None: raise CommonRuntimeException("389900008") if self.language_type is None: raise CommonRuntimeException("389900007") # 另外確認chatbot的連續port號 with open("port_block.yml", "r") as stream: chatbot_port = yaml.safe_load( stream)["port_block"]["range"] for port in chatbot_port: if self.service_port: if port["start"] <= self.service_port <= port["end"]: raise CommonRuntimeException("389900010") assert isinstance(self.git_url, (str, type(None))), "999900001" assert isinstance(self.service_port, (int, type(None))), "999900001" assert isinstance(self.service_url, (str, type(None))), "999900001" assert isinstance(self.jira_api_id, (str, type(None))), "999900001" #for release table if self.version is None: raise CommonRuntimeException("999900001") # 驗證選 必填欄位之格式 assert isinstance(self.user, str), "999900001" assert isinstance(self.name, str), "999900001" assert isinstance(self.version, str), "999900001" assert isinstance(self.note, (str, type(None))), "999900001" if api_type == "modify": if self.object_id is None: raise CommonRuntimeException("389900003") # 不得針對active_status做modify 只能用archive if self.active_status == "0": raise CommonRuntimeException("389900004") if objectType == Type.project.value: assert isinstance(self.service_port, (int, type(None))), "999900001" assert isinstance(self.service_url, (str, type(None))), "999900001" assert isinstance(self.git_url, (str, type(None))), "999900001" assert isinstance(self.project_type, (str, type(None))), "999900001" assert isinstance(self.language_type, (str, type(None))), "999900001" assert isinstance(self.note, (str, type(None))), "999900001" assert isinstance(self.jira_api_id, (str, type(None))), "999900001" if api_type == "search": assert isinstance(self.keyword, (str, type(None))), "999900001" assert isinstance(self.project_type, (str, type(None))), "999900001" assert isinstance(self.language_type, (str, type(None))), "999900001" assert isinstance(self.active_status, (int, type(None))), "999900001" assert isinstance(self.name, (str, type(None))), "999900001"
def insert_new(self, object_type, versionVo): """ 新增資料至DB的project_base_table or product_base_table 以及 release_table Parameters ---------- object_type : str project / product versionVo : object 包含所有 input 資訊 Returns ------- release_id : str ObjectId流水號 """ ss_time = time.time() # for product if object_type == Type.product.value: data_exist = self.check_exist(object_type, name=versionVo.name) # 若存在 則不可新增 直接error if data_exist is True: logger.error(traceback.format_exc()) raise CommonRuntimeException("389900001") # insert to product_table product_id = self.__product_base_dao.insert_to_product_table( product_name=versionVo.name, note=versionVo.note, jira_api=versionVo.jira_api_id) # insert to release_table release_id = self.__release_dao.insert_to_release_table( product_id=product_id, version=versionVo.version, crt_user=versionVo.user) result = dict() result["productId"] = product_id result["releaseId"] = release_id # for project elif object_type == Type.project.value: data_exist = self.check_exist(object_type, name=versionVo.name, service_port=versionVo.service_port, service_url=versionVo.service_url) # 若存在 則不可新增 直接error if data_exist is True: logger.error(traceback.format_exc()) raise CommonRuntimeException("389900001") # insert to project_table if versionVo.service_port == -1: versionVo.service_port = None if versionVo.service_url == "-": versionVo.service_url = None project_id = self.__project_base_dao.insert_to_project_table( project_name=versionVo.name, service_port=versionVo.service_port, git_url=versionVo.git_url, service_url=versionVo.service_url, language_type=versionVo.language_type, project_type=versionVo.project_type, jira_api=versionVo.jira_api_id, note=versionVo.note) # insert to release_table release_id = self.__release_dao.insert_to_release_table( project_id=project_id, version=versionVo.version, crt_user=versionVo.user) result = dict() result["projectId"] = project_id result["releaseId"] = release_id cost_time = round(time.time() - ss_time, 2) return result, cost_time