diff --git a/src/caosdb/apiutils.py b/src/caosdb/apiutils.py index 4c8393111bcbb4f9f91e309b81bebdcac55ba626..e378b39f85650dc7506e12977337f854e790e0e2 100644 --- a/src/caosdb/apiutils.py +++ b/src/caosdb/apiutils.py @@ -338,11 +338,13 @@ def merge_entities(entity_a: Entity, entity_b: Entity): raise NotImplementedError() for attribute in ("datatype", "unit", "value"): - if diff_r1["properties"][key][attribute] is None: - setattr(entity_a.get_property(key), attribute, - diff_r2["properties"][key][attribute]) - else: - raise RuntimeError("Merge conflict.") + if (attribute in diff_r2["properties"][key] and + diff_r2["properties"][key][attribute] is not None): + if (diff_r1["properties"][key][attribute] is None): + setattr(entity_a.get_property(key), attribute, + diff_r2["properties"][key][attribute]) + else: + raise RuntimeError("Merge conflict.") else: # TODO: This is a temporary FIX for # https://gitlab.indiscale.com/caosdb/src/caosdb-pylib/-/issues/105 diff --git a/unittests/test_apiutils.py b/unittests/test_apiutils.py index 43ab8107183f16bf8df1d0ea8e447b378bcf8123..2ebdf95a3aa5ce76b983b2c3c47630e1a8884705 100644 --- a/unittests/test_apiutils.py +++ b/unittests/test_apiutils.py @@ -296,6 +296,19 @@ def test_merge_entities(): assert r2.get_property("F").value == "text" +def test_merge_bug_conflict(): + r = db.Record() + r.add_property(name="C", value=4) + r2 = db.Record() + r2.add_property(name="C", value=4, datatype="TEXT") + merge_entities(r, r2) + + r3 = db.Record() + r3.add_property(name="C", value=4, datatype="INTEGER") + with pytest.raises(RuntimeError) as excinfo: + merge_entities(r3, r2) + + def test_merge_bug_109(): rt = db.RecordType(name="TestBug") p = db.Property(name="test_bug_property", datatype=db.LIST(db.INTEGER))