From 32519e878e8ef1ab4b4adabe7c471927cb32827f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com>
Date: Fri, 14 Apr 2023 13:02:04 +0200
Subject: [PATCH] FIX: allow deepcopy of _Messages

---
 src/caosdb/common/models.py |  5 +++
 unittests/test_message.py   | 68 ++++++++++++++++++-------------------
 2 files changed, 39 insertions(+), 34 deletions(-)

diff --git a/src/caosdb/common/models.py b/src/caosdb/common/models.py
index d418ee59..e33147f3 100644
--- a/src/caosdb/common/models.py
+++ b/src/caosdb/common/models.py
@@ -2403,6 +2403,8 @@ class _Messages(list):
     (to be continued...)
     """
 
+    _is_wrapped = False
+
     def clear_server_messages(self):
         # TODO can we deprecate this and refer people to clear
         """Removes all error, warning and info messages."""
@@ -2579,6 +2581,9 @@ def donotuse(func):
 
 def _message_wrap_deprication(msg):
     """ function to allow deprecation of _Messages return values """
+    if not msg._is_wrapped:
+        return msg
+    msg._is_wrapped = True
     msg.clear_server_messages = donotuse(msg.clear_server_messages)
     msg.__setitem__ = donotuse(msg.__setitem__)
     msg.__delitem__ = donotuse(msg.__delitem__)
diff --git a/unittests/test_message.py b/unittests/test_message.py
index 112004c2..feffb31b 100644
--- a/unittests/test_message.py
+++ b/unittests/test_message.py
@@ -81,40 +81,40 @@ def test_messages_dict_behavior():
     assert msgs["HelloWorld"] == "Hello!"
 
 
-# def test_deepcopy():
-#    """Test whether deepcopy of _Messages objects doesn't mess up
-#    contained Messages objects.
-#
-#    """
-#    msgs = db.common.models._Messages()
-#    msg = db.Message(type="bla", code=1234, description="desc", body="blabla")
-#    msgs.append(msg)
-#    msg_copy = deepcopy(msgs)[0]
-#
-#    # make sure type is string-like (formerly caused problems)
-#    assert hasattr(msg_copy.type, "lower")
-#    assert msg_copy.type == msg.type
-#    assert msg_copy.code == msg.code
-#    assert msg_copy.description == msg.description
-#    assert msg_copy.body == msg.body
-#
-#
-# def test_deepcopy_clear_server():
-#
-#    msgs = db.common.models._Messages()
-#    msg = db.Message(type="bla", code=1234, description="desc", body="blabla")
-#    err_msg = db.Message(type="Error", code=1357, description="error")
-#    msgs.extend([msg, err_msg])
-#    copied_msgs = deepcopy(msgs)
-#
-#    assert len(copied_msgs) == 2
-#    assert copied_msgs.get("Error", err_msg.code).code == err_msg.code
-#    assert copied_msgs.get("bla", msg.code).code == msg.code
-#
-#    # Only the error should be removed
-#    copied_msgs.clear_server_messages()
-#    assert len(copied_msgs) == 1
-#    assert copied_msgs[0].code == msg.code
+def test_deepcopy():
+    """Test whether deepcopy of _Messages objects doesn't mess up
+    contained Messages objects.
+
+    """
+    msgs = db.common.models._Messages()
+    msg = db.Message(type="bla", code=1234, description="desc", body="blabla")
+    msgs.append(msg)
+    msg_copy = deepcopy(msgs)[0]
+
+    # make sure type is string-like (formerly caused problems)
+    assert hasattr(msg_copy.type, "lower")
+    assert msg_copy.type == msg.type
+    assert msg_copy.code == msg.code
+    assert msg_copy.description == msg.description
+    assert msg_copy.body == msg.body
+
+
+def test_deepcopy_clear_server():
+
+    msgs = db.common.models._Messages()
+    msg = db.Message(type="bla", code=1234, description="desc", body="blabla")
+    err_msg = db.Message(type="Error", code=1357, description="error")
+    msgs.extend([msg, err_msg])
+    copied_msgs = deepcopy(msgs)
+
+    assert len(copied_msgs) == 2
+    assert copied_msgs.get("Error", err_msg.code).code == err_msg.code
+    assert copied_msgs.get("bla", msg.code).code == msg.code
+
+    # Only the error should be removed
+    copied_msgs.clear_server_messages()
+    assert len(copied_msgs) == 1
+    assert copied_msgs[0].code == msg.code
 
 
 def test_deprecated_append_return():
-- 
GitLab