From f6941b19940b872488ee24a1f0cb483b03d20695 Mon Sep 17 00:00:00 2001 From: ping <1017253325@qq.com> Date: Thu, 31 Jul 2025 15:37:38 +0800 Subject: [PATCH] update --- b/product/company_category_add.dspy | 34 +++++++ b/product/company_category_delete.dspy | 18 ++++ b/product/company_category_search.dspy | 34 +++++++ b/product/company_category_update.dspy | 18 ++++ b/product/product_category_add.dspy | 36 +++++++ b/product/product_category_delete.dspy | 18 ++++ b/product/product_category_search.dspy | 40 ++++++++ b/product/product_category_update.dspy | 18 ++++ b/product/publish_product_add.dspy | 94 +++++++++++++++++++ b/product/publish_product_search.dspy | 68 ++++++++++++++ .../publish_product_search_first_page.dspy | 44 +++++++++ b/product/requirement_add.dspy | 35 +++++++ b/product/requirement_delete.dspy | 21 +++++ b/product/requirement_search.dspy | 93 ++++++++++++++++++ b/product/requirement_update.dspy | 23 +++++ 15 files changed, 594 insertions(+) create mode 100644 b/product/company_category_add.dspy create mode 100644 b/product/company_category_delete.dspy create mode 100644 b/product/company_category_search.dspy create mode 100644 b/product/company_category_update.dspy create mode 100644 b/product/product_category_add.dspy create mode 100644 b/product/product_category_delete.dspy create mode 100644 b/product/product_category_search.dspy create mode 100644 b/product/product_category_update.dspy create mode 100644 b/product/publish_product_add.dspy create mode 100644 b/product/publish_product_search.dspy create mode 100644 b/product/publish_product_search_first_page.dspy create mode 100644 b/product/requirement_add.dspy create mode 100644 b/product/requirement_delete.dspy create mode 100644 b/product/requirement_search.dspy create mode 100644 b/product/requirement_update.dspy diff --git a/b/product/company_category_add.dspy b/b/product/company_category_add.dspy new file mode 100644 index 0000000..4494e51 --- /dev/null +++ b/b/product/company_category_add.dspy @@ -0,0 +1,34 @@ +async def company_category_add(ns={}): + ns_dic = { + 'id': uuid(), + 'company_category': ns.get('company_category') + } + if ns.get('userid'): + userid = ns.get('userid') + else: + userid = await get_user() + db = DBPools() + async with db.sqlorContext('kboss') as sor: + # 区分运营和普通客户 + user_list = await sor.R('users', {'id': userid}) + if not user_list: + return { + 'status': False, + 'msg': '没有找到匹配的用户' + } + orgid = user_list[0]['orgid'] + ns_dic['orgid'] = orgid + try: + await sor.C('user_publish_company_category', ns_dic) + return { + 'status': True, + 'msg': 'Company category created successfully' + } + except Exception as e: + return { + 'status': False, + 'msg': 'Failed to create company category, %s' % str(e) + } + +ret = await company_category_add(params_kw) +return ret \ No newline at end of file diff --git a/b/product/company_category_delete.dspy b/b/product/company_category_delete.dspy new file mode 100644 index 0000000..954d8f2 --- /dev/null +++ b/b/product/company_category_delete.dspy @@ -0,0 +1,18 @@ +async def company_category_delete(ns={}): + db = DBPools() + async with db.sqlorContext('kboss') as sor: + try: + update_sql = """update user_publish_company_category set del_flg = '1' where id = '%s';""" % ns.get('id') + await sor.sqlExe(update_sql, {}) + return { + 'status': True, + 'msg': 'Company category deleted successfully' + } + except Exception as e: + return { + 'status': False, + 'msg': 'Failed to delete company category, %s' % str(e) + } + +ret = await company_category_delete(params_kw) +return ret \ No newline at end of file diff --git a/b/product/company_category_search.dspy b/b/product/company_category_search.dspy new file mode 100644 index 0000000..0e43fdb --- /dev/null +++ b/b/product/company_category_search.dspy @@ -0,0 +1,34 @@ +async def company_category_search(ns={}): + if ns.get('userid'): + userid = ns.get('userid') + else: + userid = await get_user() + db = DBPools() + async with db.sqlorContext('kboss') as sor: + # 区分运营和普通客户 + user_list = await sor.R('users', {'id': userid}) + if not user_list: + return { + 'status': False, + 'msg': '没有找到匹配的用户' + } + orgid = user_list[0]['orgid'] + ns_dic = { + 'orgid': orgid, + 'del_flg': '0' + } + try: + result = await sor.R('user_publish_company_category', ns_dic) + return { + 'status': True, + 'msg': 'Company categories retrieved successfully', + 'data': result + } + except Exception as e: + return { + 'status': False, + 'msg': 'Failed to retrieve company categories, %s' % str(e) + } + +ret = await company_category_search(params_kw) +return ret \ No newline at end of file diff --git a/b/product/company_category_update.dspy b/b/product/company_category_update.dspy new file mode 100644 index 0000000..d0a039e --- /dev/null +++ b/b/product/company_category_update.dspy @@ -0,0 +1,18 @@ +async def company_category_update(ns={}): + db = DBPools() + async with db.sqlorContext('kboss') as sor: + try: + update_sql = """update user_publish_company_category set company_category = '%s' where id = '%s';""" % (ns.get('company_category'), ns.get('id')) + await sor.sqlExe(update_sql, {}) + return { + 'status': True, + 'msg': 'Company category updated successfully' + } + except Exception as e: + return { + 'status': False, + 'msg': 'Failed to update company category, %s' % str(e) + } + +ret = await company_category_update(params_kw) +return ret \ No newline at end of file diff --git a/b/product/product_category_add.dspy b/b/product/product_category_add.dspy new file mode 100644 index 0000000..3c59480 --- /dev/null +++ b/b/product/product_category_add.dspy @@ -0,0 +1,36 @@ +async def product_category_add(ns={}): + ns_dic = { + 'id': uuid(), + 'product_category': ns.get('product_category'), + 'parentid': ns.get('parentid') if ns.get('parentid') else None + } + if ns.get('userid'): + userid = ns.get('userid') + else: + userid = await get_user() + db = DBPools() + async with db.sqlorContext('kboss') as sor: + # 区分运营和普通客户 + user_list = await sor.R('users', {'id': userid}) + if not user_list: + return { + 'status': False, + 'msg': '没有找到匹配的用户' + } + orgid = user_list[0]['orgid'] + ns_dic['orgid'] = orgid + try: + await sor.C('user_publish_product_category', ns_dic) + return { + 'status': True, + 'msg': 'product category created successfully' + } + except Exception as e: + await sor.rollback() + return { + 'status': False, + 'msg': 'Failed to create product category, %s' % str(e) + } + +ret = await product_category_add(params_kw) +return ret \ No newline at end of file diff --git a/b/product/product_category_delete.dspy b/b/product/product_category_delete.dspy new file mode 100644 index 0000000..3964852 --- /dev/null +++ b/b/product/product_category_delete.dspy @@ -0,0 +1,18 @@ +async def product_category_delete(ns={}): + db = DBPools() + async with db.sqlorContext('kboss') as sor: + try: + update_sql = """update user_publish_product_category set del_flg = '1' where id = '%s';""" % ns.get('id') + await sor.sqlExe(update_sql, {}) + return { + 'status': True, + 'msg': 'product category deleted successfully' + } + except Exception as e: + return { + 'status': False, + 'msg': 'Failed to delete product category, %s' % str(e) + } + +ret = await product_category_delete(params_kw) +return ret \ No newline at end of file diff --git a/b/product/product_category_search.dspy b/b/product/product_category_search.dspy new file mode 100644 index 0000000..cd69ab2 --- /dev/null +++ b/b/product/product_category_search.dspy @@ -0,0 +1,40 @@ +async def build_tree(parent_id=None, all_cats=None): + return [{ + "id": cat['id'], + "name": cat['product_category'], + "cart_flag": cat['cart_flag'], + "children": await build_tree(cat['id'], all_cats) + } for cat in all_cats if cat['parentid'] == parent_id] + +async def product_category_search(ns={}): + if ns.get('userid'): + userid = ns.get('userid') + else: + userid = await get_user() + db = DBPools() + async with db.sqlorContext('kboss') as sor: + # 区分运营和普通客户 + user_list = await sor.R('users', {'id': userid}) + if not user_list: + return { + 'status': False, + 'msg': '没有找到匹配的用户' + } + orgid = user_list[0]['orgid'] + ns_dic = {'orgid': orgid, 'del_flg': '0'} + try: + result = await sor.R('user_publish_product_category', ns_dic) + # res = await build_tree(parent_id=None, all_cats=result) + return { + 'status': True, + 'msg': 'product categories retrieved successfully', + 'data': result + } + except Exception as e: + return { + 'status': False, + 'msg': 'Failed to retrieve product categories, %s' % str(e) + } + +ret = await product_category_search(params_kw) +return ret \ No newline at end of file diff --git a/b/product/product_category_update.dspy b/b/product/product_category_update.dspy new file mode 100644 index 0000000..96b279a --- /dev/null +++ b/b/product/product_category_update.dspy @@ -0,0 +1,18 @@ +async def product_category_update(ns={}): + db = DBPools() + async with db.sqlorContext('kboss') as sor: + try: + update_sql = """update user_publish_product_category set product_category = '%s' where id = '%s';""" % (ns.get('product_category'), ns.get('id')) + await sor.sqlExe(update_sql, {}) + return { + 'status': True, + 'msg': 'product category updated successfully' + } + except Exception as e: + return { + 'status': False, + 'msg': 'Failed to update product category, %s' % str(e) + } + +ret = await product_category_update(params_kw) +return ret \ No newline at end of file diff --git a/b/product/publish_product_add.dspy b/b/product/publish_product_add.dspy new file mode 100644 index 0000000..1d38acb --- /dev/null +++ b/b/product/publish_product_add.dspy @@ -0,0 +1,94 @@ +async def get_user_role(ns={}): + sor = ns['sor'] + # get role + ns['del_flg'] = '0' + res_role = await sor.R('userrole', ns) + if res_role: + user_role = res_role[0] + else: + return { + "status": False, + "msg": "userrole table, user id can not find..." + } + roleid = user_role.get('roleid') + # get role name + role_name = await sor.R('role', {'id': roleid}) + if role_name: + role = role_name[0].get('role') + else: + return { + "status": False, + "msg": "role table, can not get role name" + } + return role + +async def publish_product_add(ns={}): + if ns.get('userid'): + userid = ns.get('userid') + else: + userid = await get_user() + db = DBPools() + async with db.sqlorContext('kboss') as sor: + # 区分运营和普通客户 + user_list = await sor.R('users', {'id': userid}) + if not user_list: + return { + 'status': False, + 'msg': '没有找到匹配的用户' + } + orgid = user_list[0]['orgid'] + domain_name = ns.get('url_link').split("//")[1].split("/")[0] + if 'localhost' in domain_name: + domain_name = 'dev.opencomputing.cn' + product_category = ns.get('product_category') + company_type = ns.get('company_type') + ns_dic = { + "id": uuid(), + "orgid": orgid, + "img": ns.get('img'), + "domain_name": domain_name, + "product_name": ns.get("product_name"), + "product_category": product_category, + "company_name": ns.get("company_name"), + "company_type": json.dumps(company_type) if isinstance(company_type, list) else company_type, + "contact_person": ns.get("contact_person"), + "job_title": ns.get("job_title"), + "phone_number": ns.get("phone_number"), + "email": ns.get("email"), + "cpu": ns.get("cpu"), + "memory": ns.get("memory"), + "gpu": ns.get("gpu"), + "sys_disk": ns.get("sys_disk"), + "data_disk": ns.get("data_disk"), + "net_card": ns.get("net_card"), + "price": ns.get("price"), + "priority": ns.get("priority") if ns.get("priority") else 1, + "status": ns.get("status") if ns.get("status") else '0', + "title": ns.get("title"), + "label": ns.get("label"), + "first_page": ns.get("first_page") if ns.get("first_page") else '0', + "requirement_summary": ns.get("requirement_summary"), + "related_parameters": ns.get("related_parameters"), + "application_scenario": ns.get("application_scenario"), + "audit_status": ns.get('audit_status', 'pending'), + } + user_role = await get_user_role({'userid': userid, 'sor': sor}) + # 非客户角色不需要审批 + if user_role != '客户': + ns['status'] = '1' + ns_dic['audit_status'] = 'approved' + ns_dic['first_page'] = '1' + try: + await sor.C('user_publish_product', ns_dic) + return { + 'status': True, + 'msg': 'publish product created successfully' + } + except Exception as e: + return { + 'status': False, + 'msg': 'Failed to publish product, %s' % str(e) + } + +ret = await publish_product_add(params_kw) +return ret \ No newline at end of file diff --git a/b/product/publish_product_search.dspy b/b/product/publish_product_search.dspy new file mode 100644 index 0000000..995fb82 --- /dev/null +++ b/b/product/publish_product_search.dspy @@ -0,0 +1,68 @@ +async def publish_product_search(ns={}): + """ + 普通客户查看 + 运营查看自己提交内容 + 运营查看所有用户内容 + :param ns: + :return: + """ + offset = ns['offset'] + flag = ns.get('flag') + + if ns.get('userid'): + userid = ns.get('userid') + else: + userid = await get_user() + db = DBPools() + async with db.sqlorContext('kboss') as sor: + # 区分运营和普通客户 + user_list = await sor.R('users', {'id': userid}) + if not user_list: + return { + 'status': False, + 'msg': '没有找到匹配的用户' + } + orgid = user_list[0]['orgid'] + org_parentid_li = await sor.R('organization', {'id': orgid}) + org_parentid = org_parentid_li[0]['parentid'] + user_role = await get_user_role({'userid': userid, 'sor': sor}) + try: + # 非客户角色 + if user_role != '客户': + ns['del_flg'] = '0' + + # 业主机构角色并且是只查看业主机构自己 flag==single + if orgid == 'mIWUHBeeDM8mwAFPIQ8pS' and flag == 'single': + find_sql = """SELECT upr.* FROM user_publish_product AS upr LEFT JOIN organization AS org ON upr.orgid = org.id + WHERE org.parentid IS NULL AND upr.del_flg = '0' ORDER BY upr.create_at DESC LIMIT 20 OFFSET %s;""" % offset + # 业主机构角色并且是查看所有(包括业主机构自己) flag!=single + elif orgid == 'mIWUHBeeDM8mwAFPIQ8pS': + find_sql = """SELECT upr.* FROM user_publish_product AS upr LEFT JOIN organization AS org ON upr.orgid = org.id + WHERE org.id = '%s' or org.parentid = '%s' AND org.org_type != '1' AND upr.del_flg = '0' ORDER BY upr.create_at DESC LIMIT 20 OFFSET %s;""" % (orgid, orgid, offset) + # 其他机构非用户角色 只查看自己 + elif flag == 'single': + find_sql = """SELECT upr.* FROM user_publish_product AS upr LEFT JOIN organization AS org ON upr.orgid = org.id + WHERE org.id = '%s' AND upr.del_flg = '0' ORDER BY upr.create_at DESC LIMIT 20 OFFSET %s;""" % (orgid, offset) + # 其他机构非用户角色查看所有 + else: + find_sql = """SELECT upr.* FROM user_publish_product AS upr LEFT JOIN organization AS org ON upr.orgid = org.id + WHERE (org.id = '%s' or org.parentid = '%s') AND upr.del_flg = '0' ORDER BY upr.create_at DESC LIMIT 20 OFFSET %s;""" % (orgid, orgid, offset) + # 客户角色 + else: + ns['del_flg'] = '0' + ns['orgid'] = user_list[0]['id'] + find_sql = """SELECT * FROM user_publish_product WHERE orgid = '%s' AND del_flg = '0' ORDER BY create_at DESC LIMIT 20 OFFSET %s;""" % (orgid, offset) + result = await sor.sqlExe(find_sql, {}) + return { + 'status': True, + 'msg': 'Requirements retrieved successfully', + 'data': result + } + except Exception as e: + return { + 'status': False, + 'msg': 'Failed to retrieve requirements, %s' % str(e) + } + +ret = await publish_product_search(params_kw) +return ret \ No newline at end of file diff --git a/b/product/publish_product_search_first_page.dspy b/b/product/publish_product_search_first_page.dspy new file mode 100644 index 0000000..f43f4ab --- /dev/null +++ b/b/product/publish_product_search_first_page.dspy @@ -0,0 +1,44 @@ +async def publish_product_search_first_page(ns={}): + """ + 普通客户查看 + 运营查看自己提交内容 + 运营查看所有用户内容 + :param ns: + :return: + """ + domain_name = ns.get('url_link').split("//")[1].split("/")[0] + if 'localhost' in domain_name: + domain_name = 'dev.opencomputing.cn' + db = DBPools() + async with db.sqlorContext('kboss') as sor: + try: + ns['del_flg'] = '0' + find_sql = """SELECT * FROM user_publish_product WHERE domain_name = '%s' AND first_page = '1' AND audit_status = 'approved' AND del_flg = '0' ORDER BY create_at DESC;""" % (domain_name,) + result = await sor.sqlExe(find_sql, {}) + category_all = await sor.R('user_publish_product_category', {}) + product_dic = {} + for res in result: + res['img'] = 'https://' + domain_name + '/idfile?path=' + res['img'] + category_id = res['product_category'].split(',')[0] + category_name_li = [item['product_category'] for item in category_all if item['id'] == category_id] + category_name = category_name_li[0] if category_name_li else '其他' + if product_dic.get(category_name): + product_dic[category_name].append(res) + else: + product_dic[category_name] = [res] + product_list = [] + for key, value in product_dic.items(): + product_list.append({'id': uuid(), 'name': key, 'product_list': value}) + return { + 'status': True, + 'msg': 'Requirements retrieved successfully', + 'data': product_list + } + except Exception as e: + return { + 'status': False, + 'msg': 'Failed to retrieve requirements, %s' % str(e) + } + +ret = await publish_product_search_first_page(params_kw) +return ret \ No newline at end of file diff --git a/b/product/requirement_add.dspy b/b/product/requirement_add.dspy new file mode 100644 index 0000000..95de8c0 --- /dev/null +++ b/b/product/requirement_add.dspy @@ -0,0 +1,35 @@ +async def requirement_add(ns={}): + product_category = ns.get('product_category') + company_type = ns.get('company_type') + ns_dic = { + 'id': uuid(), + 'orgid': ns.get('orgid'), + 'requirement_name': ns.get('requirement_name'), + 'product_category': json.dumps(product_category) if isinstance(product_category, list) else product_category, + 'company_name': ns.get('company_name'), + 'company_type': json.dumps(company_type) if isinstance(company_type, list) else company_type, + 'contact_person': ns.get('contact_person'), + 'job_title': ns.get('job_title'), + 'phone_number': ns.get('phone_number'), + 'email': ns.get('email'), + 'requirement_summary': ns.get('requirement_summary'), + 'related_parameters': ns.get('related_parameters'), + 'application_scenario': ns.get('application_scenario'), + 'audit_status': ns.get('audit_status', 'pending') + } + db = DBPools() + async with db.sqlorContext('kboss') as sor: + try: + await sor.C('user_publish_requirement', ns_dic) + return { + 'status': True, + 'msg': 'Requirement created successfully' + } + except Exception as e: + return { + 'status': False, + 'msg': 'Failed to create requirement, %s' % str(e) + } + +ret = await requirement_add(params_kw) +return ret \ No newline at end of file diff --git a/b/product/requirement_delete.dspy b/b/product/requirement_delete.dspy new file mode 100644 index 0000000..883168e --- /dev/null +++ b/b/product/requirement_delete.dspy @@ -0,0 +1,21 @@ +async def requirement_delete(ns={}): + ns_dic = { + 'id': ns.get('id'), + 'del_flg': '1' + } + db = DBPools() + async with db.sqlorContext('kboss') as sor: + try: + await sor.U('user_publish_requirement', ns_dic) + return { + 'status': True, + 'msg': 'Requirement delete successfully' + } + except Exception as e: + return { + 'status': False, + 'msg': 'Failed to delete requirement, %s' % str(e) + } + +ret = await requirement_delete(params_kw) +return ret \ No newline at end of file diff --git a/b/product/requirement_search.dspy b/b/product/requirement_search.dspy new file mode 100644 index 0000000..b48a8b4 --- /dev/null +++ b/b/product/requirement_search.dspy @@ -0,0 +1,93 @@ +async def get_user_role(ns={}): + sor = ns['sor'] + # get role + ns['del_flg'] = '0' + res_role = await sor.R('userrole', ns) + if res_role: + user_role = res_role[0] + else: + return { + "status": False, + "msg": "userrole table, user id can not find..." + } + roleid = user_role.get('roleid') + # get role name + role_name = await sor.R('role', {'id': roleid}) + if role_name: + role = role_name[0].get('role') + else: + return { + "status": False, + "msg": "role table, can not get role name" + } + return role + +async def requirement_search(ns={}): + """ + 普通客户查看 + 运营查看自己提交内容 + 运营查看所有用户内容 + :param ns: + :return: + """ + offset = ns['offset'] + flag = ns.get('flag') + + if ns.get('userid'): + userid = ns.get('userid') + else: + userid = await get_user() + db = DBPools() + async with db.sqlorContext('kboss') as sor: + # 区分运营和普通客户 + user_list = await sor.R('users', {'id': userid}) + if not user_list: + return { + 'status': False, + 'msg': '没有找到匹配的用户' + } + orgid = user_list[0]['orgid'] + org_parentid_li = await sor.R('organization', {'id': orgid}) + org_parentid = org_parentid_li[0]['parentid'] + user_role = await get_user_role({'userid': userid, 'sor': sor}) + try: + # 非客户角色 + if user_role != '客户': + ns['del_flg'] = '0' + + # 业主机构角色并且是只查看业主机构自己 flag==single + if orgid == 'mIWUHBeeDM8mwAFPIQ8pS' and flag == 'single': + find_sql = """SELECT upr.* FROM user_publish_requirement AS upr LEFT JOIN organization AS org ON upr.orgid = org.id + WHERE org.parentid IS NULL AND upr.del_flg = '0' ORDER BY upr.create_at DESC LIMIT 20 OFFSET %s;""" % offset + # 业主机构角色并且是查看所有(包括业主机构自己) flag!=single + elif orgid == 'mIWUHBeeDM8mwAFPIQ8pS': + find_sql = """SELECT upr.* FROM user_publish_requirement AS upr LEFT JOIN organization AS org ON upr.orgid = org.id + WHERE org.id = '%s' or org.parentid = '%s' AND org.org_type != '1' AND upr.del_flg = '0' ORDER BY upr.create_at DESC LIMIT 20 OFFSET %s;""" % (orgid, orgid, offset) + # 其他机构非用户角色 只查看自己 + elif flag == 'single': + find_sql = """SELECT upr.* FROM user_publish_requirement AS upr LEFT JOIN organization AS org ON upr.orgid = org.id + WHERE org.id = '%s' AND upr.del_flg = '0' ORDER BY upr.create_at DESC LIMIT 20 OFFSET %s;""" % (orgid, offset) + # 其他机构非用户角色查看所有 + else: + find_sql = """SELECT upr.* FROM user_publish_requirement AS upr LEFT JOIN organization AS org ON upr.orgid = org.id + WHERE (org.id = '%s' or org.parentid = '%s') AND upr.del_flg = '0' ORDER BY upr.create_at DESC LIMIT 20 OFFSET %s;""" % (orgid, orgid, offset) + # 客户角色 + else: + ns['del_flg'] = '0' + ns['orgid'] = user_list[0]['id'] + find_sql = """SELECT * FROM user_publish_requirement WHERE orgid = '%s' AND del_flg = '0' ORDER BY create_at DESC LIMIT 20 OFFSET %s;""" % (orgid, offset) + + result = await sor.sqlExe(find_sql, {}) + return { + 'status': True, + 'msg': 'Requirements retrieved successfully', + 'data': result + } + except Exception as e: + return { + 'status': False, + 'msg': 'Failed to retrieve requirements, %s' % str(e) + } + +ret = await requirement_search(params_kw) +return ret \ No newline at end of file diff --git a/b/product/requirement_update.dspy b/b/product/requirement_update.dspy new file mode 100644 index 0000000..40db1a5 --- /dev/null +++ b/b/product/requirement_update.dspy @@ -0,0 +1,23 @@ +async def requirement_update(ns={}): + product_category = ns.get('product_category') + company_type = ns.get('company_type') + if product_category: + ns['product_category'] = json.dumps(product_category) if isinstance(product_category, list) else product_category + if company_type: + ns['company_type'] = json.dumps(company_type) if isinstance(company_type, list) else company_type + db = DBPools() + async with db.sqlorContext('kboss') as sor: + try: + await sor.U('user_publish_requirement', ns) + return { + 'status': True, + 'msg': 'Requirement updated successfully' + } + except Exception as e: + return { + 'status': False, + 'msg': 'Failed to update requirement, %s' % str(e) + } + +ret = await requirement_update(params_kw) +return ret \ No newline at end of file