mirror of
				https://github.com/graphql-python/graphene.git
				synced 2025-11-04 09:57:41 +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):
 | 
			
		||||
        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)):
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user