Files
tryton/trytond/tests/modelview.py
T
Cédric Krier 26076d82f1 Fallback to stored values to compute changed xxx2Many
The client may not send the values for the xxx2Many if they have not been
loaded. So in order to provide proper changes to apply once the values are
loaded we must base those changes on the current data stored.

issue9719
review308391002
2020-10-21 23:27:13 +02:00

239 lines
6.5 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.model import ModelView, ModelSQL, fields
from trytond.pool import Pool
from trytond.pyson import If, Eval
class ModelViewChangedValues(ModelView):
'ModelView Changed Values'
__name__ = 'test.modelview.changed_values'
name = fields.Char('Name')
target = fields.Many2One('test.modelview.changed_values.target', 'Target')
stored_target = fields.Many2One(
'test.modelview.changed_values.stored_target', "Stored Target")
ref_target = fields.Reference('Target Reference', [
('test.modelview.changed_values.target', 'Target'),
])
targets = fields.One2Many('test.modelview.changed_values.target', 'parent',
'Targets')
m2m_targets = fields.Many2Many('test.modelview.changed_values.target',
None, None, 'Targets')
class ModelViewChangedValuesTarget(ModelView):
'ModelView Changed Values Target'
__name__ = 'test.modelview.changed_values.target'
name = fields.Char('Name')
parent = fields.Many2One('test.modelview.changed_values', 'Parent')
class ModelViewChangedValuesStoredTarget(ModelSQL):
"ModelSQL Changed Values Target"
__name__ = 'test.modelview.changed_values.stored_target'
name = fields.Char("Name")
class ModelViewStoredChangedValues(ModelSQL, ModelView):
"ModelView Stored Changed Values Stored"
__name__ = 'test.modelview.stored.changed_values'
targets = fields.One2Many(
'test.modelview.stored.changed_values.target', 'parent', "Targets")
class ModelViewStoredChangedValuesTarget(ModelSQL, ModelView):
"ModelSQL Stored Changed Values Target"
__name__ = 'test.modelview.stored.changed_values.target'
name = fields.Char("Name")
parent = fields.Many2One('test.modelview.stored.changed_values', "Parent")
class ModelViewButton(ModelView):
'ModelView Button'
__name__ = 'test.modelview.button'
value = fields.Integer("Value")
@classmethod
def __setup__(cls):
super(ModelViewButton, cls).__setup__()
cls._buttons = {
'test': {},
}
@classmethod
@ModelView.button
def test(cls, records):
cls.test_non_decorated(records)
@classmethod
def test_non_decorated(cls, records):
pass
class ModelViewButtonDepends(ModelView):
'ModelView Button Depends'
__name__ = 'test.modelview.button_depends'
value = fields.Integer("Value")
@classmethod
def __setup__(cls):
super(ModelViewButtonDepends, cls).__setup__()
cls._buttons = {
'test': {
'depends': ['value'],
},
}
@classmethod
@ModelView.button
def test(cls, records):
pass
class ModelViewButtonAction(ModelView):
'ModelView Button Action'
__name__ = 'test.modelview.button_action'
@classmethod
def __setup__(cls):
super().__setup__()
cls._buttons = {
'test': {},
}
@classmethod
@ModelView.button_action('tests.test_modelview_button_action')
def test(cls, records):
pass
@classmethod
@ModelView.button_action('tests.test_modelview_button_action')
def test_update(cls, records):
return {'url': 'http://www.tryton.org/'}
class ModelViewLink(ModelView):
"ModelView Link"
__name__ = 'test.modelview.link'
class ModelViewLinkTarget(ModelSQL):
"ModelView Link Target"
__name__ = 'test.modelview.link.target'
class ModelViewRPC(ModelView):
'ModelView RPC'
__name__ = 'test.modelview.rpc'
selection = fields.Selection([('a', 'A')], 'Selection')
computed_selection = fields.Selection(
'get_selection', 'Computed Selection')
function_selection = fields.Function(
fields.Selection('get_function_selection', 'Function Selection'),
'function_selection_getter')
reference = fields.Reference('Reference', selection=[('a', 'A')])
computed_reference = fields.Reference(
'Computed reference', selection='get_reference')
function_reference = fields.Function(
fields.Reference('Function Reference',
selection='get_function_reference'),
'function_reference_getter')
integer = fields.Integer('Integer')
float = fields.Float('Float')
char = fields.Char('Char')
@fields.depends('selection')
def on_change_with_integer(self):
pass
@fields.depends('reference')
def on_change_float(self):
pass
@fields.depends('integer')
def autocomplete_char(self):
pass
@classmethod
def get_selection(cls):
pass
@classmethod
def get_function_selection(cls):
pass
@classmethod
def get_reference(cls):
pass
@classmethod
def get_function_reference(cls):
pass
class ModelViewEmptyPage(ModelView):
'ModelView Empty Page'
__name__ = 'test.modelview.empty_page'
class ModelViewCircularDepends(ModelView):
'ModelView Circular Depends'
__name__ = 'test.modelview.circular_depends'
foo = fields.Char("Char", depends=['bar'])
bar = fields.Char("Char", depends=['foobar'])
foobar = fields.Char("Char", depends=['foo'])
class ModelViewViewAttributes(ModelView):
'ModelView View Attributes'
__name__ = 'test.modelview.view_attributes'
foo = fields.Char("Char")
@classmethod
def view_attributes(cls):
return super().view_attributes() + [
('//field[@name="foo"]',
'visual', If(Eval('foo') == 'foo', 'danger', '')),
]
class ModelViewViewAttributesDepends(ModelView):
'ModelView View Attributes Depends'
__name__ = 'test.modelview.view_attributes_depends'
foo = fields.Char("Char")
bar = fields.Char("Char")
@classmethod
def view_attributes(cls):
return super().view_attributes() + [
('//field[@name="foo"]',
'visual', If(Eval('bar') == 'foo', 'danger', ''), ['bar']),
]
def register(module):
Pool.register(
ModelViewChangedValues,
ModelViewChangedValuesTarget,
ModelViewChangedValuesStoredTarget,
ModelViewStoredChangedValues,
ModelViewStoredChangedValuesTarget,
ModelViewButton,
ModelViewButtonDepends,
ModelViewButtonAction,
ModelViewLink,
ModelViewLinkTarget,
ModelViewRPC,
ModelViewEmptyPage,
ModelViewCircularDepends,
ModelViewViewAttributes,
ModelViewViewAttributesDepends,
module=module, type_='model')