diff --git a/src/caosdb/common/models.py b/src/caosdb/common/models.py index f67cbcc5ce2ba17b2d0877208e60ed241a448653..6624ed765906ce6f47d36975af93e069efa9550e 100644 --- a/src/caosdb/common/models.py +++ b/src/caosdb/common/models.py @@ -1506,20 +1506,33 @@ class Property(Entity): return super(Property, self).to_xml(xml, add_properties) - def is_reference(self): - """ returns whether this Property is a reference + def is_reference(self, server_retrieval = False): + """Returns whether this Property is a reference - If the datatype is not set, the Property is retrieved from the server. - """ + Parameters + ---------- + server_retrieval : bool, optional + If True and the datatype is not set, the Property is retrieved from the server, by default False + Returns + ------- + bool, NoneType + Returns whether this Property is a reference or None if a server call is needed to + check correctly, but server_retrieval is set to False. + + """ if self.datatype is None: if not self.is_valid(): # this is a workaround to prevent side effects # since retrieve currently changes the object - tmp_prop = deepcopy(self) - tmp_prop.retrieve() + + if server_retrieval: + tmp_prop = deepcopy(self) + tmp_prop.retrieve() - return tmp_prop.is_reference() + return tmp_prop.is_reference() + else: + return None else: # a valid property withoud datatype has to be an RT diff --git a/unittests/test_property.py b/unittests/test_property.py index 752ee01f0eafef14dbffd1e62c99d1c816c45d05..6fee32cd2304c2889e3f75992408f54139869958 100644 --- a/unittests/test_property.py +++ b/unittests/test_property.py @@ -27,6 +27,7 @@ # pylint: disable=missing-docstring from lxml import etree from caosdb import Entity, Property, Record +import caosdb as db parser = etree.XMLParser(remove_comments=True) testrecord = Record._from_xml(Record(), @@ -89,3 +90,38 @@ def test_get_property_with_entity(): def test_selected_reference_list(): assert len(testrecord.get_property("Conductor").value) == 1 assert isinstance(testrecord.get_property("Conductor").value[0], Entity) + + +PROPS = { + 10: db.Property(id=10, datatype=db.INTEGER), + 20: db.Property(id=20, datatype=db.REFERENCE) +} +def dummy_property(self): + return PROPS[self.id] +Entity.retrieve = dummy_property + +def test_is_reference(): + p1 = Property(id=1, datatype=db.INTEGER) + p2 = Property(id=2, datatype=db.DOUBLE) + p3 = Property(id=3, datatype=db.TEXT) + p4 = Property(id=4, datatype=db.DATETIME) + p5 = Property(id=5, datatype=db.BOOLEAN) + p6 = Property(id=6, datatype=db.REFERENCE) + assert p1.is_reference() == False + assert p2.is_reference() == False + assert p3.is_reference() == False + assert p4.is_reference() == False + assert p5.is_reference() == False + assert p6.is_reference() == True + + p7 = Property(id=7) + p8 = Property(id=8, value=db.RecordType(id=1000)) + p8.is_valid = lambda: True + assert p7.is_reference() == None #cannot be resolved without calling a server + assert p8.is_reference() == True + + p10 = Property(id=10) + p20 = Property(id=20) + assert p10.is_reference(server_retrieval=True) == False + assert p20.is_reference(server_retrieval=True) == True +