mirror of
https://gitlab.com/MoonTestUse1/AdministrationItDepartmens.git
synced 2025-08-14 00:25:46 +02:00
531 lines
22 KiB
Python
531 lines
22 KiB
Python
import http.client
|
|
import inspect
|
|
import warnings
|
|
from typing import Any, Dict, List, Optional, Sequence, Set, Tuple, Type, Union, cast
|
|
|
|
from fastapi import routing
|
|
from fastapi._compat import (
|
|
GenerateJsonSchema,
|
|
JsonSchemaValue,
|
|
ModelField,
|
|
Undefined,
|
|
get_compat_model_name_map,
|
|
get_definitions,
|
|
get_schema_from_model_field,
|
|
lenient_issubclass,
|
|
)
|
|
from fastapi.datastructures import DefaultPlaceholder
|
|
from fastapi.dependencies.models import Dependant
|
|
from fastapi.dependencies.utils import get_flat_dependant, get_flat_params
|
|
from fastapi.encoders import jsonable_encoder
|
|
from fastapi.openapi.constants import METHODS_WITH_BODY, REF_PREFIX, REF_TEMPLATE
|
|
from fastapi.openapi.models import OpenAPI
|
|
from fastapi.params import Body, Param
|
|
from fastapi.responses import Response
|
|
from fastapi.types import ModelNameMap
|
|
from fastapi.utils import (
|
|
deep_dict_update,
|
|
generate_operation_id_for_path,
|
|
is_body_allowed_for_status_code,
|
|
)
|
|
from starlette.responses import JSONResponse
|
|
from starlette.routing import BaseRoute
|
|
from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY
|
|
from typing_extensions import Literal
|
|
|
|
validation_error_definition = {
|
|
"title": "ValidationError",
|
|
"type": "object",
|
|
"properties": {
|
|
"loc": {
|
|
"title": "Location",
|
|
"type": "array",
|
|
"items": {"anyOf": [{"type": "string"}, {"type": "integer"}]},
|
|
},
|
|
"msg": {"title": "Message", "type": "string"},
|
|
"type": {"title": "Error Type", "type": "string"},
|
|
},
|
|
"required": ["loc", "msg", "type"],
|
|
}
|
|
|
|
validation_error_response_definition = {
|
|
"title": "HTTPValidationError",
|
|
"type": "object",
|
|
"properties": {
|
|
"detail": {
|
|
"title": "Detail",
|
|
"type": "array",
|
|
"items": {"$ref": REF_PREFIX + "ValidationError"},
|
|
}
|
|
},
|
|
}
|
|
|
|
status_code_ranges: Dict[str, str] = {
|
|
"1XX": "Information",
|
|
"2XX": "Success",
|
|
"3XX": "Redirection",
|
|
"4XX": "Client Error",
|
|
"5XX": "Server Error",
|
|
"DEFAULT": "Default Response",
|
|
}
|
|
|
|
|
|
def get_openapi_security_definitions(
|
|
flat_dependant: Dependant,
|
|
) -> Tuple[Dict[str, Any], List[Dict[str, Any]]]:
|
|
security_definitions = {}
|
|
operation_security = []
|
|
for security_requirement in flat_dependant.security_requirements:
|
|
security_definition = jsonable_encoder(
|
|
security_requirement.security_scheme.model,
|
|
by_alias=True,
|
|
exclude_none=True,
|
|
)
|
|
security_name = security_requirement.security_scheme.scheme_name
|
|
security_definitions[security_name] = security_definition
|
|
operation_security.append({security_name: security_requirement.scopes})
|
|
return security_definitions, operation_security
|
|
|
|
|
|
def get_openapi_operation_parameters(
|
|
*,
|
|
all_route_params: Sequence[ModelField],
|
|
schema_generator: GenerateJsonSchema,
|
|
model_name_map: ModelNameMap,
|
|
field_mapping: Dict[
|
|
Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue
|
|
],
|
|
separate_input_output_schemas: bool = True,
|
|
) -> List[Dict[str, Any]]:
|
|
parameters = []
|
|
for param in all_route_params:
|
|
field_info = param.field_info
|
|
field_info = cast(Param, field_info)
|
|
if not field_info.include_in_schema:
|
|
continue
|
|
param_schema = get_schema_from_model_field(
|
|
field=param,
|
|
schema_generator=schema_generator,
|
|
model_name_map=model_name_map,
|
|
field_mapping=field_mapping,
|
|
separate_input_output_schemas=separate_input_output_schemas,
|
|
)
|
|
parameter = {
|
|
"name": param.alias,
|
|
"in": field_info.in_.value,
|
|
"required": param.required,
|
|
"schema": param_schema,
|
|
}
|
|
if field_info.description:
|
|
parameter["description"] = field_info.description
|
|
if field_info.openapi_examples:
|
|
parameter["examples"] = jsonable_encoder(field_info.openapi_examples)
|
|
elif field_info.example != Undefined:
|
|
parameter["example"] = jsonable_encoder(field_info.example)
|
|
if field_info.deprecated:
|
|
parameter["deprecated"] = field_info.deprecated
|
|
parameters.append(parameter)
|
|
return parameters
|
|
|
|
|
|
def get_openapi_operation_request_body(
|
|
*,
|
|
body_field: Optional[ModelField],
|
|
schema_generator: GenerateJsonSchema,
|
|
model_name_map: ModelNameMap,
|
|
field_mapping: Dict[
|
|
Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue
|
|
],
|
|
separate_input_output_schemas: bool = True,
|
|
) -> Optional[Dict[str, Any]]:
|
|
if not body_field:
|
|
return None
|
|
assert isinstance(body_field, ModelField)
|
|
body_schema = get_schema_from_model_field(
|
|
field=body_field,
|
|
schema_generator=schema_generator,
|
|
model_name_map=model_name_map,
|
|
field_mapping=field_mapping,
|
|
separate_input_output_schemas=separate_input_output_schemas,
|
|
)
|
|
field_info = cast(Body, body_field.field_info)
|
|
request_media_type = field_info.media_type
|
|
required = body_field.required
|
|
request_body_oai: Dict[str, Any] = {}
|
|
if required:
|
|
request_body_oai["required"] = required
|
|
request_media_content: Dict[str, Any] = {"schema": body_schema}
|
|
if field_info.openapi_examples:
|
|
request_media_content["examples"] = jsonable_encoder(
|
|
field_info.openapi_examples
|
|
)
|
|
elif field_info.example != Undefined:
|
|
request_media_content["example"] = jsonable_encoder(field_info.example)
|
|
request_body_oai["content"] = {request_media_type: request_media_content}
|
|
return request_body_oai
|
|
|
|
|
|
def generate_operation_id(
|
|
*, route: routing.APIRoute, method: str
|
|
) -> str: # pragma: nocover
|
|
warnings.warn(
|
|
"fastapi.openapi.utils.generate_operation_id() was deprecated, "
|
|
"it is not used internally, and will be removed soon",
|
|
DeprecationWarning,
|
|
stacklevel=2,
|
|
)
|
|
if route.operation_id:
|
|
return route.operation_id
|
|
path: str = route.path_format
|
|
return generate_operation_id_for_path(name=route.name, path=path, method=method)
|
|
|
|
|
|
def generate_operation_summary(*, route: routing.APIRoute, method: str) -> str:
|
|
if route. |