Beispiel #1
0
    def get_operation(self, operation_keys):
        consumes = self.get_consumes()

        body = self.get_request_body_parameters(consumes)
        query = self.get_query_parameters()
        parameters = body + query
        parameters = [param for param in parameters if param is not None]
        parameters = self.add_manual_parameters(parameters)

        operation_id = self.get_operation_id(operation_keys)
        summary, description = self.get_summary_and_description()

        remove_keys = [
            'create', 'update', 'delete', 'list', 'read', 'partial_update'
        ]
        operation_keys = [
            key for key in operation_keys if key not in remove_keys
        ]

        if len(operation_keys) >= 2:
            tags = ["/".join([item for item in operation_keys])]
        else:
            tags = [operation_keys[-1]]

        responses = self.get_responses()

        return openapi.Operation(
            operation_id=operation_id,
            description=description,
            responses=responses,
            parameters=parameters,
            consumes=consumes,
            tags=tags,
        )
Beispiel #2
0
    def get_operation(self, operation_keys=None):
        consumes = self.get_consumes()
        produces = self.get_produces()

        body = self.get_request_body_parameters(consumes)
        query = self.get_query_parameters()
        parameters = body + query
        parameters = [param for param in parameters if param is not None]
        parameters = self.add_manual_parameters(parameters)

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

        responses = self.get_responses()

        operation = 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,
        )
        return self.set_x_code_samples(operation)
    def get_operation(self, operation_keys=None):
        operation_keys = operation_keys or self.operation_keys

        consumes = self.get_consumes()
        produces = self.get_produces()

        body = self.get_request_body_parameters(consumes)
        query = self.get_query_parameters()
        parameters = body + query
        parameters = filter_none(parameters)
        parameters = self.add_manual_parameters(parameters)

        operation_id = self.get_operation_id(operation_keys)
        summary, description = self.get_summary_and_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()

        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,
            **{'x-code-samples': self.overrides.get('code_examples')})
Beispiel #4
0
    def get_operation(self, operation_keys):
        route = self._get_route()
        if route is None:
            return super().get_operation(operation_keys)
        method = route.method
        consumes = self._get_consumes(route)
        produces = self._get_produces(route)

        body = self._get_request_body_parameters(route)
        manual_parameters = build_method_parameters(route)
        parameters = merge_params(body, manual_parameters)

        operation_id = method.full_name
        description = method.docstring.short_description
        deprecated = self.is_deprecated()
        responses = self._get_responses(route)
        tags = self.get_tags(operation_keys)

        return openapi.Operation(
            operation_id=operation_id,
            description=description,
            responses=responses,
            parameters=parameters,
            consumes=consumes,
            produces=produces,
            deprecated=deprecated,
            tags=tags,
        )
Beispiel #5
0
 def get_operation(self, operation_keys):
     return openapi.Operation(
         operation_id='media_embed',
         responses=openapi.Responses(
             {302: openapi.Response(description='Media embed page')}),
         tags=['media'],
     )
Beispiel #6
0
    def get_operation(self, operation_keys=None):
        operation = super().get_operation(operation_keys)

        return openapi.Operation(
            operation.operation_id,
            **{k: v for k,v in operation.items() if k != operation.operation_id},
            **{'x-code-samples': self.overrides.get('code_examples')}
        )
Beispiel #7
0
def test_get_operation_with_serializer():
    view = View()
    route = get_route(Controller.post_with_serializer)
    View.post.route = route
    reference_resolver = openapi.ReferenceResolver('definitions',
                                                   'parameters',
                                                   force_init=True)
    auto_schema = SwaggerAutoSchema(view, 'path', route.http_method,
                                    reference_resolver, 'request', {})
    operation = auto_schema.get_operation(['test_app', 'post'])
    schema_ref = openapi.SchemaRef(
        resolver=reference_resolver,
        schema_name='User',
    )
    parameters = [
        openapi.Parameter(
            name='data',
            in_=openapi.IN_BODY,
            required=True,
            schema=schema_ref,
        ),
    ]
    responses = openapi.Responses({
        '200':
        openapi.Response(
            description='',
            schema=openapi.Schema(
                type=openapi.TYPE_OBJECT,
                properties={
                    'name': {
                        'type': 'string',
                    },
                },
            ),
        ),
    })

    assert operation == openapi.Operation(
        operation_id='Controller.post_with_serializer',
        responses=responses,
        consumes=['application/json'],
        produces=['application/json'],
        tags=['test_app'],
        parameters=parameters,
    )
    del View.post.route
Beispiel #8
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 'file' in [param['type'] for param in self.get_request_body_parameters(multipart)]:
            # 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()
        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()
        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 #9
0
 def get_operation(self, operation_keys):
     return openapi.Operation(
         operation_id='media_source',
         responses=openapi.Responses(
             {302: openapi.Response(description='Media source stream')}),
         parameters=[
             openapi.Parameter(name='mimeType',
                               in_=openapi.IN_QUERY,
                               description='MIME type of media source',
                               type=openapi.TYPE_STRING),
             openapi.Parameter(name='width',
                               in_=openapi.IN_QUERY,
                               description='Width of media source',
                               type=openapi.TYPE_INTEGER),
             openapi.Parameter(name='height',
                               in_=openapi.IN_QUERY,
                               description='Height of media source',
                               type=openapi.TYPE_INTEGER),
         ],
         tags=['media'],
     )
Beispiel #10
0
def test_get_operation_without_route():
    view = View()
    reference_resolver = openapi.ReferenceResolver('definitions',
                                                   'parameters',
                                                   force_init=True)
    auto_schema = SwaggerAutoSchema(view, 'path', 'get', reference_resolver,
                                    'request', {})
    operation = auto_schema.get_operation(['test_app', 'post'])
    parameters = []
    responses = openapi.Responses({
        '200': openapi.Response(description=''),
    })

    assert operation == openapi.Operation(
        description='',
        operation_id='test_app_post',
        responses=responses,
        consumes=['application/json'],
        produces=['application/json'],
        tags=['test_app'],
        parameters=parameters,
    )
Beispiel #11
0
 def get_operation(self, operation_keys):
     return openapi.Operation(
         operation_id='media_poster',
         responses=openapi.Responses(
             {302: openapi.Response(description='Media poster image')}),
         parameters=[
             openapi.Parameter(
                 name='width',
                 in_=openapi.IN_PATH,
                 description='Desired width of image.',
                 type=openapi.TYPE_INTEGER,
                 enum=POSTER_IMAGE_VALID_WIDTHS,
             ),
             openapi.Parameter(
                 name='extension',
                 in_=openapi.IN_PATH,
                 description='Desired format of image.',
                 type=openapi.TYPE_STRING,
                 enum=POSTER_IMAGE_VALID_EXTENSIONS,
             ),
         ],
         tags=['media'],
     )
Beispiel #12
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 #13
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,
        )
Beispiel #14
0
def test_get_operation():
    view = View()
    route = get_route(Controller.post)
    View.post.route = route
    auto_schema = SwaggerAutoSchema(view, 'path', route.http_method,
                                    'components', 'request', {})

    operation = auto_schema.get_operation(['test_app', 'post'])
    parameters = [
        openapi.Parameter(
            name='data',
            in_=openapi.IN_BODY,
            required=True,
            schema=openapi.Schema(
                title='UserDTO',
                type=openapi.TYPE_OBJECT,
                properties={
                    'name': {
                        'type': openapi.TYPE_STRING,
                    },
                },
            ),
        ),
        openapi.Parameter(
            name='path_param',
            in_=openapi.IN_PATH,
            description='',
            required=True,
            type=openapi.TYPE_INTEGER,
        ),
        openapi.Parameter(
            name='query_param',
            in_=openapi.IN_QUERY,
            description='',
            required=True,
            type=openapi.TYPE_INTEGER,
        ),
    ]
    responses = openapi.Responses({
        '200':
        openapi.Response(
            description='',
            schema=openapi.Schema(
                type=openapi.TYPE_OBJECT,
                properties={
                    'name': {
                        'type': 'string',
                    },
                },
            ),
        ),
    })

    assert operation == openapi.Operation(
        operation_id='Controller.post',
        responses=responses,
        consumes=['application/json; charset=utf-8'],
        produces=['application/json; charset=utf-8'],
        description='This is post method',
        tags=['test_app'],
        parameters=parameters,
    )