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)

Reply via email to