changeset 0e36574311f8 in trytond:6.0
details: https://hg.tryton.org/trytond?cmd=changeset&node=0e36574311f8
description:
        Ignore invalid Reference field when reading related fields

        issue11484
        review449081003
        (grafted from c0b209d2dcd7462aefdecefb1cfb06a18759f030)
diffstat:

 trytond/model/fields/reference.py |   2 +-
 trytond/model/modelsql.py         |  15 +++++++++++----
 trytond/tests/test_modelsql.py    |  32 ++++++++++++++++++++++++++++++++
 3 files changed, 44 insertions(+), 5 deletions(-)

diffs (86 lines):

diff -r 7e100e82d6f0 -r 0e36574311f8 trytond/model/fields/reference.py
--- a/trytond/model/fields/reference.py Thu May 19 22:00:57 2022 +0200
+++ b/trytond/model/fields/reference.py Thu May 19 22:02:33 2022 +0200
@@ -114,7 +114,7 @@
                 continue
             try:
                 ref_id = int(ref_id)
-            except Exception:
+            except ValueError:
                 continue
             if ref_id < 0:
                 continue
diff -r 7e100e82d6f0 -r 0e36574311f8 trytond/model/modelsql.py
--- a/trytond/model/modelsql.py Thu May 19 22:00:57 2022 +0200
+++ b/trytond/model/modelsql.py Thu May 19 22:02:33 2022 +0200
@@ -878,9 +878,13 @@
                 add = target_ids.extend
             elif field._type == 'reference':
                 def add(value):
-                    id_ = int(value.split(',', 1)[1])
-                    if id_ >= 0:
-                        target_ids.append(id_)
+                    try:
+                        id_ = int(value.split(',', 1)[1])
+                    except ValueError:
+                        pass
+                    else:
+                        if id_ >= 0:
+                            target_ids.append(id_)
             else:
                 add = target_ids.append
             for row in rows:
@@ -902,7 +906,10 @@
                 for row in rows:
                     value = row[name]
                     if isinstance(value, str):
-                        value = int(value.split(',', 1)[1])
+                        try:
+                            value = int(value.split(',', 1)[1])
+                        except ValueError:
+                            value = None
                     if value is not None and value >= 0:
                         row[key] = targets[value]
                     else:
diff -r 7e100e82d6f0 -r 0e36574311f8 trytond/tests/test_modelsql.py
--- a/trytond/tests/test_modelsql.py    Thu May 19 22:00:57 2022 +0200
+++ b/trytond/tests/test_modelsql.py    Thu May 19 22:02:33 2022 +0200
@@ -116,6 +116,38 @@
                     }])
 
     @with_transaction()
+    def test_read_related_invalid_reference(self):
+        "Test read with related invalid Reference"
+        pool = Pool()
+        Model = pool.get('test.modelsql.read')
+
+        record, = Model.create(
+            [{'reference': 'test.modelsql.read.target,None'}])
+        values = Model.read([record.id], ['reference.name'])
+
+        self.assertEqual(values, [{
+                    'id': record.id,
+                    'reference.': None,
+                    }])
+
+    @with_transaction()
+    def test_read_related_deleted_reference(self):
+        "Test read with related deleted Reference"
+        pool = Pool()
+        Model = pool.get('test.modelsql.read')
+        Target = pool.get('test.modelsql.read.target')
+
+        target, = Target.create([{'name': "Target"}])
+        record, = Model.create([{'reference': str(target)}])
+        Target.delete([target])
+        values = Model.read([record.id], ['reference.name'])
+
+        self.assertEqual(values, [{
+                    'id': record.id,
+                    'reference.': None,
+                    }])
+
+    @with_transaction()
     def test_read_related_reference_empty(self):
         "Test read with empty related Reference"
         pool = Pool()

Reply via email to