changeset bac74c2ea3cd in trytond:6.4
details: https://hg.tryton.org/trytond?cmd=changeset&node=bac74c2ea3cd
description:
Support MultiSelection in MultiValue field
issue11730
review427811003
(grafted from bd9ad6eedf5c1f4dc135563fce5fff34999ee2ac)
diffstat:
trytond/model/multivalue.py | 2 +-
trytond/tests/multivalue.py | 46 +++++++++++++++-
trytond/tests/test_multivalue.py | 112 ++++++++++++++++++++++++++++++++++++++-
3 files changed, 156 insertions(+), 4 deletions(-)
diffs (232 lines):
diff -r 6ec258e24ff6 -r bac74c2ea3cd trytond/model/multivalue.py
--- a/trytond/model/multivalue.py Mon Oct 17 23:35:02 2022 +0200
+++ b/trytond/model/multivalue.py Sat Oct 15 22:08:25 2022 +0200
@@ -68,7 +68,7 @@
return str(value)
return value.id
elif isinstance(value, (list, tuple)):
- return [r.id for r in value]
+ return tuple(r.id if isinstance(r, Model) else r for r in value)
else:
return value
diff -r 6ec258e24ff6 -r bac74c2ea3cd trytond/tests/multivalue.py
--- a/trytond/tests/multivalue.py Mon Oct 17 23:35:02 2022 +0200
+++ b/trytond/tests/multivalue.py Sat Oct 15 22:08:25 2022 +0200
@@ -9,13 +9,34 @@
__name__ = 'test.model_multivalue'
value = fields.MultiValue(fields.Char("Value"))
value_default = fields.MultiValue(fields.Char("Value Default"))
+ value_many2one = fields.MultiValue(
+ fields.Many2One('test.model_multivalue.target', "Value Many2One"))
+ value_multiselection = fields.MultiValue(
+ fields.MultiSelection([
+ ('foo', "Foo"),
+ ('bar', "Bar"),
+ ], "Value Multi Selection"))
+ value_reference = fields.MultiValue(
+ fields.Reference(
+ "Value Reference",
+ selection=[
+ (None, ""),
+ ('test.model_multivalue.target', "Target"),
+ ]))
values = fields.One2Many(
'test.model_multivalue.value', 'record', "Values")
@classmethod
def multivalue_model(cls, field):
pool = Pool()
- if field == 'value_default':
+ multivalue_fields = {
+ 'value',
+ 'value_default',
+ 'value_many2one',
+ 'value_multiselection',
+ 'value_reference'
+ }
+ if field in multivalue_fields:
return pool.get('test.model_multivalue.value')
return super().multivalue_model(field)
@@ -27,6 +48,10 @@
def default_value_default(cls, **pattern):
return "other default"
+ @classmethod
+ def default_value_multiselection(cls, **pattern):
+ return ('foo',)
+
class ModelValue(ModelSQL, ValueMixin):
"Model Value"
@@ -36,10 +61,29 @@
condition = fields.Char("Condition")
value = fields.Char("Value")
value_default = fields.Char("Value Default")
+ value_many2one = fields.Many2One(
+ 'test.model_multivalue.target', "Value Many2One")
+ value_multiselection = fields.MultiSelection([
+ ('foo', "Foo"),
+ ('bar', "Bar"),
+ ], "Value Multi Selection")
+ value_reference = fields.Reference(
+ "Value Reference",
+ selection=[
+ (None, ""),
+ ('test.model_multivalue.target', "Target"),
+ ])
+
+
+class ModelMultiValueTarget(ModelSQL):
+ "Model MultiValue Target"
+ __name__ = 'test.model_multivalue.target'
+ name = fields.Char("Name")
def register(module):
Pool.register(
ModelMultiValue,
ModelValue,
+ ModelMultiValueTarget,
module=module, type_='model')
diff -r 6ec258e24ff6 -r bac74c2ea3cd trytond/tests/test_multivalue.py
--- a/trytond/tests/test_multivalue.py Mon Oct 17 23:35:02 2022 +0200
+++ b/trytond/tests/test_multivalue.py Sat Oct 15 22:08:25 2022 +0200
@@ -76,6 +76,46 @@
"default")
@with_transaction()
+ def test_get_multivalue_many2one(self):
+ "Test get_multivalue for Many2One"
+ pool = Pool()
+ ModelMultiValue = pool.get('test.model_multivalue')
+ Target = pool.get('test.model_multivalue.target')
+
+ target = Target(name="Target")
+ target.save()
+ record = ModelMultiValue(value_many2one=target)
+ record.save()
+
+ self.assertEqual(record.get_multivalue('value_many2one'), target)
+
+ @with_transaction()
+ def test_get_multivalue_multiselection(self):
+ "Test get_multivalue for MultiSelection"
+ pool = Pool()
+ ModelMultiValue = pool.get('test.model_multivalue')
+
+ record = ModelMultiValue(value_multiselection=("foo", "bar"))
+ record.save()
+
+ self.assertEqual(
+ record.get_multivalue('value_multiselection'), ("bar", "foo"))
+
+ @with_transaction()
+ def test_get_multivalue_reference(self):
+ "Test get_multivalue for Reference"
+ pool = Pool()
+ ModelMultiValue = pool.get('test.model_multivalue')
+ Target = pool.get('test.model_multivalue.target')
+
+ target = Target(name="Target")
+ target.save()
+ record = ModelMultiValue(value_reference=target)
+ record.save()
+
+ self.assertEqual(record.get_multivalue('value_reference'), target)
+
+ @with_transaction()
def test_set_multivalue(self):
"Test set_multivalue"
pool = Pool()
@@ -134,7 +174,58 @@
self.assertEqual(value.value_default, "other default")
@with_transaction()
- def test_mutlivalue_setter(self):
+ def test_set_multivalue_many2one(self):
+ "Test set_multivalue for Many2One"
+ pool = Pool()
+ ModelMultiValue = pool.get('test.model_multivalue')
+ ModelValue = pool.get('test.model_multivalue.value')
+ Target = pool.get('test.model_multivalue.target')
+
+ record = ModelMultiValue()
+ record.save()
+ target = Target(name="Test")
+ target.save()
+ record.set_multivalue('value_many2one', target)
+
+ value, = ModelValue.search([])
+ self.assertEqual(value.record, record)
+ self.assertEqual(value.value_many2one, target)
+
+ @with_transaction()
+ def test_set_multivalue_multiselection(self):
+ "Test set_multivalue for MultiSelection"
+ pool = Pool()
+ ModelMultiValue = pool.get('test.model_multivalue')
+ ModelValue = pool.get('test.model_multivalue.value')
+
+ record = ModelMultiValue()
+ record.save()
+ record.set_multivalue('value_multiselection', ("foo", "bar"))
+
+ value, = ModelValue.search([])
+ self.assertEqual(value.record, record)
+ self.assertEqual(value.value_multiselection, ('bar', 'foo'))
+
+ @with_transaction()
+ def test_set_multivalue_reference(self):
+ "Test set_multivalue for Reference"
+ pool = Pool()
+ ModelMultiValue = pool.get('test.model_multivalue')
+ ModelValue = pool.get('test.model_multivalue.value')
+ Target = pool.get('test.model_multivalue.target')
+
+ target = Target(name="Target")
+ target.save()
+ record = ModelMultiValue()
+ record.save()
+ record.set_multivalue('value_reference', target)
+
+ value, = ModelValue.search([])
+ self.assertEqual(value.record, record)
+ self.assertEqual(value.value_reference, target)
+
+ @with_transaction()
+ def test_multivalue_setter(self):
"Test multivalue setter"
pool = Pool()
ModelMultiValue = pool.get('test.model_multivalue')
@@ -146,7 +237,7 @@
self.assertEqual(record.get_multivalue('value'), "setter")
@with_transaction()
- def test_mutlivalue_getter(self):
+ def test_multivalue_getter(self):
"Test multivalue getter"
pool = Pool()
ModelMultiValue = pool.get('test.model_multivalue')
@@ -156,3 +247,20 @@
read, = ModelMultiValue.read([record.id], ['value'])
self.assertEqual(read['value'], "getter")
+
+ @with_transaction()
+ def test_multivalue_getter_reference(self):
+ "Test multivalue getter for Reference"
+ pool = Pool()
+ ModelMultiValue = pool.get('test.model_multivalue')
+ Target = pool.get('test.model_multivalue.target')
+
+ target = Target(name="Target")
+ target.save()
+ record = ModelMultiValue(value_reference=target)
+ record.save()
+
+ read, = ModelMultiValue.read([record.id], ['value_reference'])
+ self.assertEqual(
+ read['value_reference'],
+ 'test.model_multivalue.target,%s' % target.id)