Files
tradon/tests/test_field_depends.py
2025-12-26 13:11:43 +00:00

266 lines
7.4 KiB
Python
Executable File

# This file is part of Tryton. The COPYRIGHT file at the top level of this
# repository contains the full copyright notices and license terms.
import unittest
from trytond.model import ModelView, fields
from trytond.pyson import Eval, If
from trytond.tests.test_tryton import activate_module, with_transaction
class FieldDependsTestCase(unittest.TestCase):
'Test Field Depends'
@classmethod
def setUpClass(cls):
activate_module('tests')
def test_empty_depends(self):
'Test depends are set if empty'
class Model(object):
@fields.depends('name')
def dependant(self):
pass
record = Model()
record.dependant()
self.assertIsNone(record.name)
def test_empty_depends_default(self):
"Test depends are set with default value if empty"
class Model(object):
@fields.depends('name')
def dependant(self):
pass
@classmethod
def default_name(cls):
return "foo"
Model._defaults = {'name': Model.default_name}
record = Model()
record.dependant()
self.assertEqual(record.name, "foo")
def test_set_depends(self):
'Test depends are not modified if set'
class Model(object):
@fields.depends('name')
def dependant(self):
pass
record = Model()
record.name = "Name"
record.dependant()
self.assertEqual(record.name, "Name")
def test_parent(self):
'Test _parent_ depends are set'
class Model(object):
@fields.depends('_parent_parent.name',
'_parent_parent.description')
def dependant(self):
pass
parent = Model()
parent.description = "Description"
record = Model()
record.parent = parent
record.dependant()
self.assertIsNone(record.parent.name)
self.assertEqual(record.parent.description, "Description")
def test_nested_parent(self):
'Test nested _parent_ depends are set'
class Model(object):
@fields.depends('_parent_parent.name',
'_parent_parent.description',
'_parent_parent._parent_parent.name',
'_parent_parent._parent_parent.description',)
def dependant(self):
pass
grantparent = Model()
grantparent.description = "Description"
parent = Model()
parent.parent = grantparent
record = Model()
record.parent = parent
record.dependant()
self.assertIsNone(record.parent.name)
self.assertIsNone(record.parent.description)
self.assertIsNone(record.parent.parent.name)
self.assertEqual(record.parent.parent.description, "Description")
def test_inherit(self):
"Tests inherited depends"
class Parent(ModelView):
name = fields.Char("Name")
foo = fields.Char("Foo")
@fields.depends('foo')
def on_change_name(self):
pass
class Model(Parent):
bar = fields.Char("Bar")
@fields.depends('bar')
def on_change_name(self):
super(Model, self).on_change_name()
Model.__setup__()
Model.__post_setup__()
self.assertEqual(Model.name.on_change, {'foo', 'bar'})
def test_methods(self):
"Tests depends on method"
class Model(ModelView):
name = fields.Char("Name")
foo = fields.Char("Foo")
bar = fields.Char("Bar")
@fields.depends('foo', methods=['other_method'])
def on_change_name(self):
self.other_method()
@fields.depends('bar')
def other_method(self):
pass
Model.__setup__()
Model.__post_setup__()
self.assertEqual(Model.name.on_change, {'foo', 'bar'})
def test_methods_2(self):
"Tests depends on method on method"
class Model(ModelView):
name = fields.Char("Name")
foo = fields.Char("Foo")
bar = fields.Char("Bar")
@fields.depends('foo', methods=['other_method'])
def on_change_name(self):
self.other_method()
@fields.depends(methods=['another_method'])
def other_method(self):
self.another_method()
@fields.depends('bar')
def another_method(self):
pass
Model.__setup__()
Model.__post_setup__()
self.assertEqual(Model.name.on_change, {'foo', 'bar'})
@with_transaction()
def test_field_context(self):
"Tests depends on field with context"
class Model(ModelView):
name = fields.Char("Name")
foo = fields.Char(
"Foo", context={'bar': Eval('bar')}, depends=['bar'])
bar = fields.Char("Bar")
@fields.depends('foo')
def on_change_name(self):
return
Model.__setup__()
Model.__post_setup__()
self.assertEqual(
set(Model.name.definition(Model, 'en')['on_change']),
{'foo', 'bar', 'id'})
@with_transaction()
def test_field_context_parent(self):
"Tests depends on parent field with context"
class Target(ModelView):
name = fields.Char(
"Name", context={'bar': Eval('bar')}, depends=['bar'])
bar = fields.Char("Bar")
class Model(ModelView):
name = fields.Char("Name")
foo = fields.Many2One(None, "Foo")
@fields.depends('_parent_foo.name')
def on_change_name(self):
return
Model.foo.get_target = lambda: Target
Target.__setup__()
Target.__post_setup__()
Model.__setup__()
Model.__post_setup__()
self.assertEqual(
set(Model.name.definition(Model, 'en')['on_change']),
{'_parent_foo.name', '_parent_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__()
Model.__post_setup__()
self.assertEqual(Model.bar.on_change, {'foo', 'bar'})
def test_get_eval_fields(self):
"Test get_eval_fields"
for value, result in [
('test', set()),
(Eval('foo'), {'foo'}),
(Eval('_parent_foo'), {'foo'}),
(Eval('foo.bar'), {'foo'}),
([Eval('foo'), Eval('bar')], {'foo', 'bar'}),
((Eval('foo'), Eval('bar')), {'foo', 'bar'}),
({'foo': Eval('bar')}, {'bar'}),
(If(Eval('foo'), Eval('bar'), Eval('baz')),
{'foo', 'bar', 'baz'}),
]:
with self.subTest(value=value):
self.assertEqual(fields.get_eval_fields(value), result)