Add support for properties to fields.depends

issue9313
review319451002
This commit is contained in:
Nicolas Évrard
2020-05-25 09:39:17 +02:00
parent 70ca04ee3d
commit cfb307238e
3 changed files with 37 additions and 3 deletions
+1
View File
@@ -1,3 +1,4 @@
* Add support for properties to fields.depends
* Allow combining authentication methods together
* Add context to export CSV route
+8 -3
View File
@@ -150,7 +150,11 @@ class ModelView(Model):
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 @@ class ModelView(Model):
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])
+28
View File
@@ -170,6 +170,34 @@ class FieldDependsTestCase(unittest.TestCase):
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)