def __new__(mcs, name, bases, namespace): namespace['DoesNotExist'] = \ type(name + 'DoesNotExist', (DoesNotExist,), {}) cls = super(NodeMeta, mcs).__new__(mcs, name, bases, namespace) # needed by Python < 3.5 for unpickling DoesNotExist objects: cls.DoesNotExist._model_class = cls if hasattr(cls, '__abstract_node__'): delattr(cls, '__abstract_node__') else: if 'deleted' in namespace: raise ValueError("Class property called 'deleted' conflicts " "with neomodel internals.") for key, value in ((x, y) for x, y in namespace.items() if isinstance(y, Property)): value.name, value.owner = key, cls if hasattr(value, 'setup') and callable(value.setup): value.setup() # cache various groups of properies cls.__required_properties__ = tuple( name for name, property in cls.defined_properties( aliases=False, rels=False).items() if property.required or property.unique_index) cls.__all_properties__ = tuple( cls.defined_properties(aliases=False, rels=False).items()) cls.__all_aliases__ = tuple( cls.defined_properties(properties=False, rels=False).items()) cls.__all_relationships__ = tuple( cls.defined_properties(aliases=False, properties=False).items()) cls.__label__ = namespace.get('__label__', name) cls.__optional_labels__ = namespace.get('__optional_labels__', []) if config.AUTO_INSTALL_LABELS: install_labels(cls, quiet=False) base_label_set = frozenset(cls.inherited_labels()) optional_label_set = set(cls.inherited_optional_labels()) # Construct all possible combinations of labels + optional labels possible_label_combinations = [ frozenset(set(x).union(base_label_set)) for i in range(1, len(optional_label_set) + 1) for x in combinations(optional_label_set, i) ] possible_label_combinations.append(base_label_set) for label_set in possible_label_combinations: if label_set not in db._NODE_CLASS_REGISTRY: db._NODE_CLASS_REGISTRY[label_set] = cls else: raise ClassAlreadyDefined(cls, db._NODE_CLASS_REGISTRY) return cls
def __new__(mcs, name, bases, namespace): namespace["DoesNotExist"] = type(name + "DoesNotExist", (DoesNotExist, ), {}) cls = super(NodeMeta, mcs).__new__(mcs, name, bases, namespace) # needed by Python < 3.5 for unpickling DoesNotExist objects: cls.DoesNotExist._model_class = cls if hasattr(cls, "__abstract_node__"): delattr(cls, "__abstract_node__") else: if "deleted" in namespace: raise ValueError("Class property called 'deleted' conflicts " "with neomodel internals.") for key, value in ((x, y) for x, y in namespace.items() if isinstance(y, Property)): value.name, value.owner = key, cls if hasattr(value, "setup") and callable(value.setup): value.setup() # cache various groups of properies cls.__required_properties__ = tuple( name for name, property in cls.defined_properties( aliases=False, rels=False).items() if property.required or property.unique_index) cls.__all_properties__ = tuple( cls.defined_properties(aliases=False, rels=False).items()) cls.__all_aliases__ = tuple( cls.defined_properties(properties=False, rels=False).items()) cls.__all_relationships__ = tuple( cls.defined_properties(aliases=False, properties=False).items()) cls.__label__ = namespace.get("__label__", name) if config.AUTO_INSTALL_LABELS: install_labels(cls, quiet=False) label_set = frozenset(cls.inherited_labels()) if label_set not in db._NODE_CLASS_REGISTRY: db._NODE_CLASS_REGISTRY[label_set] = cls else: raise ClassAlreadyDefined(cls, db._NODE_CLASS_REGISTRY) return cls