def __build_fetchxml_by(context,alias,table_name,id=None,data=None,auto_commit=0, type="select", **kwargs): meta=read_table_meta(context,alias=alias,table_name=table_name) if meta==None: raise NameError("%s not exists in api_table (%s)" % (alias,id)) tmp=[] tmp.append(f"<restapi type=\"{type}\">\n") tmp.append(f"<table name=\"{meta['table_name']}\"/>\n") if id!=None: tmp.append("<filter type=\"and\">\n") tmp.append(f"<condition field=\"{meta['id_field_name']}\" value=\"{id}\" operator=\"=\"/>\n") tmp.append("</filter>\n") if data!=None: tmp.append("<fields>\n") for k,v in data.items(): if v==None: tmp.append(f"""<field name="{k}"/>\n""") else: #tmp.append(f"""<field name="{k}" value="{v}"/>\n""") tmp.append(f"""<field name="{k}">\n""") tmp.append(f"""<value><![CDATA[{v}]]></value>\n""") tmp.append(f"""</field>\n""") tmp.append("</fields>\n") tmp.append("</restapi>") return ''.join(tmp)
def test_by_table(self): meta_table=read_table_meta(self.context, alias="dummy") meta=read_table_view_meta(self.context,meta_table['id'], "default", "LISTVIEW") print("====================") print(meta) print("====================")
def get(self, table, id): try: create_parser().parse_args() context = g.context table_meta = read_table_meta(context, alias=table) solution_id = table_meta['solution_id'] if solution_id == 1: file = f"templates/{table}_update.htm" else: file = f"solutions/{solution_id}/{table}_update.htm" fetch = build_fetchxml_by_alias(context, table, id, type="select") fetchparser = FetchXmlParser(fetch, context) rs = DatabaseServices.exec(fetchparser, context, fetch_mode=1) if rs.get_result() == None: abort(404, "Item not found => %s" % id) # # render the defined jinja template (in case ofahtm file) # logger.info(f"Redirect : {next}") template = JinjaTemplate.create_file_template(context, file) response = make_response( template.render({ "table": table, "pagemode": "dataformupdate", "id": id, "data": rs.get_result(), "context": context })) response.headers['content-type'] = 'text/html' return response except ConfigNotValid as err: logger.exception(f"Config not valid {err}") return make_response( JinjaTemplate.render_status_template(context, 500, err), 500) except jinja2.exceptions.TemplateNotFound as err: logger.exception(f"TemplateNotFound: {err}") return make_response( JinjaTemplate.render_status_template( context, 404, f"Template not found {err}"), 404) except FileNotFoundError as err: logger.exception(f"FileNotFound: {err}") return make_response( JinjaTemplate.render_status_template(context, 404, f"File not found {err}"), 404) except RestApiNotAllowed as err: logger.exception(f"RestApiNotAllowed Exception: {err}") #return redirect(f"/auth/login.htm?redirect=/{path}", code=302) return redirect(f"/ui/login?redirect={request.url}", code=302) except Exception as err: logger.exception(f"Exception: {err}") return make_response( JinjaTemplate.render_status_template(context, 500, err), 500)
def __datacomboview(table_alias, viewname, query): context = g.context table_meta = read_table_meta(context, alias=table_alias) view_meta = read_table_view_meta(g.context, table_meta['id'], viewname, 'SELECTVIEW') fetchparser = FetchXmlParser( str(view_meta['fetch_xml']).replace('$$query$$', query), context) rs = DatabaseServices.exec(fetchparser, context, fetch_mode=0) return rs.get_result()
def get(self, table): try: create_parser().parse_args() context = g.context from core.permission import Permission if not Permission().validate(context, "create", context.get_username(), table): raise RestApiNotAllowed("") table_meta = read_table_meta(context, alias=table) solution_id = table_meta['solution_id'] if solution_id == 1: file = f"templates/{table}_insert.htm" else: file = f"solutions/{solution_id}/{table}_insert.htm" logger.info(f"Redirect : {next}") template = JinjaTemplate.create_file_template(context, file) response = make_response( template.render({ "table": table, "pagemode": "dataforminsert", "context": context })) response.headers['content-type'] = 'text/html' return response except ConfigNotValid as err: logger.exception(f"Config not valid {err}") return make_response( JinjaTemplate.render_status_template(context, 500, err), 500) except jinja2.exceptions.TemplateNotFound as err: logger.exception(f"TemplateNotFound: {err}") return make_response( JinjaTemplate.render_status_template( context, 404, f"Template not found {err}"), 404) except FileNotFoundError as err: logger.exception(f"FileNotFound: {err}") return make_response( JinjaTemplate.render_status_template(context, 404, f"File not found {err}"), 404) except RestApiNotAllowed as err: logger.exception(f"RestApiNotAllowed Exception: {err}") #return redirect(f"/ui/login?redirect=/ui/v1.0/data/{table}", code=302) return redirect(f"/ui/login?redirect={request.url}", code=302) except Exception as err: logger.exception(f"Exception: {err}") return make_response( JinjaTemplate.render_status_template(context, 500, err), 500)
def get(self, table, view="default"): try: parser = create_parser().parse_args() context = g.context logger.info(f"app_id: {request.url}") file = f"templates/base/datalist.htm" query = "%" if 'query' in request.args: query = f"%{request.args.get('query')}%" table_meta = read_table_meta(context, alias=table) view_meta = read_table_view_meta(context, table_meta['id'], view, 'LISTVIEW') fetch = view_meta['fetch_xml'] #columns=json.loads(view_meta['col_definition']) fetch = fetch.replace("$$query$$", query) fetchparser = FetchXmlParser(fetch, context) rs = DatabaseServices.exec(fetchparser, context, fetch_mode=0) template = JinjaTemplate.create_file_template(context, file) response = make_response( template.render({ "data": rs.get_result(), "columns": fetchparser.get_columns(), "table": table, "table_meta": table_meta, "view_meta": view_meta, "pagemode": "dataformlist", "context": context })) response.headers['content-type'] = 'text/html' return response except ConfigNotValid as err: logger.exception(f"Config not valid {err}") return make_response( JinjaTemplate.render_status_template(context, 500, err), 500) except DataViewNotFound as err: logger.exception(f"Dataview on api_table_view not found: {err}") return make_response( JinjaTemplate.render_status_template(context, 500, "Dataview not found!"), 500) except jinja2.exceptions.TemplateNotFound as err: logger.exception(f"TemplateNotFound: {err}") return make_response( JinjaTemplate.render_status_template( context, 404, f"Template not found {err}"), 404) except FileNotFoundError as err: logger.exception(f"FileNotFound: {err}") return make_response( JinjaTemplate.render_status_template(context, 404, f"File not found {err}"), 404) except RestApiNotAllowed as err: logger.exception(f"RestApiNotAllowed Exception: {err}") #return redirect(f"/ui/login?redirect=/ui/v1.0/data/view/{table}/default", code=302) return redirect(f"/ui/login?redirect={request.url}", code=302) except Exception as err: logger.exception(f"Exception: {err}") return make_response( JinjaTemplate.render_status_template(context, 500, err), 500)
def exec(command_builder, context, run_as_system=False, fetch_mode=-1): # # Validate the permission # in case of no permission the check_permission function triggers an errror # if not run_as_system: for table in command_builder.get_tables(): if not Permission().validate(context, command_builder.get_sql_type(), context.get_username(), table): #raise NameError (f"no permission ({command_builder.get_sql_type()}) for {context.get_username()} on {table}") raise RestApiNotAllowed( f"no permission ({command_builder.get_sql_type()}) for {context.get_username()} on {table}" ) logger.info( f"Try to read table metadata: {command_builder.get_main_table()}") meta = read_table_meta(context, table_name=command_builder.get_main_table()) id_field_name = meta['id_field_name'] id_field_type = meta['id_field_type'] if command_builder.get_sql_type().upper() == 'UPDATE': #meta=read_table_meta(context, table_name=command_builder.get_main_table()) if meta['enable_audit_log'] != 0: sql, paras = command_builder.get_select() cursor = context.get_connection().cursor() cursor.execute(sql, paras) rsold = Recordset(cursor) rsold.read(0) #id_field_name=meta['id_field_name'] #id_field_type=meta['id_field_type'] logger.info(rsold.get_result()) if rsold.get_result() != None: for rec in rsold.get_result(): id = rec[id_field_name] for k, v in rec.items(): if k in command_builder.get_sql_fields(): value = command_builder.get_sql_fields( )[k]['value'] old_value = v command_builder.get_sql_fields( )[k]['old_value'] = old_value AuditLog.log(context, command_builder.get_sql_type(), id, command_builder.get_main_table(), k, old_value, value) logger.info(command_builder.get_sql_fields()) params = {"data": command_builder.get_sql_fields()} handler = Plugin(context, command_builder.get_main_table(), command_builder.get_sql_type()) handler.execute('before', params) sql, paras = command_builder.get_sql() logger.info(sql) logger.info(paras) cursor = context.get_connection().cursor() cursor.execute(sql, paras) handler.execute('after', params) if command_builder.get_auto_commit( ) == 1 or command_builder.get_auto_commit() == True: context.get_connection().commit() rs = Recordset(cursor) if fetch_mode != -1: rs.read(fetch_mode) rs.get_columns() if command_builder.get_sql_type().upper() == "INSERT": if context.get_connection().insert_id( ) == 0 or context.get_connection().insert_id() == None: rs.set_inserted_id( command_builder.get_sql_fields()[id_field_name]['value']) else: rs.set_inserted_id(context.get_connection().insert_id()) return rs