Source code for bag.web.pyramid.routes

"""Make Pyramid routes and the route_path() function available to JS.

...in the client, under the name "jurl()".
"""


[docs]def treated_routes(config, base_path='/'): """A dict containing each of the routes configured in this application. In your app configuration, ``config.make_wsgi_app()`` must be called *before* routes are extracted:: app = config.make_wsgi_app() config.registry.app_routes = treated_routes(config) return app The return value is a dict like this:: {'__static': '/static', # static routes start with "__" 'activate': '/activate/{user_id}/{code}'} """ adict = {} for route in config.get_routes_mapper().routes.values(): name = route.name.rstrip('/') pattern = route.pattern.strip('/') # remove the slash from both sides if pattern.endswith("/*subpath"): pattern = pattern[:-9] adict[name] = base_path + pattern return adict
[docs]def routes_as_json(config, base_path='/'): from json import dumps return dumps(treated_routes(config, base_path=base_path))
[docs]def write_routes_js_file(config, file_path, base_path='/'): routes = routes_as_json(config, base_path=base_path) prefix = config.registry.settings.get('scheme_domain_port') if prefix: prefix = '"' + prefix + '"' else: prefix = 'window.location.protocol + "//" + window.location.host' with open(file_path, 'w') as js_file: js_file.write(JS_TEMPLATE.replace('{routes}', routes).replace( '{scheme_domain_port}', prefix))
JS_TEMPLATE = '''"use strict"; // Do not edit this file; it is autogenerated. window.jurl = function (routes) { // Usage: jurl(ROUTE_NAME, key1, val1, key2, val2...) return function() { // Copy arguments to args var args = []; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i]); } var name = args.shift(); var s = routes[name]; if (!s) throw 'jurl: No route called ' + name; while (args.length > 0) { var key = args.shift(); var placeholder = '{' + key + '}'; if (s.indexOf(placeholder) == -1) { throw 'jurl: Route "' + name + '" does not have placeholder: ' + placeholder; } var val = args.shift(); if (val == null) throw 'jurl: Missing value for placeholder ' + placeholder + ' of route "' + name + '"'; s = s.replace(placeholder, val); } return s; } }({routes}); window.schemeDomainPort = {scheme_domain_port}; '''