Исходный код app.query_mgt.mod_api

# -*- coding: utf-8 -*-
import os
from app.query_mgt.query_conf import QueryConf
from app.query_mgt.sparqt_editor_manager import SparqtEditorManager

from app.utilites.utilites import Utilites
from app.admin_mgt.admin_conf import AdminConf
from app.utilites.some_config import SomeConfig


[документация]class ModApi(QueryConf): _class_file = __file__ _debug_name = 'QueryUtilsApi' # Чтобы использовать в другом модуле нужно импортировать апи # query_mod_api = app_api.get_mod_api('query_mgt') # потом вызываем функцию create_sparqt_manager с заданными параметрами # Пример - query_mod_api.create_sparqt_manager("my_custom_sparqt", mod) # В dublin.ttl добавляем <SUBJECT> <http://splm.portal.web/osplm#hasPathForSPARQLquery> "<DIR_NAME>"^^<http://www.w3.org/2001/XMLSchema#string> . # Где вместо <SUBJECT> - uri модуля, <DIR_NAME> - папка от корня модуля где будут хранится шаблоны
[документация] @staticmethod def create_sparqt_manager(__url, __mod): """ Создает новые методы для интерфейса редактирования sparqt шаблонов. Для модуля blueprint : __mod под адресом : <base_mod_uri>/__URL :param str __url: наш url по которому будет SPARQTManager :param Blueprint __mod: экземпляр класса blueprint в файле views текущего модуля :return: метод реализующий редактор sparqt-файлов для модулей через интерфейс :rtype: def """ module_name = os.path.basename(__mod.root_path) return SparqtEditorManager(module_name=module_name).create(__url, __mod)
[документация] @staticmethod def jqgrid(cfg={}, query="", vars={}, data=None, title="", is_main_tz=False, xicon=True, xicon_close=True): """ Метод возвращает html для создания jqgrid-таблицы :param dict cfg: настройки для таблицы :param str query: sparqt-запрос :param dict vars: параметры для sparqt-запроса :param list/pd.DataFrame data: уже готовые данные для таблицы :param str title: заголовок таблицы :param bool is_main_tz: является ли ТЗ в таблице основым ТЗ (только для TZ) - True/False (по умолчанию нет) :param bool xicon: тип таблицы с функцией скрытия или нет - True/False (по умолчанию с функцией) :param bool xicon_close: тип блока скрытый/раскрытый - True/False (по умолчанию скрытый) :return: html Examples -------- return create_sparqt_manager(__URL, __mod) cfg = { "datatype": "local", "pager": '', "rowNum": 10, "rowList": [10, 20, 30], "sortname": "id", "sortorder": "desc", "viewrecords": True, "gridview": True, "autoencode": False, "autowidth": True, "colModel": [ {"label": "Документ", "index": "tz_lbl", "name": "tz_lbl", "width": 20, "align": "center", "search": True, "stype": 'text', 'formatter':'_2HtmlLink_frmt', "searchoptions": {"sopt": ['cn', 'nc', 'eq', 'ne', 'bw', 'bn', 'ew', 'en']} }, {"label": "Наименование документа", "index": "name_val", "name": "name_val", "width": 60, "align": "center", "search": True, 'stype': 'text', "searchoptions": {"sopt": ['cn', 'nc', 'eq', 'ne', 'bw', 'bn', 'ew', 'en']} }, {"label": "Дата начала работ", "index": "start_val", "name": "start_val", "width": 20, "align": "center", "search": True, 'stype': 'text', "searchoptions": {"sopt": ['cn', 'nc', 'eq', 'ne', 'bw', 'bn', 'ew', 'en']} } ] } -------- # <module>.<file>.<template> query = "mod_splm_nav.Organization.list_of_tz" -------- vars = {'PREF': 'http://proryv2020.ru/req_onto#', 'URI': 'http://proryv2020.ru/odek/data#123', 'LANG': 'ru'} -------- data = [ {"tz" : "MFR.4.0010", "req" : "MFR.4.0010-3.2-0010-R"}, {"tz" : "MFR.4.0010", "req" : "MFR.4.0010-3.2-0020-R"} ] """ import random import string import re import json import pandas as pd from flask import url_for, g, request from app.app_api import tsc_query, get_useDBGMode, canExportReqs, get_mod_api _app_cfg = SomeConfig(AdminConf.get_configs_path()) args = request.args.to_dict() # Если префикс онтологии не указан, то назначаем префикс по умолчанию "onto" prefix = "onto" if "prefix" in args: prefix = args["prefix"] pref_unquote = '' for p in get_mod_api('onto_mgt').get_prefixes(): if p[0] == prefix: pref_unquote = p[1] cls_to_ref = [] table_data = [] # для переменной в js if not query: query = ''.join(random.choice(string.ascii_uppercase) for _ in range(15)) if data is None: # ===== export2Excel ====== cfg['export2Excel'] = '1' if canExportReqs() else '0' # ===== для dbgMode ====== cfg['query'] = query cfg['dbgMode'] = '1' if get_useDBGMode() else '0' data = tsc_query(query, vars) df = None if data is not None and isinstance(data, list): df = pd.DataFrame(data) elif isinstance(data, pd.DataFrame): df = data else: return "" # выбираем переменные на обработку for col in cfg['colModel']: if 'formatter' in col and col['formatter'] == '_2HtmlLink_frmt': key = re.sub(r'_lbl$', '', col['index']) cls_to_ref.append(key) key_cls = key + "_cls" try: df[key_cls] = df[key_cls].str.replace(pref_unquote, '', regex=True) except Exception as e: pass for key, val in df.transpose().to_dict().items(): for val_key in val: # обработка Организаций через запятую и добавление ссылок if "company_" in val[val_key]: if " " in val[val_key] or ";" in val[val_key] or "," in val[val_key]: orgs = val[val_key].split('; ') comp = "" for org_iter in range(0, len(orgs)): org = orgs[org_iter].split(', ', 1) comp += "<a href=" + url_for('splm_nav.uri_class', class_object=val[val_key + "_cls"], uri=org[0], prefix=prefix) + ">" + org[1] + "</a>" if org_iter < len(orgs) - 1: comp += "; " val[val_key] = comp for item in cls_to_ref: item_cls = item + "_cls" item_lbl = item + "_lbl" try: _href = url_for('splm_nav.uri_class', class_object=val[item_cls], uri=val[item], prefix=prefix) val[item_lbl] = '<a href="' + _href + '">' + val[item_lbl] + '</a>' except: try: val[item_lbl] = val[item] except Exception as e: pass table_data.append(val) cfg['data'] = table_data # Экспертиза _expertRole = _app_cfg.get('users.Roles.expertRole') if g.user and g.user.has_role(_expertRole): exp = ['Экспертиза', url_for('splm_nav.tasksource')] if query == 'mod_splm_nav.TZ.contract_per_contractor': if is_main_tz: cfg['export4Act'] = exp + [url_for('splm_nav.ver_reptasks'), 3, True, 50] elif query == 'mod_splm_nav.TZ.contract_repdocs_fact': cfg['export4Act'] = exp + [url_for('splm_nav.doc_reptasks'), 3] # +/- # xicon_close # создаем html name = query.split(".")[-1] html = """ <div class="table-box"> <div class="json-source" style="display:none">"{name}"</div> <script type="text/javascript"> var {name} = {cfg}; </script> </div> """.format(cfg=json.dumps(cfg), name=name) if xicon: return Utilites.create_xicon_block(html=html, title=title, id=name, xicon_close=xicon_close) else: return html