Add type inspection for PrimaryKeyRelatedField (#26)
Guess the type for PrimaryKeyRelatedField from the related ModelField.openapi3
parent
8a8a9faeeb
commit
f05889292a
|
|
@ -1,7 +1,6 @@
|
||||||
import re
|
import re
|
||||||
from collections import defaultdict, OrderedDict
|
from collections import defaultdict, OrderedDict
|
||||||
|
|
||||||
import django.db.models
|
|
||||||
import uritemplate
|
import uritemplate
|
||||||
from coreapi.compat import force_text
|
from coreapi.compat import force_text
|
||||||
from rest_framework.schemas.generators import SchemaGenerator, EndpointEnumerator as _EndpointEnumerator
|
from rest_framework.schemas.generators import SchemaGenerator, EndpointEnumerator as _EndpointEnumerator
|
||||||
|
|
@ -10,6 +9,7 @@ from rest_framework.schemas.inspectors import get_pk_description
|
||||||
from . import openapi
|
from . import openapi
|
||||||
from .inspectors import SwaggerAutoSchema
|
from .inspectors import SwaggerAutoSchema
|
||||||
from .openapi import ReferenceResolver
|
from .openapi import ReferenceResolver
|
||||||
|
from .utils import get_schema_type_from_model_field
|
||||||
|
|
||||||
PATH_PARAMETER_RE = re.compile(r'{(?P<parameter>\w+)}')
|
PATH_PARAMETER_RE = re.compile(r'{(?P<parameter>\w+)}')
|
||||||
|
|
||||||
|
|
@ -221,6 +221,8 @@ class OpenAPISchemaGenerator(object):
|
||||||
model_field = model._meta.get_field(variable)
|
model_field = model._meta.get_field(variable)
|
||||||
except Exception: # pragma: no cover
|
except Exception: # pragma: no cover
|
||||||
model_field = None
|
model_field = None
|
||||||
|
else:
|
||||||
|
type = get_schema_type_from_model_field(model_field)
|
||||||
|
|
||||||
if model_field is not None and model_field.help_text:
|
if model_field is not None and model_field.help_text:
|
||||||
description = force_text(model_field.help_text)
|
description = force_text(model_field.help_text)
|
||||||
|
|
@ -229,9 +231,6 @@ class OpenAPISchemaGenerator(object):
|
||||||
|
|
||||||
if hasattr(view_cls, 'lookup_value_regex') and getattr(view_cls, 'lookup_field', None) == variable:
|
if hasattr(view_cls, 'lookup_value_regex') and getattr(view_cls, 'lookup_field', None) == variable:
|
||||||
pattern = view_cls.lookup_value_regex
|
pattern = view_cls.lookup_value_regex
|
||||||
elif isinstance(model_field, django.db.models.AutoField):
|
|
||||||
type = openapi.TYPE_INTEGER
|
|
||||||
|
|
||||||
field = openapi.Parameter(
|
field = openapi.Parameter(
|
||||||
name=variable,
|
name=variable,
|
||||||
required=True,
|
required=True,
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
|
||||||
from django.core.validators import RegexValidator
|
from django.core.validators import RegexValidator
|
||||||
|
from django.db import models
|
||||||
from django.utils.encoding import force_text
|
from django.utils.encoding import force_text
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from rest_framework.mixins import RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin
|
from rest_framework.mixins import RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin
|
||||||
|
|
@ -13,6 +14,12 @@ from .errors import SwaggerGenerationError
|
||||||
no_body = object()
|
no_body = object()
|
||||||
|
|
||||||
|
|
||||||
|
def get_schema_type_from_model_field(model_field):
|
||||||
|
if isinstance(model_field, models.AutoField):
|
||||||
|
return openapi.TYPE_INTEGER
|
||||||
|
return openapi.TYPE_STRING
|
||||||
|
|
||||||
|
|
||||||
def is_list_view(path, method, view):
|
def is_list_view(path, method, view):
|
||||||
"""Check if the given path/method appears to represent a list view (as opposed to a detail/instance view).
|
"""Check if the given path/method appears to represent a list view (as opposed to a detail/instance view).
|
||||||
|
|
||||||
|
|
@ -238,8 +245,10 @@ def serializer_field_to_swagger(field, swagger_object_type, definitions=None, **
|
||||||
items=child_schema,
|
items=child_schema,
|
||||||
unique_items=True, # is this OK?
|
unique_items=True, # is this OK?
|
||||||
)
|
)
|
||||||
|
elif isinstance(field, serializers.PrimaryKeyRelatedField):
|
||||||
|
model = field.queryset.model
|
||||||
|
return SwaggerType(type=get_schema_type_from_model_field(model._meta.pk))
|
||||||
elif isinstance(field, serializers.RelatedField):
|
elif isinstance(field, serializers.RelatedField):
|
||||||
# TODO: infer type for PrimaryKeyRelatedField?
|
|
||||||
return SwaggerType(type=openapi.TYPE_STRING)
|
return SwaggerType(type=openapi.TYPE_STRING)
|
||||||
# ------ CHOICES
|
# ------ CHOICES
|
||||||
elif isinstance(field, serializers.MultipleChoiceField):
|
elif isinstance(field, serializers.MultipleChoiceField):
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ def swagger_dict(generator):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def validate_schema():
|
def validate_schema(db):
|
||||||
def validate_schema(swagger):
|
def validate_schema(swagger):
|
||||||
from flex.core import parse as validate_flex
|
from flex.core import parse as validate_flex
|
||||||
from swagger_spec_validator.validator20 import validate_spec as validate_ssv
|
from swagger_spec_validator.validator20 import validate_spec as validate_ssv
|
||||||
|
|
|
||||||
|
|
@ -1042,7 +1042,7 @@ definitions:
|
||||||
snippets:
|
snippets:
|
||||||
type: array
|
type: array
|
||||||
items:
|
items:
|
||||||
type: string
|
type: integer
|
||||||
uniqueItems: true
|
uniqueItems: true
|
||||||
last_connected_ip:
|
last_connected_ip:
|
||||||
description: i'm out of ideas
|
description: i'm out of ideas
|
||||||
|
|
|
||||||
2
tox.ini
2
tox.ini
|
|
@ -30,7 +30,7 @@ deps =
|
||||||
-rrequirements/test.txt
|
-rrequirements/test.txt
|
||||||
|
|
||||||
commands =
|
commands =
|
||||||
pytest --cov-config .coveragerc --cov-append --cov
|
pytest --cov-config .coveragerc --cov-append --cov {posargs}
|
||||||
|
|
||||||
[testenv:py36-drfmaster]
|
[testenv:py36-drfmaster]
|
||||||
pip_pre = True
|
pip_pre = True
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue