Beispiel #1
0
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)
Beispiel #2
0
    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("====================")
Beispiel #3
0
    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)
Beispiel #4
0
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()
Beispiel #5
0
    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)
Beispiel #6
0
    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)
Beispiel #7
0
    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