From 5cba79f3115466f35dbe913efffcef0c276ee555 Mon Sep 17 00:00:00 2001
From: Alexander Kreft <akreft@trineo.org>
Date: Fri, 8 Oct 2021 16:04:05 +0200
Subject: [PATCH] ENH: Better handling for entity lists

---
 src/caosadvancedtools/cfood.py |  7 +++++++
 unittests/test_cfood.py        | 22 ++++++++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/src/caosadvancedtools/cfood.py b/src/caosadvancedtools/cfood.py
index 48b423e0..6b71b919 100644
--- a/src/caosadvancedtools/cfood.py
+++ b/src/caosadvancedtools/cfood.py
@@ -47,6 +47,7 @@ from abc import ABCMeta, abstractmethod
 from datetime import datetime
 
 import caosdb as db
+from caosdb.common.models import Entity
 from caosdb.exceptions import (BadQueryError, EmptyUniqueQueryError,
                                QueryNotUniqueError, TransactionError)
 
@@ -661,12 +662,18 @@ def assure_has_property(entity, name, value, to_be_updated=None,
 
     if isinstance(value, db.Entity):
         value = value.id
+    
+    if isinstance(value, list):
+        value = [i.id if isinstance(i, db.Entity) else i for i in value]
 
     for el in possible_properties:
         tmp_value = el.value
 
         if isinstance(tmp_value, db.Entity):
             tmp_value = el.value.id
+        
+        if isinstance(tmp_value, list):
+            tmp_value = [i.id if isinstance(i, db.Entity) else i for i in tmp_value]
 
         if tmp_value == value:
             contained = True
diff --git a/unittests/test_cfood.py b/unittests/test_cfood.py
index ab5cb11e..5f257468 100644
--- a/unittests/test_cfood.py
+++ b/unittests/test_cfood.py
@@ -190,6 +190,28 @@ class InsertionTest(unittest.TestCase):
                             value=new_int, to_be_updated=to_be_updated)
         assert to_be_updated[0] is entity
 
+        """Test properties with lists"""
+        rec1 = db.Record(id=12323)
+        rec1.add_property("Exp", value=[123333], datatype=db.LIST("Exp"))
+        rec2 = db.Record(id=123333)
+        update = []
+        assure_has_property(rec1, "Exp", [rec2], to_be_updated=update)
+        assert len(update) == 0
+        update = []
+        assure_has_property(rec1, "Exp", [123333], to_be_updated=update)
+        assert len(update) == 0
+        update = []
+        assure_has_property(rec1, "Exp2", [123333, 456, 789], to_be_updated=update)
+        assert len(update) == 1
+
+        rec = db.Record(id=456456)
+        rec3 = db.Record(id=789789)
+        rec.add_property("Exp", value=[123123, rec3], datatype=db.LIST("Exp"))
+        rec2 = db.Record(id=123123)
+        update = []
+        assure_has_property(rec, "Exp", [rec2, 789789], to_be_updated=update)
+        assert len(update) == 0
+
     def test_property_is(self):
         """Test properties with string, int, float, and Boolean values"""
         entity = db.Record()
-- 
GitLab