diff --git a/src/drf_yasg/generators.py b/src/drf_yasg/generators.py index 272965a..d9e6400 100644 --- a/src/drf_yasg/generators.py +++ b/src/drf_yasg/generators.py @@ -409,9 +409,9 @@ class OpenAPISchemaGenerator(object): if getattr(view_cls, 'lookup_field', None) == variable and attrs['type'] == openapi.TYPE_STRING: attrs['pattern'] = getattr(view_cls, 'lookup_value_regex', attrs.get('pattern', None)) - if model_field and model_field.help_text: + if model_field and getattr(model_field, 'help_text', False): description = force_text(model_field.help_text) - elif model_field and model_field.primary_key: + elif model_field and getattr(model_field, 'primary_key', False): description = get_pk_description(model, model_field) else: description = None diff --git a/testproj/people/__init__.py b/testproj/people/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/testproj/people/apps.py b/testproj/people/apps.py new file mode 100644 index 0000000..3eae75a --- /dev/null +++ b/testproj/people/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class PeopleConfig(AppConfig): + name = 'people' diff --git a/testproj/people/migrations/0001_initial.py b/testproj/people/migrations/0001_initial.py new file mode 100644 index 0000000..3c9b262 --- /dev/null +++ b/testproj/people/migrations/0001_initial.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-03-18 16:22 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Identity', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('firstName', models.CharField(max_length=30, null=True)), + ('lastName', models.CharField(max_length=30, null=True)), + ], + ), + migrations.CreateModel( + name='Person', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('Identity', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='person', to='people.Identity')), + ], + ), + ] diff --git a/testproj/people/migrations/0002_auto_20180318_1704.py b/testproj/people/migrations/0002_auto_20180318_1704.py new file mode 100644 index 0000000..355f434 --- /dev/null +++ b/testproj/people/migrations/0002_auto_20180318_1704.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-03-18 17:04 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('people', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='person', + name='Identity', + field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='person', to='people.Identity'), + ), + ] diff --git a/testproj/people/migrations/__init__.py b/testproj/people/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/testproj/people/models.py b/testproj/people/models.py new file mode 100644 index 0000000..683b433 --- /dev/null +++ b/testproj/people/models.py @@ -0,0 +1,11 @@ +from django.db import models + + +class Identity(models.Model): + firstName = models.CharField(max_length=30, null=True) + lastName = models.CharField(max_length=30, null=True) + + +class Person(models.Model): + Identity = models.OneToOneField(Identity, related_name='person', + on_delete=models.PROTECT) diff --git a/testproj/people/serializers.py b/testproj/people/serializers.py new file mode 100644 index 0000000..3c06f2f --- /dev/null +++ b/testproj/people/serializers.py @@ -0,0 +1,23 @@ +from rest_framework import serializers + +from .models import Identity, Person + + +class IdentitySerializer(serializers.ModelSerializer): + class Meta: + model = Identity + fields = '__all__' + + +class PersonSerializer(serializers.ModelSerializer): + identity = IdentitySerializer(read_only=True) + + class Meta: + model = Person + fields = '__all__' + + def create(self, validated_data): + identity = Identity(**validated_data['identity']) + identity.save() + validated_data['identity'] = identity + return super().create(validated_data) diff --git a/testproj/people/urls.py b/testproj/people/urls.py new file mode 100644 index 0000000..7be5e92 --- /dev/null +++ b/testproj/people/urls.py @@ -0,0 +1,26 @@ +from django.conf.urls import url + +from .views import IdentityViewSet, PersonViewSet + +person_list = PersonViewSet.as_view({ + 'get': 'list', + 'post': 'create' +}) +person_detail = PersonViewSet.as_view({ + 'get': 'retrieve', + 'patch': 'partial_update', + 'delete': 'destroy' +}) + +identity_detail = IdentityViewSet.as_view({ + 'get': 'retrieve', + 'patch': 'partial_update', +}) + +urlpatterns = ( + url(r'^$', person_list, name='people-list'), + url(r'^(?P[0-9]+)$', person_detail, name='person-detail'), + + url(r'^(?P[0-9]+)/identity$', identity_detail, + name='person-identity'), +) diff --git a/testproj/people/views.py b/testproj/people/views.py new file mode 100644 index 0000000..2b2daaa --- /dev/null +++ b/testproj/people/views.py @@ -0,0 +1,16 @@ +from rest_framework import viewsets + +from .models import Identity, Person +from .serializers import IdentitySerializer, PersonSerializer + + +class PersonViewSet(viewsets.ModelViewSet): + model = Person + queryset = Person.objects + serializer_class = PersonSerializer + + +class IdentityViewSet(viewsets.ModelViewSet): + model = Identity + queryset = Identity.objects + serializer_class = IdentitySerializer diff --git a/testproj/testproj/settings/base.py b/testproj/testproj/settings/base.py index 0e1d9e0..fc81074 100644 --- a/testproj/testproj/settings/base.py +++ b/testproj/testproj/settings/base.py @@ -27,6 +27,7 @@ INSTALLED_APPS = [ 'users', 'articles', 'todo', + 'people' ] MIDDLEWARE = [ diff --git a/testproj/testproj/urls.py b/testproj/testproj/urls.py index c7cb6a1..b0dafa4 100644 --- a/testproj/testproj/urls.py +++ b/testproj/testproj/urls.py @@ -63,5 +63,6 @@ urlpatterns = [ url(r'^articles/', include('articles.urls')), url(r'^users/', include('users.urls')), url(r'^todo/', include('todo.urls')), + url(r'^people/', include('people.urls')), url(r'^plain/', plain_view), ] diff --git a/tests/reference.yaml b/tests/reference.yaml index 6004711..c9ee3b8 100644 --- a/tests/reference.yaml +++ b/tests/reference.yaml @@ -234,6 +234,113 @@ paths: type: string format: slug pattern: '[a-z0-9]+(?:-[a-z0-9]+)' + /people/: + get: + operationId: people_list + description: '' + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/Person' + tags: + - people + post: + operationId: people_create + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/Person' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/Person' + tags: + - people + parameters: [] + /people/{id}: + get: + operationId: people_read + description: '' + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Person' + tags: + - people + patch: + operationId: people_partial_update + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/Person' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Person' + tags: + - people + delete: + operationId: people_delete + description: '' + parameters: [] + responses: + '204': + description: '' + tags: + - people + parameters: + - name: id + in: path + description: A unique integer value identifying this person. + required: true + type: integer + /people/{person}/identity: + get: + operationId: people_identity_read + description: '' + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Identity' + tags: + - people + patch: + operationId: people_identity_partial_update + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/Identity' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Identity' + tags: + - people + parameters: + - name: person + in: path + required: true + type: string /plain/: get: operationId: plain_list @@ -609,6 +716,37 @@ definitions: type: string format: uuid readOnly: true + Identity: + title: Identity + type: object + properties: + id: + title: ID + type: integer + readOnly: true + firstName: + title: FirstName + type: string + maxLength: 30 + lastName: + title: LastName + type: string + maxLength: 30 + readOnly: true + Person: + required: + - Identity + type: object + properties: + id: + title: ID + type: integer + readOnly: true + identity: + $ref: '#/definitions/Identity' + Identity: + title: Identity + type: integer Project: required: - projectName