Source code for sirepo.uri

# -*- coding: utf-8 -*-
"""uri formatting

:copyright: Copyright (c) 2019 RadiaSoft LLC.  All Rights Reserved.
:license: http://www.apache.org/licenses/LICENSE-2.0.html
"""
from pykern.pkcollections import PKDict
from pykern.pkdebug import pkdp
import pykern.pkcompat
import pykern.pkinspect
import re
import sirepo.feature_config
import urllib.parse

#: route parsing
PARAM_RE = r"([\?\*]?)<{}>"

#: optional parameter that consumes rest of parameters
PATH_INFO_CHAR = "*"

# TODO(robnagler): make class that gets returned


[docs] def app_root(sim_type=None): """Generate uri for application root Args: sim_type (str): application name [None] Returns: str: formatted URI """ return uri_router.uri_for_api( "root", params=PKDict(path_info=sim_type) if sim_type else None, )
[docs] def decode_to_str(encoded): return pykern.pkcompat.from_bytes(urllib.parse.unquote_to_bytes(encoded))
[docs] def default_local_route_name(schema): return schema.appDefaults.route
[docs] def init_module(**imports): import sirepo.util # import simulation_db, uri_router sirepo.util.setattr_imports(imports)
[docs] def local_route(sim_type, route_name=None, params=None, query=None): """Generate uri for local route with params Args: sim_type (str): simulation type (must be valid) route_name (str): a local route [defaults to local default] params (dict): paramters to pass to route query (dict): query values (joined and escaped) Returns: str: formatted URI """ s = simulation_db.get_schema(sim_type) if not route_name: route_name = default_local_route_name(s) parts = s.localRoutes[route_name].route.split("/:") u = parts.pop(0) for p in parts: if p.endswith("?"): p = p[:-1] if not params or p not in params: continue u += "/" + _to_uri(params[p]) return app_root(sim_type) + "#" + u + _query(query)
[docs] def is_sr_exception_only(sim_type, route_name): """local route has srExceptionOnly param Args: sim_type (str): simulation type (must be valid) route_name (str): a local route Returns: object: True if srExceptionOnly, else False; None if route not found """ rv = simulation_db.get_schema(sim_type).localRoutes.get(route_name).route return rv and "srExceptionOnly" in rv
[docs] def server_route(route_or_uri, params, query): """Convert name to uri found in SCHEMA_COMMON Args: route_or_uri (str): route or uri params (dict): parameters to apply to route query (dict): query string values Returns: str: URI """ if "/" in route_or_uri: assert ( not params and not query ), "when uri={} must not have params={} or query={}".format( route_or_uri, params, query, ) return route_or_uri route = simulation_db.SCHEMA_COMMON["route"][route_or_uri] if params: for k, v in params.items(): k2 = PARAM_RE.format(k) n = re.sub(k2, _to_uri(str(v)), route) assert n != route, '{}: not found in "{}"'.format(k2, route) route = n route = re.sub(r"\??<[^>]+>", "", route) assert not "<" in route, "{}: missing params".format(route) route += _query(query) return route
[docs] def unchecked_root_redirect(path): return simulation_db.SCHEMA_COMMON.rootRedirectUri.get(path)
def _query(query): if not query: return "" return "?" + urllib.parse.urlencode(query) def _to_uri(element): if isinstance(element, bool): return str(int(element)) return urllib.parse.quote(element, safe="()-_.!~*'")