Source code for flask_restful_dbbase.resources.meta_resource
# flask_restful_dbbase/meta_resource.py
"""
This module implements resource with a purpose of documenting
a model resource.
Assumes a get method.
"""
from os import path
from flask import request
from . import Resource
[docs]class MetaResource(Resource):
    """MetaResource
    This class enables documentation for a model resource.
    **Class variables**:
    resource_class: This is the model resource that you wish to documnent.
    url_prefix: Like with the ModelResource class, this prefix can be used
    to create a url for the documentation.
    url_name: This is the final part of a url for creating a url.
    It defaults to a name of 'meta'.
    Both the url_prefix and url_name come into play only upon initial
    configuration.
    """
    resource_class = None
    """ This is the resource class to be documented """
    url_prefix = "meta"
    """ This is the default prefix to be used for the URL."""
    url_name = None
    """
    This name can be used to make the default URL for the meta resource.
    """
[docs]    def get(self):
        """
        This function is the request.GET method for the meta resource URL.
        Args:
            method: (str) : can specify only a specific method of the resource
            to be documented, such as get or put.
            filter: (str) : the details of the table
        Returns:
            meta: (json) : The documentation
        """
        method = request.values.get("method", None)
        if method is not None:
            method = method.lower()
        try:
            return (
                self.resource_class.get_meta(method),
                200,
            )
        except Exception as err:
            msg = err.args[0]
            return {"message": msg}, 400
[docs]    @classmethod
    def get_urls(cls):
        """get_urls
        This function returns a default url for the resource. To keep
        consistency with the get_urls functions in other resources,
        it returns the url in a list, even though there would never be
        more than one.
        The approach enables a code consistent approach when using the
        api.add_resource function.
        Example:
        api.add_resource(BookResource, *BookResource.get_urls())
        api.add_resource(BookCollection, *BookCollection.get_urls())
        api.add_resource(BookMetaResource, *BookMetaResource.get_urls())
        api.add_resource(BookMetaCollection, *BookMetaCollection.get_urls())
        Default URLS:
        /books
        /books/<int:id>
        /meta/books/single
        /meta/books/collection
        Bear in mind that the `get_urls` function is only for
        convenience when adding the resource the api.
        """
        if cls.url_name is None:
            # derive it from the resource
            resource_url = cls.resource_class.create_url().split("/")
            # insert meta url_prefix
            resource_url.insert(-1, cls.url_prefix)
            # replace root
            resource_url[0] = "/"
            if cls.resource_class.is_collection():
                resource_url.append("collection")
            else:
                resource_url.append("single")
            url = path.join(*resource_url)
        else:
            # give exactly what is asked
            url = path.join(cls.url_prefix, cls.url_name)
            if not url.startswith("/"):
                url = f"/{url}"
        return [url]