Do not use class value of Reference field if it is not a ModelStorage

When Reference fields store partial reference, the value is the stored string
instead of an instance. So the class of the value is then str which can not be
used for domain validation.

Closes #11954
This commit is contained in:
Cédric Krier
2023-01-07 20:43:22 +01:00
parent 4683fde7ac
commit 9dea49488c
2 changed files with 47 additions and 1 deletions
+3 -1
View File
@@ -1207,7 +1207,9 @@ class ModelStorage(Model):
Relation = field.get_target()
elif field._type == 'reference':
value = getattr(record, field.name)
Relation = value.__class__ if value else None
Relation = (
value.__class__ if isinstance(value, ModelStorage)
else None)
else:
Relation = cls
return Relation
@@ -510,6 +510,28 @@ class FieldReferenceTestCase(unittest.TestCase):
}])
self.assertEqual(reference.reference, None)
@with_transaction()
def test_domain_no_id_value(self):
"Test reference with domain and no id"
pool = Pool()
Reference = pool.get('test.reference_domainvalidation')
reference, = Reference.create([{
'reference': 'test.reference.target,',
}])
self.assertEqual(reference.reference, 'test.reference.target,')
@with_transaction()
def test_domain_negative_id_value(self):
"Test reference with domain and negative id"
pool = Pool()
Reference = pool.get('test.reference_domainvalidation')
reference, = Reference.create([{
'reference': 'test.reference.target,-1',
}])
self.assertEqual(reference.reference, 'test.reference.target,-1')
@with_transaction()
def test_domain_different_targets(self):
"Test reference with domain and different targets"
@@ -544,6 +566,28 @@ class FieldReferenceTestCase(unittest.TestCase):
}])
self.assertEqual(reference.reference, target)
@with_transaction()
def test_domain_pyson_no_id_value(self):
"Test reference with pyson domain and no id"
pool = Pool()
Reference = pool.get('test.reference_domainvalidation_pyson')
reference, = Reference.create([{
'reference': 'test.reference.target,',
}])
self.assertEqual(reference.reference, 'test.reference.target,')
@with_transaction()
def test_domain_pyson_negative_id_value(self):
"Test reference with pyson domain and negative id"
pool = Pool()
Reference = pool.get('test.reference_domainvalidation_pyson')
reference, = Reference.create([{
'reference': 'test.reference.target,-1',
}])
self.assertEqual(reference.reference, 'test.reference.target,-1')
@with_transaction()
def test_domain_pyson_different_targets(self):
"Test reference with pyson domain and different targets"