From 8909f28db6d4ab251b9af9af4483867fc7dddeaa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com>
Date: Sat, 17 Jul 2021 17:21:35 +0200
Subject: [PATCH] add conversion

---
 src/caosadvancedtools/models/parser.py | 18 +++++++++++++++---
 unittests/test_parser.py               |  7 ++++++-
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index 84abc315..cd10d971 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -192,7 +192,7 @@ class Parser(object):
             self._add_entity_to_model(name, entity)
         # initialize recordtypes
         self._set_recordtypes()
-        self._check_datatypes()
+        self._check_and_convert_datatypes()
 
         for name, entity in ymlmodel.items():
             self._treat_entity(name, entity, line=ymlmodel["__line__"])
@@ -384,7 +384,7 @@ class Parser(object):
             raise e
         self.treated.append(name)
 
-    def _check_datatypes(self):
+    def _check_and_convert_datatypes(self):
         """ checks if datatype is valid.
         datatype of properties is simply initialized with string. Here, we
         iterate over properties and check whether it is a base datatype of a
@@ -395,13 +395,19 @@ class Parser(object):
 
             if isinstance(value, db.Property):
                 dtype = value.datatype
+                is_list = False
 
                 if _get_listdatatype(value.datatype) is not None:
                     dtype = _get_listdatatype(value.datatype)
+                    is_list = True
 
                 if dtype in self.model:
+                    if is_list:
+                        value.datatype = db.LIST(self.model[dtype])
+                    else:
+                        value.datatype = self.model[dtype]
+
                     continue
-                # get the datatype
 
                 if dtype in [db.DOUBLE,
                              db.REFERENCE,
@@ -411,7 +417,13 @@ class Parser(object):
                              db.FILE,
                              db.BOOLEAN]:
 
+                    if is_list:
+                        value.datatype = db.LIST(db.__getattribute__(dtype))
+                    else:
+                        value.datatype = db.__getattribute__(dtype)
+
                     continue
+
                 raise ValueError("Unknown Datatype.")
 
     def _set_recordtypes(self):
diff --git a/unittests/test_parser.py b/unittests/test_parser.py
index 03b82809..620c9792 100644
--- a/unittests/test_parser.py
+++ b/unittests/test_parser.py
@@ -200,9 +200,14 @@ RT1:
   recommended_properties:
     a:
       datatype: LIST(RT2)
+    b:
+      datatype: LIST(TEXT)
 RT2:
 """
-        parse_model_from_yaml(to_file(string))
+        model = parse_model_from_yaml(to_file(string))
+
+        self.assertTrue(isinstance(model['b'], db.Property))
+        self.assertEqual(model['b'].datatype, db.LIST(db.TEXT))
 
         # This failed for an older version of caosdb-models
         string_list = """
-- 
GitLab