class MemberManager(object): def __init__(self): self.db = DB() pass def insert_member_info(self, card_no, member_name, member_sex, member_tel, member_birth, member_pwd, member_remark): member_no = uuid1().hex update_time = int(time()) join_time = update_time kwargs = dict(member_no=member_no, card_no=card_no, member_name=member_name, member_sex=member_sex, member_tel=member_tel, member_birth=member_birth, member_pwd=member_pwd, member_remark=member_remark,join_time=join_time, update_time=update_time) self.db.execute_insert("member_info", kwargs=kwargs) return True, kwargs
class PullRequestManager: def __init__(self): self.db = DB() self.t_git_hub = "github_pull_request" def add_pull_request(self, **kwargs): request_info = dict(action_no=int(time())) request_info["request_num"] = kwargs["request_num"] request_info["action_user"] = kwargs["action_user"][:50] request_info["request_title"] = kwargs["request_title"][:100] request_info["request_body"] = kwargs["request_body"][:300] request_info["base_branch"] = kwargs["base_branch"][:50] request_info["compare_branch"] = kwargs["compare_branch"][:50] request_info["merged"] = kwargs["merged"] request_info["repository"] = kwargs["repository"][:50] self.db.execute_insert(self.t_git_hub, args=request_info) return True def select_pull_request(self, action_no=None, **kwargs): cols = ["action_no", "request_num", "action_user", "request_title", "request_body", "base_branch", "compare_branch", "merged", "repository"] select_sql = "SELECT %s FROM %s" % (",".join(cols), self.t_git_hub) where_con = [] if action_no is not None: where_con.append("action_no>=%s" % action_no) for key in kwargs: where_con.append("{0}=%({0})s".format(key)) if len(where_con) > 0: select_sql += " WHERE " + " AND ".join(where_con) select_sql += ";" self.db.execute(select_sql, args=kwargs) db_r = self.db.fetchall() pull_requests = [] for item in db_r: p_info = {} for i in range(len(cols)): p_info[cols[i]] = item[i] p_info["merged"] = True if p_info["merged"] == "\x01" else False pull_requests.append(p_info) return True, pull_requests
class OthersManager(object): def __init__(self): self.db = DB() self.t_others_r = "others_result" def insert_others_info(self, other_type, result_info): insert_time = int(time()) result_no = int(time() * 1000) kwargs = dict(result_no=result_no, other_type=other_type, result_info=result_info, insert_time=insert_time) l = self.db.execute_insert(self.t_others_r, args=kwargs) return True, l def select_others_info(self, other_type): where_value = {"other_type": other_type} cols = ["result_no", "other_type", "result_info", "insert_time"] db_items = self.db.execute_select(self.t_others_r, where_value=where_value, cols=cols, package=True) return True, db_items
class ParamFormatManager: def __init__(self): self.db = DB() self.t_param_format = "param_format" def new_param_format(self, user_name, param, param_type, **kwargs): cols = ["min_len", "max_len", "not_allow", "match_str", "param_desc"] now_time = int(time()) sql_args = dict( add_user=user_name, param=param, param_type=param_type, add_time=now_time, update_time=now_time, update_user=user_name, ) for col_item in cols: if col_item in kwargs: sql_args[col_item] = kwargs[col_item] result = self.db.execute_insert(self.t_param_format, args=sql_args, ignore=True) return True, sql_args def update_param_format(self, user_name, param, **kwargs): cols = ["param_type", "min_len", "max_len", "not_allow", "match_str", "param_desc"] sql_args = dict(update_user=user_name, update_time=int(time())) for col_item in cols: if col_item in kwargs: sql_args[col_item] = kwargs[col_item] result = self.db.execute_update(self.t_param_format, update_value=sql_args, where_value={"param": param}) sql_args["param"] = param return True, sql_args def select_param_format(self): cols = ["param", "param_type", "min_len", "max_len", "not_allow", "match_str", "param_desc"] self.db.execute_select(self.t_param_format, cols=cols) db_r = self.db.fetchall() params_info = [] for item in db_r: param_item = {} for i in range(len(cols)): param_item[cols[i]] = item[i] params_info.append(param_item) return True, params_info
class TaskManager(object): def __init__(self, task_type): self.db = DB() self.register_task = "register_task" self.scheduler_status = "task_scheduler_status" self.task_type = task_type def register_new_task(self, task_no, user_name, reason, reason_desc): status_info = "%s1" % int(time()) args = dict(task_no=task_no, task_type=self.task_type, user_name=user_name, reason=reason, reason_desc=reason_desc, status_info=status_info) result = self.db.execute_insert(self.register_task, args=args, ignore=True) if result <= 0: return False, result return True, args def update_register_task(self, task_no, run_result=True): status_info = "|%s%s" % (int(time()), 1 if run_result is True else 0) update_sql = "UPDATE %s SET status_info=CONCAT(status_info, '%s') WHERE task_no=%s AND task_type=%s;" \ % (self.register_task, status_info, task_no, self.task_type) self.db.execute(update_sql) return True, "success" def select_register_task(self, task_no, user_name=None): cols = ["task_no", "task_type", "user_name", "reason", "reason_desc", "status_info"] if user_name is None: zero = 1 else: zero = 0 select_sql = "SELECT %s FROM %s WHERE task_no>=%s AND task_type=%s AND (user_name='%s' OR %s) " \ "ORDER BY task_no DESC;" \ % (",".join(cols), self.register_task, task_no, self.task_type, user_name, zero) self.db.execute(select_sql) db_r = self.db.fetchall() task_list = [] for item in db_r: task_info = {} for i in range(len(cols)): task_info[cols[i]] = item[i] task_list.append(task_info) return True, task_list def _new_task_status(self, task_status, user_name, reason_desc): update_time = int(time()) args = dict(task_type=self.task_type, task_status=task_status, user_name=user_name, reason_desc=reason_desc, update_time=update_time) result = self.db.execute_insert(self.scheduler_status, args=args) return True, result def update_scheduler_status(self, task_status, user_name, reason_desc): update_time = int(time()) update_value = dict(task_status="%s" % task_status, user_name=user_name, reason_desc=reason_desc, update_time=update_time) result = self.db.execute_update(self.scheduler_status, update_value, {"task_type": self.task_type}) if result <=0: return self._new_task_status(task_status, user_name, reason_desc) return True, result def select_scheduler_status(self): cols = ["task_status", "user_name", "reason_desc", "update_time"] result = self.db.execute_select(self.scheduler_status, {"task_type": self.task_type}, cols) info = {} if result <= 0: for col in cols: info[col] = None return True, info db_r = self.db.fetchone() for i in range(len(cols)): info[cols[i]] = db_r[i] return True, info
class HelpManager: def __init__(self): self.db = DB() self.api_part_info = "api_part_info" self.api_module = "api_module" self.api_info = "api_info" self.api_input = "api_input" self.api_output = "api_output" self.api_header = "api_header" self.predefine_header = "predefine_header" self.predefine_body = "predefine_body" self.api_body = "api_body" self.predefine_param = "predefine_param" self.api_care = "api_care" self.module_care = "module_care" self.send_message = "send_message" self.test_env = "test_env" self.api_stage_desc = [u"新建", u"修改中", u"已完成", u"待废弃", u"已废弃", u"已删除"] self.user = "******" def new_api_module(self, module_name, module_prefix, module_desc, module_part, module_env): module_name = module_name.strip(" ") if check_chinese_en(module_name, 1, 35) is False: return False, "Bad module_name." if check_path(module_prefix, 1, 35) is False: return False, "Bad module_prefix" if check_int(module_part, max_v=9999) is False: return False, "Bad module_part" if type(module_env) != list: return False, "Bad module_env" if len(module_env) not in range(1, 6): print(module_env) return False, "Bad module_env." module_desc = check_sql_character(module_desc)[:240] module_env_s = "" for env_no in module_env: if type(env_no) != int: return False, "Bad env_no" module_env_s += "%s|" % env_no insert_sql = "INSERT INTO %s (module_name,module_prefix,module_desc,module_part,module_env) " \ "VALUES ('%s','%s','%s',%s,'%s');" \ % (self.api_module, module_name, module_prefix, module_desc, module_part, module_env_s[:-1]) result = self.db.execute(insert_sql) if result != 1: return False, "sql execute result is %s " % result return True, "success" def update_api_module(self, module_no, module_name, module_prefix, module_desc, module_part, module_env): if check_chinese_en(module_name, 0, 35) is False: return False, "Bad module_name." if check_path(module_prefix, 0, 35) is False: return False, "Bad module_prefix" if check_int(module_part, max_v=9999) is False: return False, "Bad module_part" if type(module_env) != list: return False, "Bad module_env" if len(module_env) not in range(1, 6): print(module_env) return False, "Bad module_env." module_desc = check_sql_character(module_desc)[:240] module_env_s = "" for env_no in module_env: if type(env_no) != int: return False, "Bad env_no" module_env_s += "%s|" % env_no update_sql = "UPDATE %s SET module_name='%s',module_prefix='%s',module_desc='%s',module_part=%s,module_env='%s' " \ "WHERE module_no=%s;" \ % (self.api_module, module_name, module_prefix, module_desc, module_part, module_env_s[:-1], module_no) result = self.db.execute(update_sql) return True, "success" def del_api_module(self, module_no): delete_sql = "DELETE FROM %s WHERE module_no=%s;" % (self.api_module, module_no) self.db.execute(delete_sql) return True, "success" def new_api_info(self, module_no, api_title, api_path, api_method, api_desc): if type(module_no) != int: return False , "Bad module_no" if check_path(api_path) is False: return False, "Bad api_path" if api_path.endswith("/") is False: return False, u"api path should end with /" if check_http_method(api_method) is False: return False, "Bad api_method" api_title = check_sql_character(api_title) api_desc = check_sql_character(api_desc) if len(api_desc) < 1: return False, "Bad api_desc" api_no = uuid.uuid1().hex # 新建 api_info add_time = datetime.now().strftime(TIME_FORMAT) insert_sql = "INSERT INTO %s (api_no,module_no,api_title,api_path,api_method,api_desc,add_time,update_time) " \ "VALUES('%s',%s,'%s','%s','%s','%s','%s','%s')" \ % (self.api_info, api_no, module_no, api_title, api_path, api_method, api_desc, add_time, add_time) result = self.db.execute(insert_sql) if result != 1: return False, "sql execute result is %s " % result return True, {"api_no": api_no} def update_api_info(self, api_no, module_no, api_title, api_path, api_method, api_desc): if len(api_no) != 32: return False, "Bad api_no" if type(module_no) != int: return False , "Bad module_no" if check_path(api_path) is False: return False, "Bad api_path" if api_path.endswith("/") is False: return False, u"api path should end with /" if check_http_method(api_method) is False: return False, "Bad api_method" api_title = check_sql_character(api_title) api_desc = check_sql_character(api_desc) if len(api_desc) < 1: return False, "Bad api_desc" # 更新 api_info update_time = datetime.now().strftime(TIME_FORMAT) update_sql = "UPDATE %s SET module_no=%s,api_title='%s',api_path='%s',api_method='%s',api_desc='%s',update_time='%s' " \ "WHERE api_no='%s'; " \ % (self.api_info, module_no, api_title, api_path, api_method, api_desc, update_time, api_no) result = self.db.execute(update_sql) return True, "success" def set_api_update(self, api_no): update_time = datetime.now().strftime(TIME_FORMAT) update_sql = "UPDATE %s SET update_time='%s' WHERE api_no='%s';" % (self.api_info, update_time, api_no) self.db.execute(update_sql) return True def set_api_stage(self, api_no, stage): if len(api_no) != 32: return False, "Bad api_no" if stage <= 0 or stage > 5: return False, "Bad stage" update_time = datetime.now().strftime(TIME_FORMAT) update_sql = "UPDATE %s SET update_time='%s',stage=%s WHERE api_no='%s';" \ % (self.api_info, update_time, stage, api_no) self.db.execute(update_sql) return True, "success" def new_test_env(self, env_name, env_address): insert_sql = "INSERT INTO %s VALUES ('%s','%s');" % (self.test_env, env_name, env_address) self.db.execute(insert_sql) return True, "success" def new_api_header(self, api_no, header_params): if len(api_no) != 32: return False, "Bad api_no" value_sql = "VALUES " new_result = [] for key, value in header_params.items(): if check_char_num_underline(key) is False: return False, "Bad header param %s" % key if "necessary" not in value or "desc" not in value: return False, "Bad header param %s, need necessary and desc" % key if value["necessary"] != 0 and value["necessary"] != 1: return False, "Bad header param %s, necessary must be 0 or 1" % key value["desc"] = value["desc"][:1000] param_desc = check_sql_character(value["desc"]) add_time = datetime.now().strftime(TIME_FORMAT) value_sql += "('%s','%s',%s,'%s','%s')" \ % (api_no, key, value["necessary"], value["desc"], add_time) necessary = True if value["necessary"] == 1 else False new_result.append({"api_no": api_no, "necessary": necessary, "param": key, "desc": param_desc, "add_time": add_time}) if len(value_sql) < 8: return True insert_sql = "INSERT INTO %s (api_no,param,necessary,param_desc, add_time) %s " \ "ON DUPLICATE KEY UPDATE necessary=VALUES(necessary),param_desc=VALUES(param_desc),add_time=VALUES(add_time)" \ % (self.api_header, value_sql) result = self.db.execute(insert_sql) self.set_api_update(api_no) return True, new_result def new_api_body(self, api_no, body_params): if len(api_no) != 32: return False, "Bad api_no" new_result = [] value_sql = "VALUES " for key, value in body_params.items(): if check_char_num_underline(key) is False: return False, "Bad body param %s" % key if "necessary" not in value or "desc" not in value or "type" not in value: return False, "Bad body param %s, need necessary type desc" % key if value["necessary"] != 0 and value["necessary"] != 1: return False, "Bad body param %s, necessary must be 0 or 1" % key if check_char(value["type"], 1, 20) is False: return False, "Bad body param %s, type must a-z" % key param_desc = check_sql_character(value["desc"])[:1000] add_time = datetime.now().strftime(TIME_FORMAT) value_sql += "('%s','%s',%s,'%s','%s','%s')" \ % (api_no, key, value["necessary"], value["type"], param_desc, add_time) necessary = True if value["necessary"] == 1 else False new_result.append({"api_no": api_no, "necessary": necessary, "param": key, "desc": param_desc, "type": value["type"], "add_time": add_time}) if len(value_sql) < 8: return True insert_sql = "INSERT INTO %s (api_no,param,necessary,type,param_desc,add_time) %s " \ "ON DUPLICATE KEY UPDATE necessary=VALUES(necessary),param_desc=VALUES(param_desc),type=VALUES(type)" \ % (self.api_body, value_sql) result = self.db.execute(insert_sql) self.set_api_update(api_no) return True, new_result def new_predefine_param(self, api_no, param, param_type, add_time=None): if len(api_no) != 32: return False, "Bad api_no" if param_type not in ("header", "body"): return False, "Bad param_type" if add_time is None: add_time = datetime.now().strftime(TIME_FORMAT) r_data = {"api_no": api_no, "param": param, "param_type": param_type, "add_time": add_time} result = self.db.execute_insert(self.predefine_param, r_data, ignore=True) r_data["result"] = result return True, r_data def new_api_input(self, api_no, input_examples): if len(api_no) != 32: return False, "Bad api_no" new_result = [] value_sql = "VALUES " for item in input_examples: if "desc" not in item or "example" not in item: return False, "input example need desc and example" input_desc = check_sql_character(item["desc"])[:550] input_example = check_sql_character(item["example"]) if len(input_desc) < 1: return False, "Bad input_desc" if len(input_example) < 1: return False, "Bad input_example" input_no = uuid.uuid1().hex add_time = datetime.now().strftime(TIME_FORMAT) value_sql += "('%s','%s','%s','%s','%s')" % (input_no,api_no, input_desc, input_example, add_time) new_result.append({"api_no": api_no, "input_no": input_no, "desc": input_desc, "example": input_example, "add_time": add_time}) if len(value_sql) < 8: return True insert_sql = "INSERT INTO %s (input_no,api_no,input_desc,input_example,add_time) %s" % (self.api_input, value_sql) result = self.db.execute(insert_sql) if result != 1: return False, "sql execute result is %s " % result self.set_api_update(api_no) return True, new_result def new_api_output(self, api_no, output_examples): if len(api_no) != 32: return False, "Bad api_no" new_result = [] value_sql = "VALUES " for item in output_examples: if "desc" not in item or "example" not in item: return False, "output example need desc and example" output_desc = check_sql_character(item["desc"])[:550] output_example = check_sql_character(item["example"]) if len(output_desc) < 1: return False, "Bad output_desc" if len(output_example) < 1: return False, "Bad output_example" output_no = uuid.uuid1().hex add_time = datetime.now().strftime(TIME_FORMAT) value_sql += "('%s','%s','%s','%s','%s')" % (output_no,api_no, output_desc, output_example, add_time) new_result.append({"api_no": api_no, "output_no": output_no, "desc": output_desc, "example": output_example, "add_time": add_time}) if len(value_sql) < 8: return True insert_sql = "INSERT INTO %s (output_no,api_no,output_desc,output_example,add_time) %s" \ % (self.api_output, value_sql) result = self.db.execute(insert_sql) if result != 1: return False, "sql execute result is %s " % result self.set_api_update(api_no) return True, new_result def new_api_care(self, api_no, user_name, care_level=2): if len(api_no) != 32: return False, "Bad api_no" care_time = datetime.now().strftime(TIME_FORMAT) insert_sql = "INSERT INTO %s (api_no,user_name,care_time,level) VALUES('%s','%s','%s',%s)" \ " ON DUPLICATE KEY UPDATE care_time=VALUES(care_time);" \ % (self.api_care, api_no, user_name, care_time, care_level) result = self.db.execute(insert_sql) if result < 1: return False, "sql execute result is %s " % result return True, {"user_name": user_name, "api_no": api_no, "care_time": care_time} def new_module_care(self, module_no, user_name, care_level=2): if type(module_no) != int: return False, "Bad module_no" care_time = datetime.now().strftime(TIME_FORMAT) insert_sql = "INSERT INTO %s (module_no,user_name,care_time,level) VALUES('%s','%s','%s',%s)" \ " ON DUPLICATE KEY UPDATE care_time=VALUES(care_time);" \ % (self.module_care, module_no, user_name, care_time, care_level) result = self.db.execute(insert_sql) if result < 1: return False, "sql execute result is %s " % result return True, {"user_name": user_name, "module_no": module_no, "care_time": care_time} def new_send_message(self, send_user, rec_user, content): content = check_sql_character(content) rec_user_s = ",".join(rec_user)[:500] send_time = int(time()) insert_sql = "INSERT INTO %s (send_user,rec_user,send_time,content) VALUES ('%s','%s',%s,'%s');" \ % (self.send_message, send_user, rec_user_s, send_time, content) self.db.execute(insert_sql) return True, "success" def get_test_env(self, env_no_list=None): if env_no_list is None: select_sql = "SELECT env_no,env_name,env_address FROM %s;" % self.test_env elif type(env_no_list) == list and len(env_no_list) >= 1 and len(env_no_list) <= 5: union_sql_list = [] for env_no in env_no_list: if type(env_no) != int: return False, "Bad env_no_list" part_select_sql = "SELECT env_no,env_name,env_address FROM %s WHERE env_no=%s" % (self.test_env, env_no) union_sql_list.append(part_select_sql) select_sql = " UNION ".join(union_sql_list) else: return False, "Bad env_no_list" self.db.execute(select_sql) db_result = self.db.fetchall() env_info = [] for item in db_result: env_info.append({"env_no": item[0], "env_name": item[1], "env_address": item[2]}) return True, env_info def get_part_list(self, user_name): select_sql = "SELECT part_no,part_name,part_desc,part_detail FROM %s;" % self.api_part_info self.db.execute(select_sql) part_list = [] for item in self.db.fetchall(): part_list.append({"part_no": item[0], "part_name": item[1], "part_desc": item[2], "part_detail": item[3]}) return part_list def get_part_api(self, user_name): part_list = self.get_part_list(user_name) for api_part in part_list: result, module_list= self.get_module_list(part_no=api_part["part_no"]) api_part["module_list"] = module_list return True, part_list def get_module_list(self, part_no=None): select_sql = "SELECT module_no,module_name,module_prefix,module_desc,module_part,module_env " \ "FROM %s WHERE module_part=%s;" % (self.api_module, part_no) self.db.execute(select_sql) module_list = [] for item in self.db.fetchall(): info = {"module_no": item[0], "module_name": item[1], "module_prefix": item[2], "module_desc": item[3], "module_part": item[4], "module_env": item[5]} module_list.append(info) return True, module_list def get_module_care_list(self, module_no): # 获得关注列表 select_sql = "SELECT module_no,c.user_name,care_time,nick_name,level,email FROM sys_user as su,%s as c " \ "WHERE su.user_name=c.user_name AND module_no='%s';" % (self.module_care, module_no) self.db.execute(select_sql) care_info = [] for item in self.db.fetchall(): care_info.append({"module_no": item[0], "user_name": item[1], "care_time": item[2].strftime(TIME_FORMAT), "nick_name": item[3], "level": item[4], "email": item[5]}) return care_info def get_api_basic_info(self, api_no): # get basic info basic_info_col = ("module_no", "api_no", "api_title", "api_path", "api_method", "api_desc", "add_time", "update_time", "module_name", "module_prefix", "module_desc", "module_env", "stage") select_sql = "SELECT m.%s FROM %s AS i, api_module AS m WHERE i.module_no=m.module_no AND api_no='%s';" \ % (",".join(basic_info_col), self.api_info, api_no) result = self.db.execute(select_sql) if result <= 0: return False, "Not Exist api_no" db_info = self.db.fetchone() basic_info = {} for i in range(len(db_info)): basic_info[basic_info_col[i]] = db_info[i] if basic_info["stage"] >= len(self.api_stage_desc) or basic_info["stage"] < 0: return False, "Not Exist api_no" basic_info["stage"] = self.api_stage_desc[basic_info["stage"]] basic_info["api_url"] = basic_info["module_prefix"].rstrip("/") + "/" + basic_info["api_path"].lstrip("/") basic_info["add_time"] = basic_info["add_time"].strftime(TIME_FORMAT) if basic_info["add_time"] is not None else "" basic_info["update_time"] = basic_info["update_time"].strftime(TIME_FORMAT) if basic_info["update_time"] is not None else "" return True, basic_info def get_api_output(self, api_no): # 获得返回示例 select_sql = "SELECT output_no,api_no,output_desc,output_example FROM %s WHERE api_no='%s' ORDER BY add_time;" \ % (self.api_output, api_no) self.db.execute(select_sql) output_info = [] for item in self.db.fetchall(): output_info.append({"output_no": item[0], "api_no": item[1], "output_desc": item[2], "output_example": item[3]}) return output_info def get_api_care_info(self, api_no): # 获得关注列表 select_sql = "SELECT api_no,c.user_name,care_time,nick_name,level,email FROM sys_user as su,%s as c " \ "WHERE su.user_name=c.user_name AND api_no='%s';" % (self.api_care, api_no) self.db.execute(select_sql) care_info = [] for item in self.db.fetchall(): care_info.append({"api_no": item[0], "user_name": item[1], "care_time": item[2].strftime(TIME_FORMAT), "nick_name": item[3], "level": item[4], "email": item[5]}) return care_info def get_api_info(self, api_no): if len(api_no) != 32: return False, "Bad api_no" # get basic info result, basic_info = self.get_api_basic_info(api_no) if result is False: return False, basic_info # 获得请求头部参数列表 select_sql = "SELECT api_no,param,necessary,param_desc FROM %s WHERE api_no='%s' ORDER BY add_time;" \ % (self.api_header, api_no) self.db.execute(select_sql) header_info = [] for item in self.db.fetchall(): necessary = True if item[2] == "\x01" else False header_info.append({"api_no": item[0], "param": item[1], "necessary": necessary, "param_desc": item[3]}) # 获得请求主体参数列表 select_sql = "SELECT api_no,param,necessary,type,param_desc FROM %s WHERE api_no='%s' ORDER BY add_time;" \ % (self.api_body, api_no) self.db.execute(select_sql) body_info = [] for item in self.db.fetchall(): necessary = True if item[2] == "\x01" else False body_info.append({"api_no": item[0], "param": item[1], "necessary": necessary, "type": item[3], "param_desc": item[4]}) # 获得预定义参数列表 select_sql = "SELECT param,param_type FROM %s WHERE api_no='%s' ORDER BY add_time;" % (self.predefine_param, api_no) self.db.execute(select_sql) predefine_param = {"header": [], "body": []} for item in self.db.fetchall(): if item[1] in predefine_param: predefine_param[item[1]].append(item[0]) # 获得预定义头部参数信息 select_sql = "SELECT param,necessary,param_desc FROM %s;" % self.predefine_header self.db.execute(select_sql) predefine_header = {} for item in self.db.fetchall(): necessary = True if item[1] == "\x01" else False predefine_header[item[0]] = {"param": item[0], "necessary": necessary, "param_desc": item[2]} # 获得预定义头部主体信息 select_sql = "SELECT param,necessary,type,param_desc FROM %s;" % self.predefine_body self.db.execute(select_sql) predefine_body = {} for item in self.db.fetchall(): necessary = True if item[1] == "\x01" else False predefine_body[item[0]] = {"param": item[0], "type": item[2], "necessary": necessary, "param_desc": item[3]} # 获得请求示例 select_sql = "SELECT input_no,api_no,input_desc,input_example FROM %s WHERE api_no='%s' ORDER BY add_time;" \ % (self.api_input, api_no) self.db.execute(select_sql) input_info = [] for item in self.db.fetchall(): input_info.append({"input_no": item[0], "api_no": item[1], "input_desc": item[2], "input_example": item[3]}) # 获得返回示例 output_info = self.get_api_output(api_no) # 获得关注列表 care_info = self.get_api_care_info(api_no) return True, {"basic_info": basic_info, "header_info": header_info, "body_info": body_info, "input_info": input_info, "output_info": output_info, "care_info": care_info, "predefine_param": predefine_param, "predefine_header": predefine_header, "predefine_body": predefine_body} def get_api_list(self, module_no): if type(module_no) != int: return False, "Bad module_no" select_sql = "SELECT api_no,module_no,api_title,api_path,api_method,api_desc,stage FROM %s " \ "WHERE module_no=%s AND stage<4 ORDER BY stage, api_path, api_method;" % (self.api_info, module_no) self.db.execute(select_sql) api_list = [] for item in self.db.fetchall(): if item[6] >= len(self.api_stage_desc) or item[6] < 0: continue api_stage = self.api_stage_desc[item[6]] api_list.append({"api_no": item[0], "module_no": item[1], "api_title": item[2], "api_path": item[3], "api_method": item[4], "api_desc": item[5], "stage": api_stage}) care_info = self.get_module_care_list(module_no) return True, {"api_list": api_list, "care_info": care_info, "module_info": {"module_no": module_no}} def del_api_header(self, api_no, param): if len(api_no) != 32: return False, "Bad api_no" delete_sql = "DELETE FROM %s WHERE api_no='%s' AND param='%s';" % (self.api_header, api_no, param) result = self.db.execute(delete_sql) self.set_api_update(api_no) return True, result def del_api_body(self, api_no, param): if len(api_no) != 32: return False, "Bad api_no" delete_sql = "DELETE FROM %s WHERE api_no='%s' AND param='%s';" % (self.api_body, api_no, param) result = self.db.execute(delete_sql) return True, result def del_predefine_param(self, api_no, param): if len(api_no) != 32: return False, "Bad api_no" where_value = {"api_no": api_no, "param": param} result = self.db.execute_delete(self.predefine_param, where_value) where_value["result"] = result return True, where_value def del_api_input(self, input_no): if len(input_no) != 32: return False, "Bad input_no" delete_sql = "DELETE FROM %s WHERE input_no='%s';" % (self.api_input, input_no) result = self.db.execute(delete_sql) return True, result def del_api_output(self, output_no): if len(output_no) != 32: return False, "Bad output_no" delete_sql = "DELETE FROM %s WHERE output_no='%s';" % (self.api_output, output_no) result = self.db.execute(delete_sql) return True, result def del_api_care(self, api_no, user_name): if len(api_no) != 32: return False, "Bad api_no" delete_sql = "DELETE FROM %s WHERE api_no='%s' AND user_name='%s' AND level <> 0;" % (self.api_care, api_no, user_name) result = self.db.execute(delete_sql) return True, result def del_module_care(self, module_no, user_name, level=2): if type(module_no) != int: return False, "Bad module_no" delete_sql = "DELETE FROM %s WHERE module_no='%s' AND user_name='%s' AND level=%s;" \ % (self.module_care, module_no, user_name, level) result = self.db.execute(delete_sql) return True, result def del_api_info(self, api_no, user_name): if len(api_no) != 32: return False, "Bad api_no" select_sql = "SELECT level FROM %s WHERE api_no='%s' AND user_name='%s' AND level=0;" \ % (self.api_care, api_no, user_name) result = self.db.execute(select_sql) if result <= 0: return False, "user can not delete this api" self.set_api_stage(api_no, 5) update_sql = "UPDATE %s SET level=3 WHERE api_no='%s' AND user_name='%s';" \ % (self.api_care, api_no, user_name) self.db.execute(update_sql) return True, result def del_api_other_info(self, api_no): delete_sql_format = "DELETE FROM %s WHERE api_no='" + api_no + "';" for t in (self.api_header, self.api_input, self.api_body, self.api_output): delete_sql = delete_sql_format % t self.db.execute(delete_sql) return True, "success"
class ProjectManager: def __init__(self): self.db = DB() self.t_project = "project_info" self.t_user_project = "user_project" def insert_user_project(self, project_no, user_name, project_role): join_time = int(time()) kwargs = { "user_name": user_name, "project_no": project_no, "project_role": project_role, "join_time": join_time } result = self.db.execute_insert(self.t_user_project, kwargs=kwargs, ignore=True) return result def update_user_project(self, project_no, user_name, project_role): result = self.db.execute_update( self.t_user_project, update_value={"project_role": project_role}, where_value={ "user_name": user_name, "project_no": project_no }) return result def new_project_info(self, user_name, project_name, project_desc): project_no = uuid1().hex result = self.insert_user_project(project_no, user_name, 0) if result <= 0: return False, "用户仅允许参加一个项目" create_time = int(time()) p_info = { "project_no": project_no, "project_name": project_name, "project_desc": project_desc, "create_time": create_time } self.db.execute_insert(self.t_project, kwargs=p_info) return True, p_info def update_project_info(self, project_no, project_name, project_desc): self.db.execute_update(self.t_project, update_value={ "project_name": project_name, "project_desc": project_desc }, where_value={"project_no": project_no}) return True, "success" def get_project(self, user_name): cols = ["project_no", "project_role", "join_time"] join_ps = self.db.execute_select(self.t_user_project, where_value={"user_name": user_name}, cols=cols, package=True) if len(join_ps) <= 0: return None my_project = join_ps[0] cols = ["project_name", "project_desc", "create_time"] p_info = self.db.execute_select( self.t_project, where_value={"project_no": my_project["project_no"]}, cols=cols, package=True) my_project.update(p_info[0]) return my_project def get_project_user(self, project_no): cols = ["user_name", "project_role", "join_time"] members = self.db.execute_select( self.t_user_project, where_value={"project_no": project_no}, cols=cols, package=True) return True, members def insert_project_member(self, project_no, member_no, add_user): kwargs = dict(project_no=project_no, member_no=member_no, add_user=add_user, add_time=int(time())) self.db.execute_insert("project_members", kwargs=kwargs) return True, "添加成功"
class ItemManager(object): def __init__(self): self.db = DB() self.t_item = "billing_item" def insert_item(self, project_no, item_no, item_name, unit_price, member_price): kwargs = dict(project_no=project_no, item_no=item_no, item_name=item_name, billing_method=1, billing_unit=1, unit_price=unit_price, member_price=member_price) l = self.db.execute_insert(self.t_item, kwargs=kwargs, ignore=True) if l <= 0: return False, l return True, kwargs def new_item(self, project_no, item_name, unit_price=0, member_price=None, basic_item=None): unit_price *= 100 if member_price is None: member_price = unit_price else: member_price *= 100 where_value = dict(project_no=project_no) if basic_item is None: self.db.execute_select(self.t_item, where_value=where_value, cols=["MAX(item_no)"]) max_no = self.db.fetchone()[0] if max_no is None: item_no = 100 else: item_no = (max_no / 100 + 1) * 100 else: basic_item = basic_item / 100 * 100 next_basic_item = basic_item + 100 where_cond = [ "item_no >= %s" % basic_item, "item_no < %s" % next_basic_item ] self.db.execute_select(self.t_item, where_value=where_value, cols=["MAX(item_no)"], where_cond=where_cond) max_no = self.db.fetchone()[0] if max_no is None: return False, "无效的主分类" item_no = max_no + 1 if item_no >= next_basic_item: return False, "主分类下最多添加99个子分类" return self.insert_item(project_no, item_no, item_name, unit_price, member_price) def select_item(self, project_no): cols = [ "item_no", "item_name", "billing_method", "billing_unit", "unit_price", "member_price" ] db_items = self.db.execute_select( self.t_item, where_value={"project_no": project_no}, cols=cols, package=True) for item in db_items: item["unit_price"] /= 100.00 item["member_price"] /= 100.00 return True, db_items
class ExpressDB: def __init__(self): self.db = DB() self.db.connect() self.wx = WxManager() self.uDB = UserDB() self.completed_express = "completed_express" self.transport_express = "transport_express" self.history_express = "history_express" self.listen_express = "listen_express" self.pre_listen = "pre_listen" self.express_com = "express_com" def new_express_record(self, com_code, waybill_num, recodes, user_no, completed=False): if len(recodes) <= 0: return True insert_sql = "INSERT INTO %s (com_code,waybill_num,sign_time,sign_info,user_no,add_time) VALUES " \ % (self.completed_express if completed is True else self.transport_express) now_time = datetime.now().strftime(TIME_FORMAT) for recode in recodes: insert_sql += "('%s','%s','%s','%s',%s,'%s')," % (com_code, waybill_num, recode["time"], recode["info"], user_no, now_time) insert_sql = insert_sql[:-1] + ";" self.db.execute(insert_sql) return True def new_history_record(self, listen_no, com_code, waybill_num, remark, user_no): now_time = datetime.now().strftime(TIME_FORMAT) insert_sql = "INSERT INTO %s (listen_no,com_code, waybill_num,completed_time,remark,user_no) " \ "VALUES (%s,'%s','%s','%s','%s', %s);" \ % (self.history_express, listen_no, com_code, waybill_num, now_time, remark, user_no) self.db.execute(insert_sql) return True def del_express_record(self, com_code, waybill_num, user_no): del_sql = "DELETE FROM %s WHERE com_code='%s' AND waybill_num='%s' AND user_no=%s;" % (self.transport_express, com_code, waybill_num, user_no) self.db.execute(del_sql) return True def new_listen_record(self, com_code, waybill_num, remark, user_no): now_time = datetime.now().strftime(TIME_FORMAT) insert_sql = "INSERT INTO %s (com_code, waybill_num,update_time,query_time,remark,user_no) " \ "VALUES ('%s','%s','%s','%s','%s', %s);" \ % (self.listen_express, com_code, waybill_num, now_time, now_time, remark, user_no) self.db.execute(insert_sql) return True def update_listen_record(self, com_code, waybill_num, user_no, update=False, query=False): if update is False and query is False: return True update_sql = "UPDATE %s SET " % self.listen_express now_time = datetime.now().strftime(TIME_FORMAT) if update is True: update_sql += "update_time='%s'," % now_time if query is True: update_sql += "query_time='%s'," % now_time update_sql = update_sql[:-1] + " WHERE com_code='%s' AND waybill_num='%s' AND user_no=%s;" % (com_code, waybill_num, user_no) self.db.execute(update_sql) return True def del_listen_record(self, com_code, waybill_num, user_no): del_sql = "DELETE FROM %s WHERE com_code='%s' AND waybill_num='%s' AND user_no=%s;" % (self.listen_express, com_code, waybill_num, user_no) self.db.execute(del_sql) return True def select_listen_record(self, user_no, listen_no=None): select_sql = "SELECT listen_no,l.com_code,waybill_num,remark,com_name FROM %s AS l,%s AS c WHERE user_no=%s " \ "AND l.com_code=c.com_code" % (self.listen_express, self.express_com, user_no) if listen_no is not None: select_sql += " AND listen_no=%s" % listen_no select_sql += ";" result = self.db.execute(select_sql) listen_info = [] for item in self.db.fetchall(): listen_info.append({"listen_no": item[0], "com_code": item[1], "waybill_num": item[2], "remark": item[3], "com_name": item[4]}) return listen_info def check_listen_record(self, com_code, waybill_num, user_no): select_sql = "SELECT listen_no FROM %s WHERE com_code='%s' AND waybill_num='%s' AND user_no=%s;" % (self.listen_express, com_code, waybill_num, user_no) result = self.db.execute(select_sql) if result > 0: return True return False def new_pre_listen(self, listen_key, com_code, waybill_num, remark, user_no, query_result): insert_value = {"listen_key": listen_key, "com_code": com_code, "waybill_num": waybill_num, "remark": remark, "user_no": user_no, "insert_time": datetime.now().strftime(TIME_FORMAT), "query_result": json.dumps(query_result)} self.db.execute_insert(self.pre_listen, args=insert_value) return True def select_pre_listen(self, listen_key, user_no): select_sql = "SELECT p.com_code,waybill_num,remark,query_result,com_name FROM %s AS p,%s AS c " \ "WHERE p.com_code=c.com_code AND listen_key='%s' AND user_no=%s;"\ % (self.pre_listen, self.express_com, listen_key, user_no) result = self.db.execute(select_sql) if result <= 0: return None db_r = self.db.fetchone() return {"com_code": db_r[0], "waybill_num": db_r[1], "remark": db_r[2], "query_result": db_r[3], "com_name": db_r[4]} def select_record_info(self, user_no, com_code, waybill_num): select_sql = "SELECT sign_time,sign_info,add_time FROM %s WHERE com_code='%s' AND waybill_num='%s' AND user_no=%s;" \ % (self.transport_express, com_code, waybill_num, user_no) self.db.execute(select_sql) records = [] for item in self.db.fetchall(): records.append({"time": item[0].strftime(TIME_FORMAT), "info": item[1], "add_time": item[2].strftime(TIME_FORMAT)}) return records def del_pre_listen(self, listen_key, user_no): select_sql = "DELETE FROM %s WHERE listen_key='%s' AND user_no='%s';" % (self.pre_listen, listen_key, user_no) result = self.db.execute(select_sql) if result <= 0: return False return True def select_com(self, com="", like=True): try: if com == "": select_sql = "SELECT com_name,com_code FROM express_com;" elif like is True: select_sql = "SELECT com_name,com_code FROM express_com WHERE com_name LIKE '%%%s%%' " \ "OR com_code LIKE '%%%s%%';" % (com, com) else: select_sql = "SELECT com_name,com_code FROM express_com WHERE com_code='%s';" % com self.db.execute(select_sql) com_info = [] for item in self.db.fetchall(): com_info.append({"com_name": item[0], "com_code": item[1]}) return com_info except Exception as e: print(e.args) return [] def send_wx(self, user_name, openid, status, com_code, waybill, remark, records): # 获得快递公司名称 com_name = self.select_com(com_code, False)[0]["com_name"] part_records = [] len_info = len(records) for index in range(0, 3): if 3 - index > len_info: part_records.append({"time": "", "info": ""}) continue part_records.append(records[len_info + index - 3]) self.wx.send_express_template(user_name, openid, status, com_name, com_code, waybill, remark, part_records) def loop_query(self): eq = ExpressQuery() # 最后最晚查询过的一条记录 select_sql = "SELECT com_code,waybill_num,query_time,update_time,user_no,remark,listen_no FROM listen_express WHERE query_time = (SELECT MIN(query_time) FROM listen_express);" result = self.db.execute(select_sql) if result <= 0: print("%s No Listen Record." % datetime.now().strftime(TIME_FORMAT)) return record = self.db.fetchone() if record[0] is None: print("%s No Listen Record" % datetime.now().strftime(TIME_FORMAT)) return com_code = record[0] waybill_num = record[1] update_time = record[3] user_no = record[4] remark = record[5] listen_no = record[6] user_info = self.uDB.select_user(user_no) openid = user_info["openid"] user_name = user_info["user_name"] print("%s Start Handle %s %s" % (datetime.now().strftime(TIME_FORMAT), com_code, waybill_num)) # 查询现在快递状态 query_result = eq.query(com_code, waybill_num) if query_result["completed"] is True: print("%s %s %s completed" % (datetime.now().strftime(TIME_FORMAT), com_code, waybill_num)) # 通知用户完成 self.send_wx(user_name, openid, "completed", com_code, waybill_num, remark, query_result["express_info"]) # 删除transport_express中对应的记录 self.del_express_record(com_code, waybill_num, user_no) # 删除listen_express中对应的记录 self.del_listen_record(com_code, waybill_num, user_no) # 将全部记录记入completed_express self.new_express_record(com_code, waybill_num, query_result["express_info"], user_no, True) # 将监听记录插入history_express self.new_history_record(listen_no, com_code, waybill_num, remark, user_no) return express_info = query_result["express_info"] if len(express_info) <= 0: return # 查询数据库中已有记录进行比对 select_sql = "SELECT MAX(sign_time) FROM transport_express WHERE com_code='%s' AND waybill_num='%s' AND user_no=%s;" % (com_code, waybill_num, user_no) result = self.db.execute(select_sql) max_sign_time = None if result > 0: max_sign_time = self.db.fetchone()[0] if max_sign_time is not None and max_sign_time >= datetime.strptime(express_info[-1]["time"], TIME_FORMAT): # 没有更新的快递信息 # 判断是否超过5天没有更新记录 if (datetime.now() - update_time).days >= 5: print("%s Long time no info" % datetime.now().strftime(TIME_FORMAT)) # 通知用户 self.send_wx(user_name, openid, "exception", com_code, waybill_num, remark, express_info) # 删除transport_express中对应的记录 self.del_express_record(com_code, waybill_num, user_no) # 删除listen_express中对应的记录 self.del_listen_record(com_code, waybill_num, user_no) else: # 更新 query_time self.update_listen_record(com_code, waybill_num, user_no, False, True) else: print("%s %s %s has new info." % (datetime.now().strftime(TIME_FORMAT), com_code, waybill_num)) # 通知用户 self.send_wx(user_name, openid, "transport", com_code, waybill_num, remark, express_info) # 添加运输记录 add_record = [] for record in express_info: if max_sign_time is None or max_sign_time < datetime.strptime(record["time"], TIME_FORMAT): add_record.append(record) self.new_express_record(com_code, waybill_num, add_record, user_no, False) # 更新update_time query_time self.update_listen_record(com_code, waybill_num, user_no, True, True)
class ReleaseManager: def __init__(self, release_dir): self.db = DB() self.release_task = "release_task" self.basic_time = datetime.strptime("2016-09-02 00:00:00", TIME_FORMAT) self.latest_branch = "master" self.api_work_dir = release_dir + "/ih_GATCAPI" self.web_work_dir = release_dir + "/ih_GATCWeb" self.api_task = TaskManager(3) self.web_task = TaskManager(4) self.pull_request_man = PullRequestManager() self.wx = WeiXinManager(wx_service) def new_release_task(self, user_name, reason, restart_service, reason_desc): # return False, "领导禁止重启" release_time = datetime.now() - self.basic_time release_no = release_time.seconds / 3600 + release_time.days * 24 status_info = "%s1" % int(time()) args = dict(release_no=release_no, user_name=user_name, reason=reason, restart_service=restart_service, reason_desc=reason_desc, status_info=status_info) result = self.db.execute_insert(self.release_task, args=args, ignore=True) if result <= 0: return False, u"任务已存在" return True, args def update_release_task(self, release_no, run_result=True): status_info = "|%s%s" % (int(time()), 1 if run_result is True else 0) update_sql = "UPDATE %s SET status_info=CONCAT(status_info, '%s') WHERE release_no=%s;" \ % (self.release_task, status_info, release_no) self.db.execute(update_sql) return True, "success" def select_release_task(self, user_name=None): release_time = datetime.now() - self.basic_time min_release_no = release_time.days * 24 cols = ["release_no", "user_name", "restart_service", "reason", "reason_desc", "status_info"] if user_name is None: zero = 1 else: zero = 0 select_sql = "SELECT %s FROM %s WHERE release_no>=%s AND (user_name='%s' OR %s) ORDER BY release_no DESC;" \ % (",".join(cols), self.release_task, min_release_no, user_name, zero) self.db.execute(select_sql) db_r = self.db.fetchall() task_list = [] for item in db_r: task_info = {} for i in range(len(cols)): task_info[cols[i]] = item[i] task_list.append(task_info) return True, task_list def send_wx_msg(self, msg): result, user_list = self.wx.user_info() if result is False: return False, user_list for user_info in user_list: # self.wx.send_status(u"后台开发", "ochiws2EiR0cq3qzXYjQkw0m9jdE", "Test", msg) # break if user_info["groupid"] == 100: self.wx.send_status(u"后台开发", user_info["openid"], "Test", msg) elif user_info["groupid"] == 101: self.wx.send_status(u"前端开发", user_info["openid"], "Test", msg) elif user_info["groupid"] == 102: self.wx.send_status(u"产品设计", user_info["openid"], "Test", msg) return True, "success" def select_api_pull_request(self): result, scheduler_info = self.api_task.select_scheduler_status() task_status = scheduler_info["task_status"] return self.pull_request_man.select_pull_request(action_no=task_status, repository="GATCAPI", merged=True, base_branch="master") def select_web_pull_request(self): result, scheduler_info = self.web_task.select_scheduler_status() task_status = scheduler_info["task_status"] return self.pull_request_man.select_pull_request(action_no=task_status, repository="GATCWeb", merged=True, base_branch="master") def _restart_api(self): _pull_code(self.api_work_dir, self.latest_branch) with cd(self.api_work_dir): run('rm -rf *.log') run("sh stop.sh") run('ssh service "sh /home/msg/GATCAPI/restart_service.sh"', quiet=True) run('nohup gunicorn -b 0.0.0.0:8100 -t 3600 -w 5 -k "gevent" --backlog 2048 -p "/tmp/api_gunicorn_test.pid" --chdir API run:app 1>> API.log 2>> API.log & sleep 3') run('cat /tmp/api_gunicorn_test.pid >> service.pid') self.api_task.update_scheduler_status(int(time()), "system", "restart ih api") def _restart_web(self): _pull_code(self.web_work_dir, self.latest_branch) with cd(self.web_work_dir): run('find -name "*.log" | xargs rm -rf') run("sh stop.sh") run('nohup gunicorn -b 0.0.0.0:9101 -t 3600 -w 5 -k "gevent" --backlog 2048 -p "/tmp/web_gunicorn_test.pid" --chdir Web2 Webstart:app 1>> WEB.log 2>> WEB.log & sleep 3') run('cat /tmp/web_gunicorn_test.pid >> service.pid') self.web_task.update_scheduler_status(int(time()), "system", "restart ih web") def _release_api(self, user_name, release_no, reason): reason_desc = u"%s 重启API测试环境 %s\n" % (user_name, reason) wx_msg = reason_desc # 获得提交的pull request信息 result, pull_requests = self.select_api_pull_request() if len(pull_requests) <= 0: return False, u"API无更新" else: wx_msg += u"API更新如下:\n" for i in range(len(pull_requests) - 1, -1, -1): wx_msg += u"%s、%s\n" % (i+1, pull_requests[i]["request_title"]) print("start restart") self._restart_api() self.update_release_task(release_no, True) print("start test") self.update_release_task(release_no, True) print("start push") _push_code(self.api_work_dir, reason_desc) self.update_release_task(release_no, True) self.send_wx_msg(wx_msg) return True, "success" def _release_web(self, user_name, release_no, reason): reason_desc = u"%s 重启WEB测试环境 %s\n" % (user_name, reason) wx_msg = reason_desc # 获得提交的pull request信息 result, pull_requests = self.select_web_pull_request() if len(pull_requests) <= 0: return False, u"WEB无更新" else: wx_msg += u"WEB更新如下:\n" for i in range(len(pull_requests) - 1, -1, -1): wx_msg += u"%s、%s\n" % (i+1, pull_requests[i]["request_title"]) print("start restart") self._restart_web() self.update_release_task(release_no, True) print("start test") self.update_release_task(release_no, True) print("start push") _push_code(self.web_work_dir, reason_desc) self.update_release_task(release_no, True) self.send_wx_msg(wx_msg) return True, "success" def _release_ih(self, user_name, release_no, reason): reason_desc = u"%s 重启API&WEB测试环境 %s\n" % (user_name, reason) wx_msg = reason_desc # 获得提交的pull request信息 result, pull_requests = self.select_web_pull_request() if len(pull_requests) <= 0: return False, u"WEB无更新" else: wx_msg += u"WEB更新如下:\n" for i in range(len(pull_requests) - 1, -1, -1): wx_msg += u"%s、%s\n" % (i+1, pull_requests[i]["request_title"]) result, pull_requests = self.select_api_pull_request() if len(pull_requests) <= 0: return False, u"API无更新" else: wx_msg += u"API更新如下:\n" for i in range(len(pull_requests) - 1, -1, -1): wx_msg += u"%s、%s\n" % (i+1, pull_requests[i]["request_title"]) print("start restart") self._restart_api() self._restart_web() self.update_release_task(release_no, True) print("start test") self.update_release_task(release_no, True) print("start push") _push_code(self.api_work_dir, reason_desc) _push_code(self.web_work_dir, reason_desc) self.update_release_task(release_no, True) self.send_wx_msg(wx_msg) return True, "success" def release_ih(self): # 获得任务 result, info = self.select_release_task() if result is False: return False, info if len(info) <= 0: return False, info release_time = datetime.now() - self.basic_time release_no = (release_time.seconds - 600) / 3600 + release_time.days * 24 if info[0]["release_no"] != release_no: return False, "No Task" restart_service = info[0]["restart_service"] user_name = info[0]["user_name"] reason = info[0]["reason"] print("start run release %s" % release_no) self.update_release_task(release_no, True) if restart_service == 0: return self._release_ih(user_name, release_no, reason) elif restart_service == 1: return self._release_api(user_name, release_no, reason) elif restart_service == 2: return self._release_web(user_name, release_no, reason) else: return False, "invalid restart service code"
class UserManager: def __init__(self): self.db = DB() self.user = "******" self._salt_password = "******" self.default_password = "******" self._data_role_desc = { "module_desc": u"数据传输", "role_list": { "market": { "role_desc": u"市场", "role_value": 1 }, "upload": { "role_desc": u"上传", "role_value": 2 }, "calc": { "role_desc": u"计算", "role_value": 4 } } } self._api_role_desc = { "module_desc": u"API文档", "role_list": { "api_look": { "role_desc": u"查看", "role_value": 8 }, "api_new": { "role_desc": u"新建", "role_value": 16 }, "api_module_new": { "role_desc": u"新建模块", "role_value": 8192 } } } self._table_role_desc = { "module_desc": u"数据表描述", "role_list": { "table_look": { "role_desc": u"查看", "role_value": 32 } } } self._right_role_desc = { "module_desc": u"权限列表", "role_list": { "right_look": { "role_desc": u"查看", "role_value": 64 }, "right_new": { "role_desc": u"新建", "role_value": 16384 } } } self._user_role_desc = { "module_desc": u"操作用户", "role_list": { "user_new": { "role_desc": u"新建", "role_value": 128 } } } self._bug_role_desc = { "module_desc": u"BUG操作", "role_list": { "bug_look": { "role_desc": u"查看", "role_value": 256 }, "bug_new": { "role_desc": u"新建", "role_value": 512 }, "bug_link": { "role_desc": u"被关联", "role_value": 1024 }, "bug_cancel": { "role_desc": u"取消", "role_value": 2048 }, "bug_del": { "role_desc": u"删除", "role_value": 4096 } } } self._status_code_role_desc = { "module_desc": u"API状态码", "role_list": { "status_code_look": { "role_desc": u"查看", "role_value": 32768 }, "status_code_new": { "role_desc": u"新建", "role_value": 65536 }, "status_code_del": { "role_desc": u"删除", "role_value": 131072 }, "status_code_module": { "role_desc": u"新建模块", "role_value": 524288 } } } self._log_role_desc = { "module_desc": u"晶云平台日志", "role_list": { "log_look": { "role_desc": u"查看", "role_value": 262144 }, "log_receive": { "role_desc": u"接收", "role_value": 1048576 } } } self._release_role_desc = { "module_desc": u"重新发布环境", "role_list": { "release_ih_N": { "role_desc": u"ih普通", "role_value": 2097152 }, "release_ih_V": { "role_desc": u"ihVIP", "role_value": 4194304 }, "release_ytj_N": { "role_desc": u"ytj普通", "role_value": 8388608 } } } self._param_role_desc = { "module_desc": u"晶云参数", "role_list": { "param_look": { "role_desc": u"查看", "role_value": 16777216 }, "param_new": { "role_desc": u"新建", "role_value": 33554432 }, "param_update": { "role_desc": u"更新", "role_value": 67108864 }, "param_del": { "role_desc": u"删除", "role_value": 134217728 } } } self.role_desc = { "data": self._data_role_desc, "api": self._api_role_desc, "table": self._table_role_desc, "right": self._right_role_desc, "user": self._user_role_desc, "bug": self._bug_role_desc, "status_code": self._status_code_role_desc, "log": self._log_role_desc, "release": self._release_role_desc, "param": self._param_role_desc } self.__init_role__() def __init_role__(self): self.role_value = {} for key, role_module in self.role_desc.items(): for role, value in role_module["role_list"].items(): self.role_value[role] = value["role_value"] def _md5_hash_password(self, account, password): md5_password = _md5_hash(account + password + account) return (md5_password + self._salt_password).upper() def _password_check(self, password, db_password, account): if len(password) <= 20: if len(db_password) == 66: if check_password_hash( db_password, self._md5_hash_password( account, password)) is True: return True return False def insert_user(self, user_name, password, tel=None): en_password = generate_password_hash( self._md5_hash_password(user_name, password)) result = self.db.execute_insert(self.user, kwargs={ "user_name": user_name, "password": en_password, "tel": tel }) return result def check(self, user_name, password): cols = ["user_name", "nick_name", "password", "tel", "role"] result = self.db.execute_select(self.user, where_value={"user_name": user_name}, cols=cols) if result <= 0: return False, "账户不存在" user_name, nick_name, db_password, tel, role = self.db.fetchone() if self._password_check(password, db_password, user_name) is False: return False, "密码不正确" u_info = { "user_name": user_name, "nick_name": nick_name, "tel": tel, "role": role } return True, u_info def check_vip(self, user_name): if user_name != "system": return False, 0 role = self.role_value["param_look"] return True, {"account": user_name, "role": role} def check_account_exist(self, user_name, check_name): if check_account_format(check_name) is False: return False, u"账户名仅允许数字和字母,下划线(_),而且必须以字母开头,用户名长度不得低于3位,不得高于20位" select_sql = "SELECT creator FROM %s WHERE user_name='%s';" % ( self.user, check_name) result = self.db.execute(select_sql) if result > 0: if self.db.fetchone()[0] == user_name: return False, u"您已注册过该用户" return False, u"该用户已被他人注册" return True, u"可以注册" def change_password(self, user_name, old_password, new_password): result, u_info = self.check(user_name, old_password) if result is False: return False, u_info en_password = generate_password_hash( self._md5_hash_password(user_name, new_password)) update_value = {"password": en_password} self.db.execute_update(self.user, update_value=update_value, where_value={"user_name": user_name}) return True, u"更新成功" def send_code(self, user_name, password, tel): change_url = "%s/code/bind/" try: res = requests.post(change_url, json={ "account": user_name, "password": password, "tel": tel }) except requests.ConnectionError as ce: return False, u"暂时无法发送,请稍后重试" r = res.json() if r["status"] == 2: return True, u"发送成功" if r["status"] == 10701: return False, u"请求频率过高,请稍后重试" if r["status"] == 10402: return False, u"手机号已被他人绑定,请更改还手机号" if r["status"] == 10801: return False, u"请求超过限制,请稍后重试" return False, r["message"] def bind_tel(self, user_name, password, tel, code): change_url = "%s/tel/" try: res = requests.post(change_url, json={ "account": user_name, "password": password, "tel": tel, "code": code }) except requests.ConnectionError as ce: return False, u"暂时绑定,请稍后重试" r = res.json() if r["status"] == 2: return True, u"绑定成功" if r["status"] == 10404: return False, u"验证码不正确,请重新输入" if r["status"] == 10405: return False, u"验证码已过期,请重新获得" if r["status"] == 10402: return False, u"手机号已被他人绑定,请更改还手机号" return False, r["message"] def clear_password(self, user_name, creator): update_sql = "UPDATE %s SET password=null WHERE user_name='%s' AND creator='%s';" % ( self.user, user_name, creator) self.db.execute(update_sql) return True, u"重置成功" def get_role_user(self, role): cols = [ "user_name", "role", "nick_name", "wx_id", "creator", "add_time", "email" ] select_sql = "SELECT %s FROM %s WHERE role & %s > 0;" \ % (",".join(cols), self.user, role) self.db.execute(select_sql) user_list = [] for item in self.db.fetchall(): info = {} for i in range(len(cols)): info[cols[i]] = item[i] info["add_time"] = info["add_time"].strftime(TIME_FORMAT) user_list.append(info) return True, user_list def my_user(self, user_name): select_sql = "SELECT user_name,role,nick_name,wx_id,creator,add_time FROM %s WHERE creator='%s';" \ % (self.user, user_name) self.db.execute(select_sql) user_list = [] for item in self.db.fetchall(): user_list.append({ "user_name": item[0], "role": item[1], "nick_name": item[2], "wx_id": item[3], "creator": item[4], "add_time": item[5].strftime(TIME_FORMAT) }) return True, user_list def get_user_info(self, user_name): select_sql = "SELECT user_name,role,nick_name,wx_id,creator,add_time,email FROM %s WHERE user_name='%s';" \ % (self.user, user_name) result = self.db.execute(select_sql) if result <= 0: return False, "user not exist" item = self.db.fetchone() user_info = { "user_name": item[0], "role": item[1], "nick_name": item[2], "wx_id": item[3], "creator": item[4], "add_time": item[5], "email": item[6] } return True, user_info def update_my_user_role(self, role, user_name, my_name): if type(role) != int: return False, "Bad role" update_sql = "UPDATE %s SET role=%s WHERE user_name='%s' AND creator='%s';" \ % (self.user, role, user_name, my_name) self.db.execute(update_sql) return True, "success" def _add_role_my_user(self, role, user_name, my_name): if type(role) != int: return False, "Bad role" update_sql = "UPDATE %s SET role=role | %s WHERE user_name='%s' AND creator='%s';" \ % (self.user, role, user_name, my_name) self.db.execute(update_sql) return True, "success" def add_role_my_users(self, role, user_names, my_name): if type(user_names) != list: return "Bad user_names" if len(user_names) == 0: return True, "no update" if len(user_names) == 1: return self.add_role_my_user(role, user_names, my_name) if type(role) != int: return False, "Bad role" update_sql = "UPDATE %s SET role=role | %s WHERE creator='%s' AND user_name in ('%s');" \ % (self.user, role, "','".join(user_names), my_name) self.db.execute(update_sql) return True, "success" def _remove_role_my_user(self, role, user_name, my_name): if type(role) != int: return False, "Bad role" update_sql = "UPDATE %s SET role=role & ~%s WHERE user_name='%s' AND creator='%s';" \ % (self.user, role, user_name, my_name) self.db.execute(update_sql) return True, "success" def remove_role_my_users(self, role, user_names, my_name): if type(user_names) != list: return "Bad user_names" if len(user_names) == 0: return True, "no update" if len(user_names) == 1: return self.add_role_my_user(role, user_names, my_name) if type(role) != int: return False, "Bad role" update_sql = "UPDATE %s SET role=role & ~%s WHERE creator='%s' AND user_name in ('%s');" \ % (self.user, role, "','".join(user_names), my_name) self.db.execute(update_sql) return True, "success"