diff --git a/src/caosdb/high_level_api.py b/src/caosdb/high_level_api.py index 345f02d6a490c6a20beb27e8d3250aef6fa22e5d..534c01d127649d98f0362570cfc1620074dd5f82 100644 --- a/src/caosdb/high_level_api.py +++ b/src/caosdb/high_level_api.py @@ -625,30 +625,30 @@ def _single_convert_to_python_object(robj: CaosDBPythonEntity, robj.add_parent(CaosDBPythonUnresolvedParent(id=parent.id, name=parent.name)) - # Resolve so far unresolved references also using the provided references container: - # TODO - return robj def _single_convert_to_entity(entity: db.Entity, - robj: CaosDBPythonEntity, - recursive_depth, **kwargs): + robj: CaosDBPythonEntity): """ - recursive_depth: disabled if 0 + Convert a CaosDBPythonEntity to an entity in standard pylib format. + + entity: db.Entity + An empty entity. + + robj: CaosDBPythonEntity + The CaosDBPythonEntity that is supposed to be converted to the entity. """ - for base_attribute in BASE_ATTRIBUTES: - modified_base_attribute = base_attribute - if base_attribute in ("file", "path"): - modified_base_attribute = "_" + modified_base_attribute + # for base_attribute in BASE_ATTRIBUTES: + # modified_base_attribute = base_attribute + # if base_attribute in ("file", "path"): + # modified_base_attribute = "_" + modified_base_attribute - entity.__setattr__(modified_base_attribute, - robj.__getattribute__(base_attribute)) - - children = [] + # entity.__setattr__(modified_base_attribute, + # robj.__getattribute__(base_attribute)) - for parent in robj._parents: + for parent in robj.get_parents(): if isinstance(parent, CaosDBPythonUnresolvedParent): entity.add_parent(name=parent.name, id=parent.id) elif isinstance(parent, CaosDBPythonRecordType): @@ -656,8 +656,27 @@ def _single_convert_to_entity(entity: db.Entity, else: raise RuntimeError("Incompatible class used as parent.") - # TODO: implementation incomplete - raise NotImplementedError() + for prop in robj.get_properties(): + propval = robj.__getattribute__(prop) + metadata = robj.get_property_metadata(prop) + + if isinstance(propval, CaosDBPythonUnresolvedReference): + propval = propval.id + elif isinstance(propval, CaosDBPythonEntity): + propval = _single_convert_to_entity(db.Record(), propval) + elif isinstance(propval, list): + raise NotImplementedError() + + entity.add_property( + name=prop, + value=propval, + unit=metadata.unit, + importance=metadata.importance, + datatype=metadata.datatype, + description=metadata.description, + id=metadata.id) + + return entity def add_property(entity, prop, name, _recursive=False, datatype=None): if datatype is None: @@ -730,22 +749,21 @@ def _single_convert_to_entity(entity: db.Entity, return [entity] + children -def convert_to_entity(python_object, **kwargs): - raise NotImplementedError() +def convert_to_entity(python_object): if isinstance(python_object, db.Container): # Create a list of objects: - return [convert_to_python_object(i, **kwargs) for i in python_object] + return [convert_to_entity(i) for i in python_object] elif isinstance(python_object, CaosDBPythonRecord): - return _single_convert_to_entity(db.Record(), python_object, **kwargs) + return _single_convert_to_entity(db.Record(), python_object) elif isinstance(python_object, CaosDBPythonFile): - return _single_convert_to_entity(db.File(), python_object, **kwargs) + return _single_convert_to_entity(db.File(), python_object) elif isinstance(python_object, CaosDBPythonRecordType): - return _single_convert_to_entity(db.RecordType(), python_object, **kwargs) + return _single_convert_to_entity(db.RecordType(), python_object) elif isinstance(python_object, CaosDBPythonProperty): - return _single_convert_to_entity(db.Property(), python_object, **kwargs) + return _single_convert_to_entity(db.Property(), python_object) elif isinstance(python_object, CaosDBPythonEntity): - return _single_convert_to_entity(db.Entity(), python_object, **kwargs) + return _single_convert_to_entity(db.Entity(), python_object) else: raise ValueError("Cannot convert an object of this type.") diff --git a/unittests/test_high_level_api.py b/unittests/test_high_level_api.py index a5a123107f65c4a77e5cb3270ffbee60e738ffee..73b2d89a1db1a101ac27ac6aa2ae5d2b0557264c 100644 --- a/unittests/test_high_level_api.py +++ b/unittests/test_high_level_api.py @@ -29,6 +29,8 @@ from caosdb.high_level_api import (convert_to_entity, convert_to_python_object) from caosdb.high_level_api import (CaosDBPythonUnresolvedParent, CaosDBPythonUnresolvedReference, CaosDBPythonRecord) +from caosdb.apiutils import compare_entities + import pytest from lxml import etree import os @@ -225,4 +227,36 @@ def test_resolve_references(): obj = convert_to_python_object(r) obj.resolve_references(True, references) assert obj.ref.ref.ref == obj.ref + +def equal_entities(r1, r2): + res = compare_entities(r1, r2) + if len(res) != 2: + return False + for i in range(2): + if len(res[i]["parents"]) != 0 or len(res[i]["properties"]) != 0: + return False + return True +def test_conversion_to_entity(): + r = db.Record() + r.add_parent("bla") + r.add_property(name="a", value=42) + r.add_property(name="b", value="test") + obj = convert_to_python_object(r) + rconv = convert_to_entity(obj) + assert equal_entities(r, rconv) + + + # With datatype: + r_ref = db.Record() + r_ref.add_parent("bla") + r_ref.add_property(name="a", value=42) + + r = db.Record() + r.add_property(name="ref", value=r_ref) + obj = convert_to_python_object(r) + rconv = convert_to_entity(obj) + assert (rconv.get_property("ref").value.get_property("a").value + == r.get_property("ref").value.get_property("a").value) + assert len(rconv.properties) == len(r.properties) + assert len(rconv.parents) == len(r.parents)