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()