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
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)
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, )