From 2ff5821b43283253cc977f67061ed8ffd3d743f6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com>
Date: Wed, 29 Jan 2025 10:59:03 +0100
Subject: [PATCH] FIX: datatype of reference and messages in GUI

---
 loanpy/integrationtests/basic_test.py    |  2 +-
 loanpy/src/loan/accept_return_request.py |  4 ++--
 loanpy/src/loan/confirm_loan.py          |  2 +-
 loanpy/src/loan/manual_return.py         |  6 ++++--
 loanpy/src/loan/request_loan.py          | 12 ++++++++++--
 loanpy/unittests/test_request_loan.py    |  2 --
 6 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/loanpy/integrationtests/basic_test.py b/loanpy/integrationtests/basic_test.py
index dd3ef49..d34a61f 100644
--- a/loanpy/integrationtests/basic_test.py
+++ b/loanpy/integrationtests/basic_test.py
@@ -117,7 +117,7 @@ def loan_form_data_single(base_loan_form_data):
 @fixture()
 def loan_form_data_multi(base_loan_form_data):
     base_loan_form_data[F_BOX] = [
-        get_entity_by_name(TESTBOXNUMBER).id,
+        str(get_entity_by_name(TESTBOXNUMBER).id),  # strings are allowed
         get_entity_by_name(TESTBOXNUMBER2).id]
     return base_loan_form_data
 
diff --git a/loanpy/src/loan/accept_return_request.py b/loanpy/src/loan/accept_return_request.py
index 22b0fc5..d12516c 100755
--- a/loanpy/src/loan/accept_return_request.py
+++ b/loanpy/src/loan/accept_return_request.py
@@ -26,7 +26,7 @@ from __future__ import absolute_import
 import caosdb as db
 from caosadvancedtools.serverside.helper import get_timestamp, print_success
 
-from .box_loan import (BOX_BORROWED, CONTENT, F_LOAN, RETURN_ACCEPTED, RETURNLOCATION,
+from .box_loan import (BOX, CONTENT, F_LOAN, RETURN_ACCEPTED, RETURNLOCATION,
                        S_RETURN_ACCEPTED, S_RETURN_REQUESTED, get_borrower_names, get_loan, main,
                        set_location_of_borrowed_items, set_property, update_loan_state)
 
@@ -66,7 +66,7 @@ def accept_return_request(data):
                             and config["Misc"]["entity_loan.no_content_updates"]))
     _accept_return_request(loan, location_updates=location_updates)
     fn, ln = get_borrower_names(loan)
-    box_id = loan.get_property(BOX_BORROWED).value
+    box_id = loan.get_property(BOX).value
     if not isinstance(box_id, list):
         box_id = [box_id]
 
diff --git a/loanpy/src/loan/confirm_loan.py b/loanpy/src/loan/confirm_loan.py
index a435b45..9e5b982 100755
--- a/loanpy/src/loan/confirm_loan.py
+++ b/loanpy/src/loan/confirm_loan.py
@@ -70,7 +70,7 @@ def confirm_loan(data):
     loan = _confirm_loan(data)
     fn, ln = get_borrower_names(loan)
     loan = get_loan(data[F_LOAN])
-    box_id = loan.get_property(BOX_BORROWED).value
+    box_id = loan.get_property(BOX).value
 
     if not isinstance(box_id, list):
         box_id = [box_id]
diff --git a/loanpy/src/loan/manual_return.py b/loanpy/src/loan/manual_return.py
index 7e04723..a2acab7 100755
--- a/loanpy/src/loan/manual_return.py
+++ b/loanpy/src/loan/manual_return.py
@@ -96,12 +96,14 @@ def manual_return(data):
     loan = _manual_return(data)
     fn, ln = get_borrower_names(loan)
     loan = get_loan(data[F_LOAN])
-    box_id = loan.get_property(BOX_BORROWED)
+    box_id = loan.get_property(BOX).value
 
+    if not isinstance(box_id, list):
+        box_id = [box_id]
     print_success('The box borrowed by {fn} {ln} '.format(fn=fn, ln=ln)
                   + 'has been returned and the Box Location has been updated.'
                   '<a href="/Entity/{bid}" title="Reload this page.">Reload</a> '
-                  'to view the new Location.<br>'.format(bid=box_id))
+                  'to view the new Location.<br>'.format(bid="&".join([str(el) for el in box_id])))
 
     return 0
 
diff --git a/loanpy/src/loan/request_loan.py b/loanpy/src/loan/request_loan.py
index 5cb51f2..15ecf67 100755
--- a/loanpy/src/loan/request_loan.py
+++ b/loanpy/src/loan/request_loan.py
@@ -69,9 +69,17 @@ def _set_defaults(data):
 def _check_data(data):
     for field in _OBLIGATORY:
         assert_key_in_data(data, field)
-    if not (isinstance(data[F_BOX], int) or isinstance(data[F_BOX], list)):
+    items = data[F_BOX]
+    if not isinstance(items, list):
+        items = [items]
+    bad_references = []
+    for item in items:
+        if not (isinstance(item, int) or item.isnumeric()):
+            bad_references.append(item)
+    if bad_references:
         raise ValueError(
-            f"the value of {F_BOX} has the wrong type. It should be int or list of ints")
+                f"The  following value(s) of {F_BOX} has/have the wrong type. It should be "
+                f"integers or string representations thereof.\n{bad_references}")
     assert_date_in_future(
         data[F_EXPECTED_RETURN_DATE],
         ("The expected return date needs to be in the future."
diff --git a/loanpy/unittests/test_request_loan.py b/loanpy/unittests/test_request_loan.py
index 8b41f30..2b6bcc2 100644
--- a/loanpy/unittests/test_request_loan.py
+++ b/loanpy/unittests/test_request_loan.py
@@ -28,5 +28,3 @@ def test_create_loan():
     assert loan.get_property(EXHAUST_CONTENTS.name).value is False
     assert loan.get_property(COMMENT.name).value == "blablabla"
     assert loan.get_property(DESTINATION.name).value == "my office"
-
-    create_loan(1234, borrower, "2020-03-23", False, "blablabla", "my office")
-- 
GitLab