Source code for plone.jsonapi.routes
# -*- coding: utf-8 -*-
__author__ = 'Ramon Bartl <ramon.bartl@googlemail.com>'
__docformat__ = 'plaintext'
import re
import logging
from plone.jsonapi.core.browser.router import add_route
from plone.jsonapi.core.browser.router import DefaultRouter
BASE_URL = "/plone/api/1.0"
logger = logging.getLogger("plone.jsonapi.routes")
[docs]def add_plone_route(rule, endpoint=None, **kw):
""" add a Plone JSON API route
"""
def apiurl(rule):
return '/'.join(s.strip('/') for s in ["", BASE_URL, rule])
def wrapper(f):
try:
DefaultRouter.add_url_rule(apiurl(rule), endpoint=endpoint, view_func=f, options=kw)
except AssertionError:
pass
return f
return wrapper
[docs]def get_api_routes_for(segment):
""" return a list of all routes registered for the given url segment
"""
adapter = DefaultRouter.get_adapter()
out = []
rx = re.compile(r".*%s/[\w]+$" % segment)
for rule in adapter.map.iter_rules():
if rx.match(rule.rule):
endpoint = rule.endpoint
info = DefaultRouter.view_functions.get(endpoint).__doc__
url = DefaultRouter.url_for(endpoint, force_external=True)
out.append({
"url": url,
"info": info and info.strip() or "No description available",
"methods": ",".join(rule.methods),
})
return out
@add_route(BASE_URL, "api", methods=["GET"])
@add_plone_route("api.json", "api", methods=["GET"])
[docs]def api_json(context, request):
""" API URLs
"""
items = get_api_routes_for(BASE_URL)
return {
"url": DefaultRouter.url_for("api", force_external=True),
"count": len(items),
"items": items,
}
[docs]def initialize(context):
""" Initializer called when used as a Zope 2 product.
"""
logger.info("*** PLONE.JSONAPI.ROUTES INITIALIZE ***")
# We have to import the modules so that the routes get initialized
import pkgutil
import providers
prefix = providers.__name__ + "."
for importer, modname, ispkg in pkgutil.iter_modules(providers.__path__, prefix):
module = __import__(modname, fromlist="dummy")
logger.info("INITIALIZED ROUTE PROVIDER ---> %s" % module.__name__)
import version
logger.info("INITIALIZED ROUTE PROVIDER ---> %s" % version.__name__)
# vim: set ft=python ts=4 sw=4 expandtab :