# -*- coding: utf-8 -*- ########################################################################## # OpenLP - Open Source Lyrics Projection # # ---------------------------------------------------------------------- # # Copyright (c) 2008-2019 OpenLP Developers # # ---------------------------------------------------------------------- # # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program. If not, see . # ########################################################################## """ The Endpoint class, which provides plugins with a way to serve their own portion of the API """ from mako.template import Template from openlp.core.common.applocation import AppLocation class Endpoint(object): """ This is an endpoint for the HTTP API """ def __init__(self, url_prefix, template_dir=None, static_dir=None, assets_dir=None): """ Create an endpoint with a URL prefix """ self.url_prefix = url_prefix self.static_dir = static_dir self.template_dir = template_dir if assets_dir: self.assets_dir = assets_dir else: self.assets_dir = None self.routes = [] def add_url_route(self, url, view_func, method): """ Add a url route to the list of routes """ self.routes.append((url, view_func, method)) def route(self, rule, method='GET'): """ Set up a URL route """ def decorator(func): """ Make this a decorator """ self.add_url_route(rule, func, method) return func return decorator def render_template(self, filename, **kwargs): """ Render a mako template :param str filename: The file name of the template to render. :return: The rendered template object. :rtype: mako.template.Template """ root_path = AppLocation.get_section_data_path('remotes') if not self.template_dir: raise Exception('No template directory specified') path = root_path / self.template_dir / filename if self.static_dir: kwargs['static_url'] = '/{prefix}/static'.format(prefix=self.url_prefix) kwargs['static_url'] = kwargs['static_url'].replace('//', '/') kwargs['assets_url'] = '/assets' return Template(filename=str(path), input_encoding='utf-8').render(**kwargs)