changeset aff8066131c9 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset;node=aff8066131c9
description:
        Add support for properties to fields.depends

        issue9313
        review319451002
diffstat:

 CHANGELOG                           |   1 +
 trytond/model/modelview.py          |  11 ++++++++---
 trytond/tests/test_field_depends.py |  28 ++++++++++++++++++++++++++++
 3 files changed, 37 insertions(+), 3 deletions(-)

diffs (74 lines):

diff -r 8021e386894b -r aff8066131c9 CHANGELOG
--- a/CHANGELOG Fri May 22 11:27:27 2020 +0200
+++ b/CHANGELOG Mon May 25 09:39:17 2020 +0200
@@ -1,3 +1,4 @@
+* Add support for properties to fields.depends
 * Allow combining authentication methods together
 * Add context to export CSV route
 
diff -r 8021e386894b -r aff8066131c9 trytond/model/modelview.py
--- a/trytond/model/modelview.py        Fri May 22 11:27:27 2020 +0200
+++ b/trytond/model/modelview.py        Mon May 25 09:39:17 2020 +0200
@@ -150,7 +150,11 @@
                 if not parent_meth:
                     continue
                 for attr in ['depends', 'depend_methods', 'change']:
-                    parent_value = getattr(parent_meth, attr, None)
+                    if isinstance(parent_meth, property):
+                        parent_value = getattr(parent_meth.fget, attr, set())
+                        parent_value |= getattr(parent_meth.fset, attr, set())
+                    else:
+                        parent_value = getattr(parent_meth, attr, set())
                     if parent_value:
                         methods[attr][name] |= parent_value
 
@@ -174,8 +178,9 @@
             meth_done = set()
             while meth_names:
                 meth_name = meth_names.pop()
-                assert callable(getattr(cls, meth_name)), \
-                    "%s.%s not callable" % (cls, meth_name)
+                method = getattr(cls, meth_name)
+                assert callable(method) or isinstance(method, property), \
+                    "%s.%s not callable or property" % (cls, meth_name)
                 set_methods(meth_name)
                 setattr(field, attribute,
                     getattr(field, attribute) | methods['depends'][meth_name])
diff -r 8021e386894b -r aff8066131c9 trytond/tests/test_field_depends.py
--- a/trytond/tests/test_field_depends.py       Fri May 22 11:27:27 2020 +0200
+++ b/trytond/tests/test_field_depends.py       Mon May 25 09:39:17 2020 +0200
@@ -170,6 +170,34 @@
             set(Model.name.definition(Model, 'en')['on_change']),
             {'foo', 'bar', 'id'})
 
+    def test_property_depends(self):
+        "Tests depends on a property"
+
+        class Model(ModelView):
+            "ModelView Property Depends"
+            __name__ = 'test.modelview.property_depends'
+
+            foo = fields.Char("Foo")
+            bar = fields.Char("Bar")
+
+            @property
+            @fields.depends('foo')
+            def len_foo(self):
+                return len(self.foo)
+
+            @len_foo.setter
+            @fields.depends('bar')
+            def len_foo(self, value):
+                pass
+
+            @fields.depends(methods=['len_foo'])
+            def on_change_bar(self):
+                pass
+
+        Model.__setup__()
+
+        self.assertEqual(Model.bar.on_change, {'foo', 'bar'})
+
 
 def suite():
     return unittest.TestLoader().loadTestsFromTestCase(FieldDependsTestCase)

Reply via email to