From d2fb4286b2f1c61dceccd87391f02d09743be4aa Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Wed, 14 Dec 2022 17:24:02 +0100
Subject: [PATCH] WIP: file storage: link

---
 src/caosdb/common/models.py | 46 ++++++++-----------------------------
 unittests/test_datatype.py  |  6 +++++
 2 files changed, 15 insertions(+), 37 deletions(-)

diff --git a/src/caosdb/common/models.py b/src/caosdb/common/models.py
index 42861bf1..306cba6c 100644
--- a/src/caosdb/common/models.py
+++ b/src/caosdb/common/models.py
@@ -1396,7 +1396,7 @@ def _parse_value(datatype, value):
 
     # This is for a special case, where the xml parser could not differentiate
     # between single values and lists with one element. As
-    if hasattr(value, "__len__") and len(value) == 1:
+    if hasattr(value, "__len__") and len(value) == 1 and not isinstance(value, str):
         return _parse_value(datatype, value[0])
 
     # deal with references
@@ -1450,23 +1450,12 @@ class QueryTemplate():
         self.description = description
         self.query = query
         self._cuid = None
-        self.value = None
-        self.datatype = None
         self.messages = _Messages()
-        self.properties = None
-        self.parents = None
-        self.path = None
-        self.file = None
-        self._checksum = None
-        self._size = None
-        self._upload = None
-        self.unit = None
         self.acl = None
         self.permissions = None
         self.is_valid = lambda: False
         self.is_deleted = lambda: False
         self.version = None
-        self.state = None
 
     def retrieve(self, raise_exception_on_error=True, unique=True, sync=True,
                  flags=None):
@@ -2556,31 +2545,13 @@ def _basic_sync(e_local, e_remote):
                          "this client did't know about it yet.".format(
                              e_remote.role, e_local.role))
 
-    e_local.id = e_remote.id
-    e_local.name = e_remote.name
-    e_local.description = e_remote.description
-    e_local.path = e_remote.path
-    e_local.link_target = e_remote.link_target
-    e_local._checksum = e_remote._checksum
-    e_local._size = e_remote._size
-    e_local.datatype = e_remote.datatype
-    e_local.unit = e_remote.unit
-    e_local.value = e_remote.value
-    e_local.properties = e_remote.properties
-    e_local.parents = e_remote.parents
-    e_local.messages = e_remote.messages
-    e_local.acl = e_remote.acl
-    e_local.permissions = e_remote.permissions
-    e_local.is_valid = e_remote.is_valid
-    e_local.is_deleted = e_remote.is_deleted
-    e_local.version = e_remote.version
-    e_local.state = e_remote.state
-
-    if hasattr(e_remote, "query"):
-        e_local.query = e_remote.query
-
-    if hasattr(e_remote, "affiliation"):
-        e_local.affiliation = e_remote.affiliation
+    for attr in ["path", "link_target", "_checksum", "_size", "datatype",
+                 "unit", "value", "properties", "parents", "messages", "acl",
+                 "permissions", "is_valid", "is_deleted", "version", "state",
+                 "query", "affiliation", "id", "name", "description"]:
+
+        if hasattr(e_remote, attr):
+            setattr(e_local, attr, getattr(e_remote, attr))
 
     return e_local
 
@@ -3064,6 +3035,7 @@ class Container(list):
 
         for local_entity in self:
             if (sync_dict[local_entity] is None
+                    and hasattr(local_entity, "path")
                     and local_entity.path is not None):
                 sync_remote_entities = []
 
diff --git a/unittests/test_datatype.py b/unittests/test_datatype.py
index 9b3c6267..5e421175 100644
--- a/unittests/test_datatype.py
+++ b/unittests/test_datatype.py
@@ -87,3 +87,9 @@ def test_parsing_of_references():
 
     entity = db.Record(name="bla")
     assert id(_parse_value(dtype, entity)) == id(entity)
+
+
+def test_parsing_of_single_list_item_str_len_one():
+    db.Record().add_property("blub", datatype=db.LIST(db.TEXT), value=["a"])
+    db.Record().add_property("blub", datatype=db.LIST(db.INTEGER), value=[1])
+    db.Record().add_property("blub", datatype=db.LIST("bla"), value=["a"])
-- 
GitLab