mirror of
https://github.com/graphql-python/graphene-django.git
synced 2024-11-22 09:37:07 +03:00
Check exclude fields correctly (#873)
This commit is contained in:
parent
bbf119cd3b
commit
4e1b82a8d8
|
@ -319,7 +319,7 @@ def test_django_objecttype_fields_exclude_type_checking():
|
||||||
|
|
||||||
|
|
||||||
@with_local_registry
|
@with_local_registry
|
||||||
def test_django_objecttype_fields_exclude_exist_on_model():
|
def test_django_objecttype_fields_exist_on_model():
|
||||||
with pytest.warns(UserWarning, match=r"Field name .* doesn't exist"):
|
with pytest.warns(UserWarning, match=r"Field name .* doesn't exist"):
|
||||||
|
|
||||||
class Reporter(DjangoObjectType):
|
class Reporter(DjangoObjectType):
|
||||||
|
@ -350,6 +350,42 @@ def test_django_objecttype_fields_exclude_exist_on_model():
|
||||||
assert len(record) == 0
|
assert len(record) == 0
|
||||||
|
|
||||||
|
|
||||||
|
@with_local_registry
|
||||||
|
def test_django_objecttype_exclude_fields_exist_on_model():
|
||||||
|
with pytest.warns(
|
||||||
|
UserWarning,
|
||||||
|
match=r"Django model .* does not have a field or attribute named .*",
|
||||||
|
):
|
||||||
|
|
||||||
|
class Reporter(DjangoObjectType):
|
||||||
|
class Meta:
|
||||||
|
model = ReporterModel
|
||||||
|
exclude = ["foo"]
|
||||||
|
|
||||||
|
# Don't warn if selecting a custom field
|
||||||
|
with pytest.warns(
|
||||||
|
UserWarning,
|
||||||
|
match=r"Excluding the custom field .* on DjangoObjectType .* has no effect.",
|
||||||
|
):
|
||||||
|
|
||||||
|
class Reporter3(DjangoObjectType):
|
||||||
|
custom_field = String()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = ReporterModel
|
||||||
|
exclude = ["custom_field"]
|
||||||
|
|
||||||
|
# Don't warn on exclude fields
|
||||||
|
with pytest.warns(None) as record:
|
||||||
|
|
||||||
|
class Reporter4(DjangoObjectType):
|
||||||
|
class Meta:
|
||||||
|
model = ReporterModel
|
||||||
|
exclude = ["email", "first_name"]
|
||||||
|
|
||||||
|
assert len(record) == 0
|
||||||
|
|
||||||
|
|
||||||
class TestDjangoObjectType:
|
class TestDjangoObjectType:
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def PetModel(self):
|
def PetModel(self):
|
||||||
|
|
|
@ -65,32 +65,58 @@ def construct_fields(
|
||||||
def validate_fields(type_, model, fields, only_fields, exclude_fields):
|
def validate_fields(type_, model, fields, only_fields, exclude_fields):
|
||||||
# Validate the given fields against the model's fields and custom fields
|
# Validate the given fields against the model's fields and custom fields
|
||||||
all_field_names = set(fields.keys())
|
all_field_names = set(fields.keys())
|
||||||
for fields_list in (only_fields, exclude_fields):
|
for name in only_fields or ():
|
||||||
if not fields_list:
|
if name in all_field_names:
|
||||||
continue
|
continue
|
||||||
for name in fields_list:
|
|
||||||
if name in all_field_names:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if hasattr(model, name):
|
if hasattr(model, name):
|
||||||
warnings.warn(
|
warnings.warn(
|
||||||
(
|
(
|
||||||
'Field name "{field_name}" matches an attribute on Django model "{app_label}.{object_name}" '
|
'Field name "{field_name}" matches an attribute on Django model "{app_label}.{object_name}" '
|
||||||
"but it's not a model field so Graphene cannot determine what type it should be. "
|
"but it's not a model field so Graphene cannot determine what type it should be. "
|
||||||
'Either define the type of the field on DjangoObjectType "{type_}" or remove it from the "fields" list.'
|
'Either define the type of the field on DjangoObjectType "{type_}" or remove it from the "fields" list.'
|
||||||
).format(
|
).format(
|
||||||
field_name=name,
|
field_name=name,
|
||||||
app_label=model._meta.app_label,
|
app_label=model._meta.app_label,
|
||||||
object_name=model._meta.object_name,
|
object_name=model._meta.object_name,
|
||||||
type_=type_,
|
type_=type_,
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
warnings.warn(
|
||||||
|
(
|
||||||
|
'Field name "{field_name}" doesn\'t exist on Django model "{app_label}.{object_name}". '
|
||||||
|
'Consider removing the field from the "fields" list of DjangoObjectType "{type_}" because it has no effect.'
|
||||||
|
).format(
|
||||||
|
field_name=name,
|
||||||
|
app_label=model._meta.app_label,
|
||||||
|
object_name=model._meta.object_name,
|
||||||
|
type_=type_,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Validate exclude fields
|
||||||
|
for name in exclude_fields or ():
|
||||||
|
if name in all_field_names:
|
||||||
|
# Field is a custom field
|
||||||
|
warnings.warn(
|
||||||
|
(
|
||||||
|
'Excluding the custom field "{field_name} on DjangoObjectType "{type_}" has no effect. '
|
||||||
|
'Either remove the custom field or remove the field from the "exclude" list.'
|
||||||
|
).format(
|
||||||
|
field_name=name,
|
||||||
|
app_label=model._meta.app_label,
|
||||||
|
object_name=model._meta.object_name,
|
||||||
|
type_=type_,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
if not hasattr(model, name):
|
||||||
warnings.warn(
|
warnings.warn(
|
||||||
(
|
(
|
||||||
'Field name "{field_name}" doesn\'t exist on Django model "{app_label}.{object_name}". '
|
'Django model "{app_label}.{object_name}" does not have a field or attribute named "{field_name}". '
|
||||||
'Consider removing the field from the "fields" list of DjangoObjectType "{type_}" because it has no effect.'
|
'Consider removing the field from the "exclude" list of DjangoObjectType "{type_}" because it has no effect'
|
||||||
).format(
|
).format(
|
||||||
field_name=name,
|
field_name=name,
|
||||||
app_label=model._meta.app_label,
|
app_label=model._meta.app_label,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user