import datetime import logging import os from flask import render_template from mc_openapi.doml_mc.intermediate_model.metamodel import DOMLVersion from mc_openapi.doml_mc import verify_model, init_model, verify_csp_compatibility from .doml_mc import MCResult def make_error(user_msg, debug_msg=None): result = {"message": user_msg, "timestamp": datetime.datetime.now()} if debug_msg is not None: result["debug_message"] = debug_msg logging.error(debug_msg) return result def modelcheck(body, version=None): return mc(body, version) def modelcheck_html(body, version=None): return mc(body, version, isHtml=True) def mc(body, version, isHtml = False): doml_xmi = body doml_version_str: str = None doml_version: DOMLVersion = None try: # First try to infer DOML version from ENV, then query params doml_version_str = os.environ.get("DOML_VERSION") or version if doml_version_str: doml_version = DOMLVersion.get(doml_version_str) logging.info(f"Forcing DOML {doml_version.value}") dmc = init_model(doml_xmi, doml_version) res = verify_model(dmc) res['doml_version'] = dmc.doml_version.value res['result'] = res['result'].name if isHtml: res |= res.get('csp', {}) return render_template('mc.html.jinja', **res).replace('\n', '') else: return res except Exception as e: return make_error("The supplied DOMLX model is malformed or its DOML version is unsupported.", debug_msg=str(e)), 400 def csp(body, version=None): doml_xmi = body doml_version_str: str = None doml_version: DOMLVersion = None try: # First try to infer DOML version from ENV, then query params doml_version_str = os.environ.get("DOML_VERSION") or version if doml_version_str: doml_version = DOMLVersion.get(doml_version_str) logging.info(f"Forcing DOML {doml_version.value}") dmc = init_model(doml_xmi, doml_version) return verify_csp_compatibility(dmc) except Exception as e: return make_error("The supplied DOMLX model is malformed or its DOML version is unsupported.", debug_msg=str(e)), 400 def csp_html(body, version=None): ret = csp(body, version) return render_template('csp.html.jinja', **ret).replace('\n', '')