Source code for fasjson.web.apis.base

import ldap
from flask_restx import Api
from flask_restx.api import SwaggerView
from python_freeipa.exceptions import BadRequest


[docs] def handle_ldap_local_error(error): """When an LDAP local error occurs, return a 500 status code. Args: error (ldap.LOCAL_ERROR): the exception that was raised Returns: dict: a description of the error """ return ( { "message": "LDAP local error", "details": str(error), "source": "LDAP", }, 500, )
[docs] def handle_ldap_server_error(error): """When the LDAP server is down, return a 500 status code. Args: error (ldap.SERVER_DOWN): the exception that was raised Returns: dict: a description of the error """ return {"message": "LDAP server is down", "source": "LDAP"}, 500
[docs] def handle_rpc_error(error): """When a JSON-RPC error occurs, return a 400 status code. Warning, the exception does not always have a ``code`` attribute. Args: error (python_freeipa.exceptions.BadRequest): the exception that was raised Returns: dict: a description of the error """ return ( { "message": error.message, "code": getattr(error, "code", None), "source": "RPC", }, 400, )
API_DEFAULTS = { "title": "FAS-JSON", "description": "The Fedora Accounts System JSON API", "license": "GPLv3", "license_url": "https://www.gnu.org/licenses/gpl-3.0.html", # We add our own route for specs and docs "add_specs": False, "doc": False, }
[docs] class FasJsonApi(Api):
[docs] def init_app(self, app, **kwargs): for key, value in API_DEFAULTS.items(): kwargs.setdefault(key, value) super().init_app(app, **kwargs) self.errorhandler(ldap.LOCAL_ERROR)(handle_ldap_local_error) self.errorhandler(ldap.SERVER_DOWN)(handle_ldap_server_error) self.errorhandler(BadRequest)(handle_rpc_error) self.blueprint.record_once(self._on_blueprint_registration)
def _on_blueprint_registration(self, state): # Add URL rules on the top level app self._register_specs_top(state.app) self._register_doc_top(state.app) def _register_specs_top(self, top_level_app): endpoint = f"{self.blueprint.name}.specs" top_level_app.add_url_rule( f"/specs/{self.blueprint.name}.json", endpoint=endpoint, view_func=SwaggerView.as_view(endpoint, self, [self]), ) def _register_doc_top(self, top_level_app): top_level_app.add_url_rule( f"/docs/{self.blueprint.name}/", f"{self.blueprint.name}.doc", self.render_doc, )