mirror of
https://github.com/graphql-python/graphene.git
synced 2025-02-02 20:54:16 +03:00
Improved objecttype
This commit is contained in:
parent
c87d87d1ea
commit
b5458493ce
|
@ -55,48 +55,15 @@ class ObjectTypeMeta(type):
|
||||||
def __new__(cls, name, bases, attrs):
|
def __new__(cls, name, bases, attrs):
|
||||||
super_new = type.__new__
|
super_new = type.__new__
|
||||||
|
|
||||||
# Also ensure initialization is only performed for subclasses of Model
|
# Also ensure initialization is only performed for subclasses of
|
||||||
# (excluding Model class itself).
|
# ObjectType, Interfaces
|
||||||
|
|
||||||
if not is_base_type(bases, ObjectTypeMeta):
|
if not is_base_type(bases, ObjectTypeMeta):
|
||||||
return super_new(cls, name, bases, attrs)
|
return type.__new__(cls, name, bases, attrs)
|
||||||
|
|
||||||
if not is_objecttype(bases):
|
if not is_objecttype(bases):
|
||||||
return cls._create_interface(cls, name, bases, attrs)
|
return cls._create_interface(cls, name, bases, attrs)
|
||||||
|
|
||||||
options = Options(
|
return cls._create_objecttype(cls, name, bases, attrs)
|
||||||
attrs.pop('Meta', None),
|
|
||||||
name=None,
|
|
||||||
description=None,
|
|
||||||
graphql_type=None,
|
|
||||||
interfaces=(),
|
|
||||||
abstract=False
|
|
||||||
)
|
|
||||||
|
|
||||||
interfaces = tuple(options.interfaces)
|
|
||||||
fields = get_fields(ObjectType, attrs, bases, interfaces)
|
|
||||||
attrs = attrs_without_fields(attrs, fields)
|
|
||||||
cls = super_new(cls, name, bases, dict(attrs, _meta=options))
|
|
||||||
|
|
||||||
if not options.graphql_type:
|
|
||||||
fields = copy_fields(Field, fields, parent=cls)
|
|
||||||
base_interfaces = tuple(b for b in bases if issubclass(b, Interface))
|
|
||||||
options.graphql_type = GrapheneObjectType(
|
|
||||||
graphene_type=cls,
|
|
||||||
name=options.name or cls.__name__,
|
|
||||||
description=options.description or cls.__doc__,
|
|
||||||
fields=fields,
|
|
||||||
is_type_of=cls.is_type_of,
|
|
||||||
interfaces=tuple(get_interfaces(interfaces + base_interfaces))
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
assert not fields, "Can't mount Fields in an ObjectType with a defined graphql_type"
|
|
||||||
fields = copy_fields(Field, options.graphql_type.get_fields(), parent=cls)
|
|
||||||
|
|
||||||
for name, field in fields.items():
|
|
||||||
setattr(cls, field.attname or name, field)
|
|
||||||
|
|
||||||
return cls
|
|
||||||
|
|
||||||
def get_interfaces(cls, bases):
|
def get_interfaces(cls, bases):
|
||||||
return (b for b in bases if issubclass(b, Interface))
|
return (b for b in bases if issubclass(b, Interface))
|
||||||
|
@ -140,6 +107,42 @@ class ObjectTypeMeta(type):
|
||||||
|
|
||||||
return cls
|
return cls
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _create_objecttype(cls, name, bases, attrs):
|
||||||
|
options = Options(
|
||||||
|
attrs.pop('Meta', None),
|
||||||
|
name=None,
|
||||||
|
description=None,
|
||||||
|
graphql_type=None,
|
||||||
|
interfaces=(),
|
||||||
|
abstract=False
|
||||||
|
)
|
||||||
|
|
||||||
|
interfaces = tuple(options.interfaces)
|
||||||
|
fields = get_fields(ObjectType, attrs, bases, interfaces)
|
||||||
|
attrs = attrs_without_fields(attrs, fields)
|
||||||
|
cls = type.__new__(cls, name, bases, dict(attrs, _meta=options))
|
||||||
|
|
||||||
|
if not options.graphql_type:
|
||||||
|
fields = copy_fields(Field, fields, parent=cls)
|
||||||
|
base_interfaces = tuple(b for b in bases if issubclass(b, Interface))
|
||||||
|
options.graphql_type = GrapheneObjectType(
|
||||||
|
graphene_type=cls,
|
||||||
|
name=options.name or cls.__name__,
|
||||||
|
description=options.description or cls.__doc__,
|
||||||
|
fields=fields,
|
||||||
|
is_type_of=cls.is_type_of,
|
||||||
|
interfaces=tuple(get_interfaces(interfaces + base_interfaces))
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
assert not fields, "Can't mount Fields in an ObjectType with a defined graphql_type"
|
||||||
|
fields = copy_fields(Field, options.graphql_type.get_fields(), parent=cls)
|
||||||
|
|
||||||
|
for name, field in fields.items():
|
||||||
|
setattr(cls, field.attname or name, field)
|
||||||
|
|
||||||
|
return cls
|
||||||
|
|
||||||
|
|
||||||
class ObjectType(six.with_metaclass(ObjectTypeMeta)):
|
class ObjectType(six.with_metaclass(ObjectTypeMeta)):
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user