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)