Source code for cowbird.api.schemas

from typing import Any, Dict

import colander
from cornice import Service
from cornice.service import get_services
from cornice_swagger.swagger import CorniceSwagger
from pyramid.httpexceptions import (
    HTTPBadRequest,
    HTTPConflict,
    HTTPFailedDependency,
    HTTPForbidden,
    HTTPInternalServerError,
    HTTPMethodNotAllowed,
    HTTPNotAcceptable,
    HTTPNotFound,
    HTTPOk,
    HTTPUnauthorized,
    HTTPUnprocessableEntity
)
from pyramid.security import NO_PERMISSION_REQUIRED

from cowbird import __meta__
from cowbird.constants import get_constant
from cowbird.typedefs import JSON, HTTPMethod
from cowbird.utils import (
    CONTENT_TYPE_HTML,
    CONTENT_TYPE_JSON,
    KNOWN_CONTENT_TYPES,
    SUPPORTED_ACCEPT_TYPES,
    SUPPORTED_FORMAT_TYPES,
    ExtendedEnum
)

# ignore naming style of tags
# pylint: disable=C0103,invalid-name

[docs] TitleAPI = f"{__meta__.__title__} REST API"
[docs] InfoAPI: JSON = { "description": __meta__.__description__, "contact": {"name": __meta__.__maintainer__, "email": __meta__.__email__, "url": __meta__.__url__} }
# Security
[docs] SecurityCookieAuthAPI: JSON = {} # {"cookieAuth": {"type": "apiKey", "in": "cookie", "name": "token"}}
[docs] SecurityDefinitionsAPI: JSON = {"securityDefinitions": SecurityCookieAuthAPI}
[docs] SecurityAuthenticatedAPI: JSON = [{"cookieAuth": []}]
[docs] SecurityAdministratorAPI: JSON = [{"cookieAuth": []}]
[docs] SecurityEveryoneAPI: JSON = [{}]
[docs] def get_security(service: Service, method: HTTPMethod) -> JSON: definitions = service.definitions args = {} for definition in definitions: met, _, args = definition if met == method: break # automatically retrieve permission if specified within the view definition permission = args.get("permission") if permission == NO_PERMISSION_REQUIRED: return SecurityEveryoneAPI if permission == get_constant("COWBIRD_ADMIN_PERMISSION"): return SecurityAdministratorAPI # return default admin permission otherwise unless specified form cornice decorator return SecurityAdministratorAPI if "security" not in args else args["security"]
[docs] def service_api_route_info(service_api: Service, **kwargs: Any) -> Dict[str, Any]: """ Employed to simplify Pyramid route and view config definitions from same schema objects. """ kwargs.update({ "name": service_api.name, "pattern": service_api.path, }) kwargs.setdefault("traverse", getattr(service_api, "traverse", None)) kwargs.setdefault("factory", getattr(service_api, "factory", None)) return kwargs
[docs] class ValidOperations(ExtendedEnum): """ Valid values as webhook event. """
[docs] CreateOperation = "created"
[docs] DeleteOperation = "deleted"
[docs] def generate_api_schema(swagger_base_spec: JSON) -> JSON: """ Return JSON Swagger specifications of Cowbird REST API. Uses Cornice Services and Schemas to return swagger specification. :param swagger_base_spec: dictionary that specifies the 'host' and list of HTTP 'schemes' to employ. """ generator = CorniceSwagger(get_services()) # function docstrings are used to create the route's summary in Swagger-UI generator.summary_docstrings = True generator.default_security = get_security swagger_base_spec.update(SecurityDefinitionsAPI) # type: ignore[arg-type] generator.swagger = swagger_base_spec json_api_spec = generator.generate(title=TitleAPI, version=__meta__.__version__, info=InfoAPI) for tag in json_api_spec["tags"]: tag["description"] = TAG_DESCRIPTIONS[tag["name"]] return json_api_spec
# Service Routes
[docs] SwaggerGenerator = Service( path="/json", name="swagger_schema_json")
[docs] SwaggerAPI = Service( path="/api", name="swagger_schema_ui", description=f"{TitleAPI} documentation")
[docs] VersionAPI = Service( path="/version", name="Version")
[docs] HomepageAPI = Service( path="/", name="homepage")
[docs] HandlersAPI = Service( path="/handlers", name="handler_list")
[docs] HandlerAPI = Service( path="/handlers/{handler_name}", name="handler_detail")
[docs] HandlerResyncAPI = Service( path="/handlers/{handler_name}/resync", name="handler_resync")
[docs] UserWebhookAPI = Service( path="/webhooks/users", name="user_webhook")
[docs] PermissionWebhookAPI = Service( path="/webhooks/permissions", name="permission_webhook")
# Path parameters
[docs] OperationParameter = colander.SchemaNode( colander.String(), description="Operation to interact with.", example="users",)
[docs] HandlerNameParameter = colander.SchemaNode( colander.String(), description="Registered handler name.", example="my-wps")
[docs] class Handler_RequestPathSchema(colander.MappingSchema):
[docs] handler_name = HandlerNameParameter
# Tags
[docs] APITag = "API"
[docs] WebhooksTag = "Webhooks"
[docs] HandlersTag = "Handlers"
[docs] TAG_DESCRIPTIONS = { APITag: "General information about the API.", WebhooksTag: f"Webhooks that are managed by {__meta__.__title__}.\n\n" + "Each of the managed webhook provides specific functionalities against specific handlers of the stack.", HandlersTag: f"Handlers that are managed by {__meta__.__title__}.\n\n" + "Each handler defines information such as endpoint and configuration details for running webhooks.", }
# Header definitions
[docs] class AcceptType(colander.SchemaNode):
[docs] schema_type = colander.String
[docs] default = CONTENT_TYPE_JSON
[docs] example = CONTENT_TYPE_JSON
[docs] missing = colander.drop
[docs] class ContentType(colander.SchemaNode):
[docs] schema_type = colander.String
[docs] name = "Content-Type"
[docs] default = CONTENT_TYPE_JSON
[docs] example = CONTENT_TYPE_JSON
[docs] missing = colander.drop
[docs] class RequestHeaderSchemaAPI(colander.MappingSchema):
[docs] accept = AcceptType(name="Accept", validator=colander.OneOf(SUPPORTED_ACCEPT_TYPES), description="Desired MIME type for the response body content.")
[docs] content_type = ContentType(validator=colander.OneOf(KNOWN_CONTENT_TYPES), description="MIME content type of the request body.")
[docs] class RequestHeaderSchemaUI(colander.MappingSchema):
[docs] content_type = ContentType(default=CONTENT_TYPE_HTML, example=CONTENT_TYPE_HTML, description="MIME content type of the request body.")
[docs] class QueryRequestSchemaAPI(colander.MappingSchema):
[docs] format = AcceptType(validator=colander.OneOf(SUPPORTED_FORMAT_TYPES), description="Desired MIME type for the response body content. " "This formatting alternative by query parameter overrides the Accept header.")
[docs] class BaseRequestSchemaAPI(colander.MappingSchema):
[docs] header = RequestHeaderSchemaAPI()
[docs] querystring = QueryRequestSchemaAPI()
[docs] class HeaderResponseSchema(colander.MappingSchema):
[docs] content_type = ContentType(validator=colander.OneOf(SUPPORTED_ACCEPT_TYPES), description="MIME content type of the response body.")
[docs] class BaseResponseSchemaAPI(colander.MappingSchema):
[docs] header = HeaderResponseSchema()
[docs] class BaseResponseBodySchema(colander.MappingSchema): def __init__(self, code: int, description: str, **kw: Any) -> None: super(BaseResponseBodySchema, self).__init__(**kw) assert isinstance(code, int) # nosec: B101 assert isinstance(description, str) # nosec: B101 self.__code = code # pylint: disable=W0238,unused-private-member self.__desc = description # pylint: disable=W0238,unused-private-member # update the values child_nodes = getattr(self, "children", []) child_nodes.append(colander.SchemaNode( colander.Integer(), name="code", description="HTTP response code", example=code)) child_nodes.append(colander.SchemaNode( colander.String(), name="type", description="Response content type", example=CONTENT_TYPE_JSON)) child_nodes.append(colander.SchemaNode( colander.String(), name="detail", description="Response status message", example=description))
[docs] class ErrorVerifyParamConditions(colander.MappingSchema):
[docs] not_none = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs] not_empty = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs] not_in = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs] not_equal = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs] is_none = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs] is_empty = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs] is_in = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs] is_equal = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs] is_true = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs] is_false = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs] is_type = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs] matches = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs] class ErrorVerifyParamBodySchema(colander.MappingSchema):
[docs] name = colander.SchemaNode( colander.String(), description="Name of the failing condition parameter that caused the error.", missing=colander.drop)
[docs] value = colander.SchemaNode( colander.String(), description="Value of the failing condition parameter that caused the error.", default=None)
[docs] compare = colander.SchemaNode( colander.String(), description="Comparison value(s) employed for evaluation of the failing condition parameter.", missing=colander.drop)
[docs] conditions = ErrorVerifyParamConditions( description="Evaluated conditions on the parameter value with corresponding validation status. " "Some results are relative to the comparison value when provided.")
[docs] class ErrorFallbackBodySchema(colander.MappingSchema):
[docs] exception = colander.SchemaNode(colander.String(), description="Raise exception.")
[docs] error = colander.SchemaNode(colander.String(), description="Error message describing the cause of exception.")
[docs] class ErrorCallBodySchema(ErrorFallbackBodySchema):
[docs] detail = colander.SchemaNode(colander.String(), description="Contextual explanation about the cause of error.")
[docs] content = colander.MappingSchema(default=None, unknown="preserve", description="Additional contextual details that lead to the error. " "Can have any amount of sub-field to describe evaluated values.")
[docs] class ErrorResponseBodySchema(BaseResponseBodySchema): def __init__(self, code: int, description: str, **kw: Any) -> None: super(ErrorResponseBodySchema, self).__init__(code, description, **kw) assert code >= 400 # nosec: B101
[docs] route_name = colander.SchemaNode( colander.String(), description="Route called that generated the error.", example="/users/toto")
[docs] request_url = colander.SchemaNode( colander.String(), title="Request URL", description="Request URL that generated the error.", example="http://localhost:2001/cowbird/users/toto")
[docs] method = colander.SchemaNode( colander.String(), description="Request method that generated the error.", example="GET")
[docs] param = ErrorVerifyParamBodySchema( title="Parameter", missing=colander.drop, description="Additional parameter details to explain the cause of error.")
[docs] call = ErrorCallBodySchema( missing=colander.drop, description="Additional details to explain failure reason of operation call or raised error.")
[docs] fallback = ErrorFallbackBodySchema( missing=colander.drop, description="Additional details to explain failure reason of fallback operation to clean up the call error.")
[docs] class InternalServerErrorResponseBodySchema(ErrorResponseBodySchema): def __init__(self, **kw: Any) -> None: kw["code"] = HTTPInternalServerError.code super(InternalServerErrorResponseBodySchema, self).__init__(**kw)
[docs] class BadRequestResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Required value for request is missing."
[docs] body = ErrorResponseBodySchema(code=HTTPBadRequest.code, description=description)
[docs] class UnauthorizedResponseBodySchema(ErrorResponseBodySchema): def __init__(self, **kw: Any) -> None: kw["code"] = HTTPUnauthorized.code super(UnauthorizedResponseBodySchema, self).__init__(**kw)
[docs] route_name = colander.SchemaNode(colander.String(), description="Specified API route.")
[docs] request_url = colander.SchemaNode(colander.String(), description="Specified request URL.")
[docs] class UnauthorizedResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Unauthorized access to this resource. Missing authentication headers or cookies."
[docs] body = UnauthorizedResponseBodySchema(code=HTTPUnauthorized.code, description=description)
[docs] class HTTPForbiddenResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Forbidden operation for this resource or insufficient user privileges."
[docs] body = ErrorResponseBodySchema(code=HTTPForbidden.code, description=description)
[docs] class NotFoundResponseSchema(BaseResponseSchemaAPI):
[docs] description = "The route resource could not be found."
[docs] body = ErrorResponseBodySchema(code=HTTPNotFound.code, description=description)
[docs] class MethodNotAllowedResponseSchema(BaseResponseSchemaAPI):
[docs] description = "The method is not allowed for this resource."
[docs] body = ErrorResponseBodySchema(code=HTTPMethodNotAllowed.code, description=description)
[docs] class NotAcceptableResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Unsupported Content-Type in 'Accept' header was specified."
[docs] body = ErrorResponseBodySchema(code=HTTPNotAcceptable.code, description=description)
[docs] class UnprocessableEntityResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Invalid value specified."
[docs] body = ErrorResponseBodySchema(code=HTTPUnprocessableEntity.code, description=description)
[docs] class InternalServerErrorResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Internal Server Error. Unhandled exception occurred."
[docs] body = ErrorResponseBodySchema(code=HTTPInternalServerError.code, description=description)
[docs] class PermissionSchema(colander.SchemaNode):
[docs] description = "Managed permission under a service."
[docs] schema_type = colander.String
[docs] example = "test-permission"
[docs] class PermissionListSchema(colander.SequenceSchema):
[docs] description = "List of managed permissions under a service."
[docs] permission = PermissionSchema()
[docs] class ResourceSchema(colander.SchemaNode):
[docs] description = "Managed resource under a service."
[docs] schema_type = colander.String
[docs] example = "test-resource"
[docs] class ResourceListSchema(colander.SequenceSchema):
[docs] description = "List of managed resources under a service."
[docs] resource = ResourceSchema()
[docs] class HandlerSummarySchema(colander.SchemaNode):
[docs] description = "Managed handler."
[docs] schema_type = colander.String
[docs] example = "test-handler"
[docs] class HandlerListSchema(colander.SequenceSchema):
[docs] description = "List of managed handlers."
[docs] handler = colander.SchemaNode( colander.String(), description="Name of the handler.", example="Thredds" )
[docs] class HandlerConfigurationSchema(colander.MappingSchema):
[docs] description = "Custom configuration of the handler. Expected format and fields specific to each handler type."
[docs] missing = colander.drop
[docs] default = colander.null
[docs] class HandlerDetailSchema(colander.MappingSchema):
[docs] name = colander.SchemaNode( colander.String(), description="Name of the handler", example="thredds" )
[docs] type = colander.SchemaNode( colander.String(), description="Type of the handler", example="thredds" )
[docs] url = colander.SchemaNode( colander.String(), missing=colander.drop, # if listed with corresponding scope (users/groups/admin) description="URL of the handler (restricted access)", example="http://localhost:9999/thredds" )
[docs] resources = ResourceListSchema()
[docs] permissions = PermissionListSchema()
[docs] class Handlers_GET_RequestSchema(BaseRequestSchemaAPI): pass
[docs] class Handlers_GET_ResponseBodySchema(BaseResponseBodySchema):
[docs] handlers = HandlerListSchema()
[docs] class Handlers_GET_OkResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Get handlers successful."
[docs] body = Handlers_GET_ResponseBodySchema(code=HTTPOk.code, description=description)
[docs] class Handlers_GET_BadRequestResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Invalid handler name."
[docs] body = ErrorResponseBodySchema(code=HTTPBadRequest.code, description=description)
[docs] class Handlers_POST_RequestBodySchema(HandlerDetailSchema): pass # FIXME: define fields with derived from MappingSchema if request accepts different fields
[docs] class Handlers_POST_RequestSchema(BaseRequestSchemaAPI):
[docs] body = Handlers_POST_RequestBodySchema()
[docs] class Handlers_POST_CreatedResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Handler creation successful."
[docs] body = BaseResponseBodySchema(code=HTTPOk.code, description=description)
[docs] class Handlers_POST_BadRequestResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Invalid value parameters for handler creation."
[docs] body = ErrorResponseBodySchema(code=HTTPBadRequest.code, description=description)
[docs] class Handler_SummaryBodyResponseSchema(BaseResponseBodySchema):
[docs] handler = HandlerSummarySchema()
[docs] class Handler_GET_RequestSchema(BaseRequestSchemaAPI):
[docs] path = Handler_RequestPathSchema()
[docs] class Handler_GET_ResponseBodySchema(BaseResponseBodySchema):
[docs] handler = HandlerDetailSchema()
[docs] class Handler_GET_OkResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Get handler successful."
[docs] body = Handler_GET_ResponseBodySchema(code=HTTPOk.code, description=description)
[docs] class Handler_Check_NotFoundResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Could not find specified handler."
[docs] body = ErrorResponseBodySchema(code=HTTPNotFound.code, description=description)
[docs] class HandlerResync_PUT_RequestSchema(BaseRequestSchemaAPI):
[docs] path = Handler_RequestPathSchema()
[docs] class HandlerResync_PUT_OkResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Handler resync successful."
[docs] body = BaseResponseBodySchema(code=HTTPOk.code, description=description)
[docs] class Handlers_POST_ForbiddenResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Handler registration forbidden."
[docs] body = ErrorResponseBodySchema(code=HTTPForbidden.code, description=description)
[docs] class Handlers_POST_ConflictResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Specified 'handler_name' value already exists."
[docs] body = ErrorResponseBodySchema(code=HTTPConflict.code, description=description)
[docs] class Handlers_POST_UnprocessableEntityResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Handler creation for registration failed."
[docs] body = ErrorResponseBodySchema(code=HTTPUnprocessableEntity.code, description=description)
[docs] class Handlers_POST_InternalServerErrorResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Handler registration status could not be validated."
[docs] body = ErrorResponseBodySchema(code=HTTPInternalServerError.code, description=description)
[docs] class Handler_PATCH_RequestBodySchema(HandlerDetailSchema): pass # FIXME: define fields with derived from MappingSchema if request accepts different fields
[docs] class Handler_PATCH_RequestSchema(BaseRequestSchemaAPI):
[docs] path = Handler_RequestPathSchema()
[docs] body = Handler_PATCH_RequestBodySchema()
[docs] class Handler_PATCH_ResponseBodySchema(Handler_GET_ResponseBodySchema): pass # FIXME: define fields with derived from MappingSchema if request accepts different fields
[docs] class Handler_PATCH_OkResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Update handler successful."
[docs] body = Handler_PATCH_ResponseBodySchema(code=HTTPOk.code, description=description)
[docs] class Handler_PATCH_BadRequestResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Registered handler values are already equal to update values."
[docs] body = ErrorResponseBodySchema(code=HTTPBadRequest.code, description=description)
[docs] class Handler_PATCH_ForbiddenResponseSchema_ReservedKeyword(BaseResponseSchemaAPI):
[docs] description = "Update handler name to 'types' not allowed (reserved keyword)."
[docs] body = ErrorResponseBodySchema(code=HTTPForbidden.code, description=description)
[docs] class Handler_PATCH_ForbiddenResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Update handler failed during value assignment."
[docs] body = ErrorResponseBodySchema(code=HTTPForbidden.code, description=description)
[docs] class Handler_PATCH_UnprocessableEntityResponseSchema(Handlers_POST_UnprocessableEntityResponseSchema): pass
[docs] class UserWebhook_POST_RequestBodySchema(colander.MappingSchema):
[docs] event = colander.SchemaNode( colander.String(), description="User event.", validator=colander.OneOf(ValidOperations.values()) )
[docs] user_name = colander.SchemaNode( colander.String(), description="User name being created or deleted." )
[docs] callback_url = colander.SchemaNode( colander.String(), description="Callback url to call in case of error while handling user creation.", missing=colander.drop )
[docs] class UserWebhook_POST_RequestSchema(BaseRequestSchemaAPI):
[docs] body = UserWebhook_POST_RequestBodySchema()
[docs] class UserWebhook_POST_BadRequestResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Invalid value parameters for user webhook."
[docs] body = ErrorResponseBodySchema(code=HTTPBadRequest.code, description=description)
[docs] class UserWebhook_POST_OkResponseSchema(BaseResponseSchemaAPI):
[docs] description = "User event successfully handled."
[docs] body = BaseResponseBodySchema(code=HTTPOk.code, description=description)
[docs] class UserWebhook_POST_InternalServerErrorResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Failed to handle user webhook event."
[docs] body = BaseResponseBodySchema(code=HTTPInternalServerError.code, description=description)
[docs] class PermissionWebhook_POST_RequestBodySchema(colander.MappingSchema):
[docs] event = colander.SchemaNode( colander.String(), description="Permission event.", validator=colander.OneOf(ValidOperations.values()) )
[docs] service_name = colander.SchemaNode( colander.String(), description="Service name of the resource affected by the permission update." )
[docs] resource_id = colander.SchemaNode( colander.String(), description="Identifier of the resource affected by the permission update." )
[docs] resource_full_name = colander.SchemaNode( colander.String(), description="Full resource name including parents of the resource affected by the permission update.", example="thredds/birdhouse/file.nc" )
[docs] name = colander.SchemaNode( colander.String(), description="Permission name applicable to the service/resource.", example="read" )
[docs] access = colander.SchemaNode( colander.String(), description="Permission access rule to the service/resource.", example="allow" )
[docs] scope = colander.SchemaNode( colander.String(), description="Permission scope over service/resource tree hierarchy.", example="recursive" )
[docs] user = colander.SchemaNode( colander.String(), description="User name for which the permission is applied or dropped. (User or group must be provided).", missing=colander.drop )
[docs] group = colander.SchemaNode( colander.String(), description="Group name for which the permission is applied or dropped. (User or group must be provided).", missing=colander.drop )
[docs] class PermissionWebhook_POST_RequestSchema(BaseRequestSchemaAPI):
[docs] body = PermissionWebhook_POST_RequestBodySchema()
[docs] class PermissionWebhook_POST_BadRequestResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Invalid value parameters for permission webhook."
[docs] body = ErrorResponseBodySchema(code=HTTPBadRequest.code, description=description)
[docs] class PermissionWebhook_POST_OkResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Permission event successfully handled."
[docs] body = BaseResponseBodySchema(code=HTTPOk.code, description=description)
[docs] class Version_GET_ResponseBodySchema(BaseResponseBodySchema):
[docs] version = colander.SchemaNode( colander.String(), description="Cowbird API version string", example=__meta__.__version__)
[docs] worker_version = colander.SchemaNode( colander.String(), description="Cowbird worker version string", example=__meta__.__version__, default=None)
[docs] db_version = colander.SchemaNode( colander.String(), description="Database version string", exemple="a395ef9d3fe6")
[docs] version_detail = colander.SchemaNode( colander.String(), description="Version detail string")
[docs] class Version_GET_OkResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Get version successful."
[docs] body = Version_GET_ResponseBodySchema(code=HTTPOk.code, description=description)
[docs] class FailedDependencyErrorResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Version dependencies could not all be identified."
[docs] body = ErrorResponseBodySchema(code=HTTPFailedDependency.code, description=description)
[docs] class Homepage_GET_OkResponseSchema(BaseResponseSchemaAPI):
[docs] description = "Get homepage successful."
[docs] body = BaseResponseBodySchema(code=HTTPOk.code, description=description)
[docs] class SwaggerAPI_GET_OkResponseSchema(colander.MappingSchema):
[docs] description = TitleAPI
[docs] header = RequestHeaderSchemaUI()
[docs] body = colander.SchemaNode(colander.String(), example="This page!")
# Responses for specific views
[docs] Handlers_GET_responses = { "200": Handlers_GET_OkResponseSchema(), "400": Handlers_GET_BadRequestResponseSchema(), "401": UnauthorizedResponseSchema(), "406": NotAcceptableResponseSchema(), "500": InternalServerErrorResponseSchema(), }
[docs] Handlers_POST_responses = { "201": Handlers_POST_CreatedResponseSchema(), "400": Handlers_POST_BadRequestResponseSchema(), "401": UnauthorizedResponseSchema(), "403": Handlers_POST_ForbiddenResponseSchema(), "406": NotAcceptableResponseSchema(), "409": Handlers_POST_ConflictResponseSchema(), "422": Handlers_POST_UnprocessableEntityResponseSchema(), "500": InternalServerErrorResponseSchema(), }
[docs] Handler_GET_responses = { "200": Handler_GET_OkResponseSchema(), "401": UnauthorizedResponseSchema(), "404": Handler_Check_NotFoundResponseSchema(), "406": NotAcceptableResponseSchema(), "500": InternalServerErrorResponseSchema(), }
[docs] Handler_PATCH_responses = { "200": Handler_PATCH_OkResponseSchema(), "400": Handler_PATCH_BadRequestResponseSchema(), "401": UnauthorizedResponseSchema(), "403": Handler_PATCH_ForbiddenResponseSchema(), "406": NotAcceptableResponseSchema(), "422": Handler_PATCH_UnprocessableEntityResponseSchema(), "500": InternalServerErrorResponseSchema(), }
[docs] HandlerResync_PUT_responses = { "200": HandlerResync_PUT_OkResponseSchema(), "404": Handler_Check_NotFoundResponseSchema(), "406": NotAcceptableResponseSchema(), "500": InternalServerErrorResponseSchema(), }
[docs] UserWebhook_POST_responses = { "200": UserWebhook_POST_OkResponseSchema(), "400": UserWebhook_POST_BadRequestResponseSchema(), "406": NotAcceptableResponseSchema(), "500": InternalServerErrorResponseSchema(), }
[docs] PermissionWebhook_POST_responses = { "200": PermissionWebhook_POST_OkResponseSchema(), "400": PermissionWebhook_POST_BadRequestResponseSchema(), "406": NotAcceptableResponseSchema(), "500": InternalServerErrorResponseSchema(), }
[docs] Version_GET_responses = { "200": Version_GET_OkResponseSchema(), "406": NotAcceptableResponseSchema(), "424": FailedDependencyErrorResponseSchema(), "500": InternalServerErrorResponseSchema(), }
[docs] Homepage_GET_responses = { "200": Homepage_GET_OkResponseSchema(), "406": NotAcceptableResponseSchema(), "500": InternalServerErrorResponseSchema(), }
[docs] SwaggerAPI_GET_responses = { "200": SwaggerAPI_GET_OkResponseSchema(), "500": InternalServerErrorResponseSchema(), }