diff --git a/graphene/types/objecttype.py b/graphene/types/objecttype.py index 34bc12e2..19a06dac 100644 --- a/graphene/types/objecttype.py +++ b/graphene/types/objecttype.py @@ -55,48 +55,15 @@ class ObjectTypeMeta(type): def __new__(cls, name, bases, attrs): super_new = type.__new__ - # Also ensure initialization is only performed for subclasses of Model - # (excluding Model class itself). - + # Also ensure initialization is only performed for subclasses of + # ObjectType, Interfaces 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): return cls._create_interface(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 = 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 + return cls._create_objecttype(cls, name, bases, attrs) def get_interfaces(cls, bases): return (b for b in bases if issubclass(b, Interface)) @@ -140,6 +107,42 @@ class ObjectTypeMeta(type): 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)):