diff --git a/MANIFEST.in b/MANIFEST.in index 4677330..045af08 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,6 @@ include README.md LICENSE recursive-include graphene_django/templates * recursive-include graphene_django/static * + +include examples/cookbook/cookbook/ingredients/fixtures/ingredients.json +include examples/cookbook-plain/cookbook/ingredients/fixtures/ingredients.json \ No newline at end of file diff --git a/django_test_settings.py b/django_test_settings.py deleted file mode 100644 index 9279a73..0000000 --- a/django_test_settings.py +++ /dev/null @@ -1,35 +0,0 @@ -import sys -import os - -ROOT_PATH = os.path.dirname(os.path.abspath(__file__)) -sys.path.insert(0, ROOT_PATH + '/examples/') - -SECRET_KEY = 1 - -INSTALLED_APPS = [ - 'graphene_django', - 'graphene_django.rest_framework', - 'graphene_django.tests', - 'starwars', -] - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': 'django_test.sqlite', - } -} - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - }, -] - -GRAPHENE = { - 'SCHEMA': 'graphene_django.tests.schema_view.schema' -} - -ROOT_URLCONF = 'graphene_django.tests.urls' diff --git a/examples/__init__.py b/examples/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/cookbook-plain/__init__.py b/examples/cookbook-plain/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/cookbook/__init__.py b/examples/cookbook/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/django_test_settings.py b/examples/django_test_settings.py new file mode 100644 index 0000000..7b98861 --- /dev/null +++ b/examples/django_test_settings.py @@ -0,0 +1,30 @@ +import sys +import os + +ROOT_PATH = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, ROOT_PATH + "/examples/") + +SECRET_KEY = 1 + +INSTALLED_APPS = [ + "graphene_django", + "graphene_django.rest_framework", + "graphene_django.tests", + "examples.starwars", +] + +DATABASES = { + "default": {"ENGINE": "django.db.backends.sqlite3", "NAME": "django_test.sqlite"} +} + +TEMPLATES = [ + { + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [], + "APP_DIRS": True, + } +] + +GRAPHENE = {"SCHEMA": "graphene_django.tests.schema_view.schema"} + +ROOT_URLCONF = "graphene_django.tests.urls" diff --git a/graphene_django/rest_framework/mutation.py b/graphene_django/rest_framework/mutation.py index d1dbb38..000b21e 100644 --- a/graphene_django/rest_framework/mutation.py +++ b/graphene_django/rest_framework/mutation.py @@ -26,6 +26,7 @@ def fields_for_serializer( exclude_fields, is_input=False, convert_choices_to_enum=True, + lookup_field=None, ): fields = OrderedDict() for name, field in serializer.fields.items(): @@ -35,7 +36,9 @@ def fields_for_serializer( name in exclude_fields, field.write_only and not is_input, # don't show write_only fields in Query - field.read_only and is_input, # don't show read_only fields in Input + field.read_only + and is_input + and lookup_field != name, # don't show read_only fields in Input ] ) @@ -91,6 +94,7 @@ class SerializerMutation(ClientIDMutation): exclude_fields, is_input=True, convert_choices_to_enum=convert_choices_to_enum, + lookup_field=lookup_field, ) output_fields = fields_for_serializer( serializer, @@ -98,6 +102,7 @@ class SerializerMutation(ClientIDMutation): exclude_fields, is_input=False, convert_choices_to_enum=convert_choices_to_enum, + lookup_field=lookup_field, ) if not _meta: diff --git a/graphene_django/rest_framework/tests/test_mutation.py b/graphene_django/rest_framework/tests/test_mutation.py index 1599fea..ffbc4b5 100644 --- a/graphene_django/rest_framework/tests/test_mutation.py +++ b/graphene_django/rest_framework/tests/test_mutation.py @@ -143,17 +143,20 @@ def test_write_only_field_using_extra_kwargs(): def test_read_only_fields(): class ReadOnlyFieldModelSerializer(serializers.ModelSerializer): + id = serializers.CharField(read_only=True) cool_name = serializers.CharField(read_only=True) class Meta: model = MyFakeModelWithPassword - fields = ["cool_name", "password"] + lookup_field = "id" + fields = ["id", "cool_name", "password"] class MyMutation(SerializerMutation): class Meta: serializer_class = ReadOnlyFieldModelSerializer assert "password" in MyMutation.Input._meta.fields + assert "id" in MyMutation.Input._meta.fields assert ( "cool_name" not in MyMutation.Input._meta.fields ), "'cool_name' is read_only field and shouldn't be on arguments" diff --git a/graphene_django/tests/test_fields.py b/graphene_django/tests/test_fields.py index cd5bd1b..57f913e 100644 --- a/graphene_django/tests/test_fields.py +++ b/graphene_django/tests/test_fields.py @@ -267,7 +267,7 @@ class TestDjangoListField: result = schema.execute(query) assert not result.errors - assert result.data == {"reporters": [{"firstName": "Tara"},]} + assert result.data == {"reporters": [{"firstName": "Tara"}]} def test_resolve_list(self): """Resolving a plain list should work (and not call get_queryset)""" @@ -314,7 +314,7 @@ class TestDjangoListField: result = schema.execute(query) assert not result.errors - assert result.data == {"reporters": [{"firstName": "Debra"},]} + assert result.data == {"reporters": [{"firstName": "Debra"}]} def test_get_queryset_foreign_key(self): class Article(DjangoObjectType): @@ -371,7 +371,7 @@ class TestDjangoListField: assert not result.errors assert result.data == { "reporters": [ - {"firstName": "Tara", "articles": [{"headline": "Amazing news"},],}, + {"firstName": "Tara", "articles": [{"headline": "Amazing news"}]}, {"firstName": "Debra", "articles": []}, ] } diff --git a/pytest.ini b/pytest.ini index 4e47ff4..94360bd 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,2 +1,2 @@ [pytest] -DJANGO_SETTINGS_MODULE = django_test_settings +DJANGO_SETTINGS_MODULE = examples.django_test_settings diff --git a/setup.py b/setup.py index 8a070a9..e33cfca 100644 --- a/setup.py +++ b/setup.py @@ -58,7 +58,7 @@ setup( "Framework :: Django :: 3.0", ], keywords="api graphql protocol rest relay graphene", - packages=find_packages(exclude=["tests"]), + packages=find_packages(exclude=["tests", "examples", "examples.*"]), install_requires=[ "six>=1.10.0", "graphene>=2.1.7,<3", diff --git a/tox.ini b/tox.ini index 9086a55..d2d3065 100644 --- a/tox.ini +++ b/tox.ini @@ -25,11 +25,12 @@ DJANGO = passenv = * usedevelop = True setenv = - DJANGO_SETTINGS_MODULE=django_test_settings + DJANGO_SETTINGS_MODULE=examples.django_test_settings deps = -e.[test] psycopg2-binary django111: Django>=1.11,<2.0 + django111: djangorestframework<3.12 django20: Django>=2.0,<2.1 django21: Django>=2.1,<2.2 django22: Django>=2.2,<3.0