diff --git a/src/caosdb/common/models.py b/src/caosdb/common/models.py index 6ec49df2722170805fb6230753f36503870a8821..ed4815ffa3e9c1e26bbf4ed0b197f38acb5b0e80 100644 --- a/src/caosdb/common/models.py +++ b/src/caosdb/common/models.py @@ -128,7 +128,24 @@ class Entity(object): @property def role(self): - return self.__role + """Return the role of this entity. + + Particularly, this means + 1. return the explicitly set role, if present. + 2. or, if this is a direct instance of the Entity class (and not of + any subclass of Entity) which hence has no "natural" role, return + None. + 3. Otherwise, return the class name of this entity, because this the + natural role of this object. + Returns + ------- + str + The entities role or `None` + """ + if self.__role: + return self.__role + if type(self) is not Entity: + return type(self).__name__ @role.setter def role(self, role): @@ -832,6 +849,9 @@ class Entity(object): if xml is None: xml = etree.Element("Entity") + # use role as xml tag name, fall-back to "Entity" + elem_tag = "Entity" if self.role is None else self.role + xml = etree.Element(elem_tag) assert isinstance(xml, etree._Element) # unwrap wrapped entity @@ -2277,6 +2297,7 @@ class _Messages(dict): def _basic_sync(e_local, e_remote): if e_local is None or e_remote is None: return None + e_local.role = e_remote.role e_local.id = e_remote.id e_local.name = e_remote.name e_local.description = e_remote.description diff --git a/unittests/test_entity.py b/unittests/test_entity.py index e98dfbef5b6b5e5f691e8aecc2fa7d4a86991452..24ebb9196b90e589f8d5d0799c6b7cd74d26caeb 100644 --- a/unittests/test_entity.py +++ b/unittests/test_entity.py @@ -41,18 +41,33 @@ class TestEntity(unittest.TestCase): def test_instance_variables(self): entity = Entity() - self.assertTrue(hasattr(entity, "role")) self.assertTrue(hasattr(entity, "id")) self.assertTrue(hasattr(entity, "name")) self.assertTrue(hasattr(entity, "description")) self.assertTrue(hasattr(entity, "parents")) self.assertTrue(hasattr(entity, "properties")) - def test_role(self): + def test_entity_role_1(self): entity = Entity(role="TestRole") self.assertEqual(entity.role, "TestRole") entity.role = "TestRole2" self.assertEqual(entity.role, "TestRole2") + def test_entity_role_2(self): + entity = Entity() + + self.assertIsNone(entity.role) + self.assertEqual(entity.to_xml().tag, "Entity") + + entity.role = "Record" + self.assertEqual(entity.role, "Record") + self.assertEqual(entity.to_xml().tag, "Record") + + def test_recordtype_role(self): + entity = RecordType() + + self.assertEqual(entity.role, "RecordType") + self.assertEqual(entity.to_xml().tag, "RecordType") + def test_instanciation(self): self.assertRaises(Exception, Entity())