Beispiel #1
0
    def get_response_serializers(self):
        responses = super().get_response_serializers()
        definitions = self.components.with_scope(
            openapi.SCHEMA_DEFINITIONS)  # type: openapi.ReferenceResolver

        definitions.setdefault("GenericError", self.get_generic_error_schema)
        definitions.setdefault("ValidationError",
                               self.get_validation_error_schema)
        definitions.setdefault("APIException", self.get_generic_error_schema)

        if self.get_request_serializer() or self.get_query_serializer():
            responses.setdefault(
                exceptions.ValidationError.status_code,
                openapi.Response(
                    description=force_real_str(
                        exceptions.ValidationError.default_detail),
                    schema=openapi.SchemaRef(definitions, "ValidationError"),
                ),
            )

        security = self.get_security()
        if security is None or len(security) > 0:
            # Note: 401 error codes are coerced  into 403 see
            # rest_framework/views.py:433:handle_exception
            # This is b/c the API uses token auth which doesn't have WWW-Authenticate header
            responses.setdefault(
                status.HTTP_403_FORBIDDEN,
                openapi.Response(
                    description=
                    "Authentication credentials were invalid, absent or insufficient.",
                    schema=openapi.SchemaRef(definitions, "GenericError"),
                ),
            )
        if not is_list_view(self.path, self.method, self.view):
            responses.setdefault(
                exceptions.PermissionDenied.status_code,
                openapi.Response(
                    description="Permission denied.",
                    schema=openapi.SchemaRef(definitions, "APIException"),
                ),
            )
            responses.setdefault(
                exceptions.NotFound.status_code,
                openapi.Response(
                    description=("Object does not exist or caller "
                                 "has insufficient permissions to access it."),
                    schema=openapi.SchemaRef(definitions, "APIException"),
                ),
            )

        return responses
    def get_response_serializers(self):
        responses = super().get_response_serializers()
        definitions = self.components.with_scope(
            openapi.SCHEMA_DEFINITIONS)  # type: openapi.ReferenceResolver

        definitions.setdefault('GenericError', self.get_generic_error_schema)
        definitions.setdefault('ValidationError',
                               self.get_validation_error_schema)
        definitions.setdefault('APIException', self.get_generic_error_schema)

        if self.get_request_serializer() or self.get_query_serializer():
            responses.setdefault(
                exceptions.ValidationError.status_code,
                openapi.Response(description=force_real_str(
                    exceptions.ValidationError.default_detail),
                                 schema=openapi.SchemaRef(
                                     definitions, 'ValidationError')))

        authenticators = self.view.get_authenticators()
        if authenticators and len(authenticators) > 0:
            responses.setdefault(
                exceptions.AuthenticationFailed.status_code,
                openapi.Response(
                    description=
                    "Authentication credentials were invalid, absent or insufficient.",
                    schema=openapi.SchemaRef(definitions, 'GenericError')))
        if not is_list_view(self.path, self.method, self.view):
            responses.setdefault(
                exceptions.PermissionDenied.status_code,
                openapi.Response(description="Permission denied.",
                                 schema=openapi.SchemaRef(
                                     definitions, 'APIException')))
            responses.setdefault(
                exceptions.NotFound.status_code,
                openapi.Response(
                    description=
                    "Object does not exist or caller has insufficient permissions to access it.",
                    schema=openapi.SchemaRef(definitions, 'APIException')))

        return responses
Beispiel #3
0
    def get_operation(self, operation_keys):
        consumes = self.get_consumes()
        produces = self.get_produces()

        multipart = [
            'multipart/form-data', 'application/x-www-form-urlencoded'
        ]
        if self.method != 'GET':
            request_params = self.get_request_body_parameters(multipart)
            type_list = [param['type'] for param in request_params if param]
            if 'file' in type_list:
                # automatically set the media type to form data if there's a file
                # needed due to https://github.com/axnsan12/drf-yasg/issues/386
                consumes = multipart

        body = self.get_request_body_parameters(consumes)
        query = self.get_query_parameters()
        if self.method == 'GET':
            fields_paramenter = Parameter(
                name="fields",
                in_="query",
                description="A list of fields to include in the response.",
                required=False,
                type="string",
            )
            query.append(fields_paramenter)
            not_fields_paramenter = Parameter(
                name="exclude_fields",
                in_="query",
                description="A list of fields to exclude from the response.",
                required=False,
                type="string",
            )
            query.append(not_fields_paramenter)
        parameters = body + query
        parameters = filter_none(parameters)
        parameters = self.add_manual_parameters(parameters)
        if 'bindings' in self.request.query_params:
            operation_id = self.overrides.get('operation_id', '')
            if not operation_id:
                operation_id = operation_keys[-1]
        else:
            operation_id = self.get_operation_id(operation_keys)
        summary, description = self.get_summary_and_description()

        if "include_html" not in self.request.query_params:
            description = strip_tags(description)

        security = self.get_security()
        assert security is None or isinstance(security, list), "security must be a list of " \
                                                               "security requirement objects"
        deprecated = self.is_deprecated()
        tags = self.get_tags(operation_keys)

        responses = self.get_responses()
        if 'operation_summary' not in self.overrides:
            summary = self.get_summary(operation_keys)
        return openapi.Operation(operation_id=operation_id,
                                 description=force_real_str(description),
                                 summary=force_real_str(summary),
                                 responses=responses,
                                 parameters=parameters,
                                 consumes=consumes,
                                 produces=produces,
                                 tags=tags,
                                 security=security,
                                 deprecated=deprecated)
Beispiel #4
0
    def get_operation(self, operation_keys):
        consumes = self.get_consumes()
        produces = self.get_produces()

        multipart = [
            "multipart/form-data", "application/x-www-form-urlencoded"
        ]
        if self.method != "GET":
            contains_file_field = False
            serializer = self.get_request_serializer()

            for field_name, field in getattr(serializer, "fields", {}).items():
                if isinstance(field, serializers.FileField):
                    contains_file_field = True
                    break

            if contains_file_field:
                # automatically set the media type to form data if there's a file
                # needed due to https://github.com/axnsan12/drf-yasg/issues/386
                consumes = multipart

        body = self.get_request_body_parameters(consumes)
        query = self.get_query_parameters()
        if self.method == "GET":
            fields_paramenter = Parameter(
                name="fields",
                in_="query",
                description="A list of fields to include in the response.",
                required=False,
                type="string",
            )
            query.append(fields_paramenter)
            not_fields_paramenter = Parameter(
                name="exclude_fields",
                in_="query",
                description="A list of fields to exclude from the response.",
                required=False,
                type="string",
            )
            query.append(not_fields_paramenter)
        parameters = body + query
        parameters = filter_none(parameters)
        parameters = self.add_manual_parameters(parameters)
        if "bindings" in self.request.query_params:
            operation_id = self.overrides.get("operation_id", "")
            if not operation_id:
                operation_id = operation_keys[-1]
        else:
            operation_id = self.get_operation_id(operation_keys)
        summary, description = self.get_summary_and_description()

        if "include_html" not in self.request.query_params:
            description = strip_tags(description)

        security = self.get_security()
        assert security is None or isinstance(
            security, list), ("security must be a list of "
                              "security requirement objects")
        deprecated = self.is_deprecated()
        tags = self.get_tags(operation_keys)

        responses = self.get_responses()
        if "operation_summary" not in self.overrides:
            summary = self.get_summary(operation_keys)
        return openapi.Operation(
            operation_id=operation_id,
            description=force_real_str(description),
            summary=force_real_str(summary),
            responses=responses,
            parameters=parameters,
            consumes=consumes,
            produces=produces,
            tags=tags,
            security=security,
            deprecated=deprecated,
        )