def inflate(cls, node): # support lazy loading if isinstance(node, int): snode = cls() snode.id = node else: props = {} for key, prop in cls.__all_properties__: node_properties = _get_node_properties(node) if key in node_properties: props[key] = prop.inflate(node_properties[key], node) elif prop.has_default: props[key] = prop.default_value() else: props[key] = None # handle properties not defined on the class for free_key in (x for x in node_properties if x not in props): if hasattr(cls, free_key): raise InflateConflict(cls, free_key, node_properties[free_key], node.id) props[free_key] = node_properties[free_key] snode = cls(**props) snode.id = node.id return snode
def inflate(cls, node): """ Inflate a raw neo4j_driver node to a neomodel node :param node: :return: node object """ # support lazy loading if isinstance(node, int): snode = cls() snode.id = node else: node_properties = _get_node_properties(node) props = {} for key, prop in cls.__all_properties__: # map property name from database to object property db_property = prop.db_property or key if db_property in node_properties: props[key] = prop.inflate(node_properties[db_property], node) elif prop.has_default: props[key] = prop.default_value() else: props[key] = None snode = cls(**props) snode.id = node.id return snode
def test_unique_index_prop_not_required(): class ConstrainedTestNode(StructuredNode): required_property = StringProperty(required=True) unique_property = StringProperty(unique_index=True) unique_required_property = StringProperty(unique_index=True, required=True) unconstrained_property = StringProperty() # Create a node with a missing required property with raises(RequiredProperty): x = ConstrainedTestNode(required_property="required", unique_property="unique") x.save() # Create a node with a missing unique (but not required) property. x = ConstrainedTestNode() x.required_property = "required" x.unique_required_property = "unique and required" x.unconstrained_property = "no contraints" x.save() # check database property name on low level results, meta = db.cypher_query("MATCH (n:ConstrainedTestNode) RETURN n") node_properties = _get_node_properties(results[0][0]) assert node_properties["unique_required_property"] == "unique and required" # delete node afterwards x.delete()
def test_independent_property_name(): class TestDBNamePropertyNode(StructuredNode): name_ = StringProperty(db_property="name") x = TestDBNamePropertyNode() x.name_ = "jim" x.save() # check database property name on low level results, meta = db.cypher_query("MATCH (n:TestDBNamePropertyNode) RETURN n") node_properties = _get_node_properties(results[0][0]) assert node_properties['name'] == "jim" node_properties = _get_node_properties(results[0][0]) assert not 'name_' in node_properties assert not hasattr(x, 'name') assert hasattr(x, 'name_') assert TestDBNamePropertyNode.nodes.filter(name_="jim").all()[0].name_ == x.name_ assert TestDBNamePropertyNode.nodes.get(name_="jim").name_ == x.name_ x.delete()
def test_independent_property_name_get_or_create(): class TestNode(StructuredNode): uid = UniqueIdProperty() name_ = StringProperty(db_property="name", required=True) # create the node TestNode.get_or_create({'uid': 123, 'name_': 'jim'}) # test that the node is retrieved correctly x = TestNode.get_or_create({'uid': 123, 'name_': 'jim'})[0] # check database property name on low level results, meta = db.cypher_query("MATCH (n:TestNode) RETURN n") node_properties = _get_node_properties(results[0][0]) assert node_properties['name'] == "jim" assert 'name_' not in node_properties # delete node afterwards x.delete()