graphene/graphene/contrib/django/fields.py
2015-12-09 18:54:06 -08:00

72 lines
2.4 KiB
Python

import warnings
from ...core.exceptions import SkipField
from ...core.fields import Field
from ...core.types.base import FieldType
from ...core.types.definitions import List
from ...relay import ConnectionField
from ...relay.utils import is_node
from .utils import get_type_for_model
class DjangoField(Field):
def decorate_resolver(self, resolver):
f = super(DjangoField, self).decorate_resolver(resolver)
setattr(f, 'django_fetch_field', self.field)
return f
def __init__(self, *args, **kwargs):
self.field = kwargs.pop('_field')
return super(DjangoField, self).__init__(*args, **kwargs)
class DjangoConnectionField(DjangoField, ConnectionField):
def __init__(self, *args, **kwargs):
cls = self.__class__
warnings.warn("Using {} will be not longer supported."
" Use relay.ConnectionField instead".format(cls.__name__),
FutureWarning)
return super(DjangoConnectionField, self).__init__(*args, **kwargs)
class ConnectionOrListField(DjangoField):
def internal_type(self, schema):
model_field = self.type
field_object_type = model_field.get_object_type(schema)
if not field_object_type:
raise SkipField()
if is_node(field_object_type):
field = DjangoConnectionField(field_object_type, _field=self.field)
else:
field = DjangoField(List(field_object_type), _field=self.field)
field.contribute_to_class(self.object_type, self.attname)
return schema.T(field)
class DjangoModelField(FieldType):
def __init__(self, model, *args, **kwargs):
self.model = model
super(DjangoModelField, self).__init__(*args, **kwargs)
def internal_type(self, schema):
_type = self.get_object_type(schema)
if not _type and self.parent._meta.only_fields:
raise Exception(
"Model %r is not accessible by the schema. "
"You can either register the type manually "
"using @schema.register. "
"Or disable the field in %s" % (
self.model,
self.parent,
)
)
if not _type:
raise SkipField()
return schema.T(_type)
def get_object_type(self, schema):
return get_type_for_model(schema, self.model)