summaryrefslogtreecommitdiff
path: root/odoo/addons/test_testing_utilities/models.py
diff options
context:
space:
mode:
authorXavier Morel <xmo@odoo.com>2017-11-14 11:47:44 +0100
committerXavier Morel <xmo@odoo.com>2017-12-04 13:11:53 +0100
commit4bf97bdbe28cc3dc3456a272b0acc3741fdf6e1b (patch)
tree22b22bafa3a8c763fb30e984fdbb411968dd8c02 /odoo/addons/test_testing_utilities/models.py
parent026979c278175de4fa27fba1843b5b9320894d3e (diff)
[ADD] base: server-side formview
Useful to better test business flows & replace yaml test files: instantiating records & calling onchanges by hand is very error-prone (it's easy to miss onchanges, or to manually set fields which can't be set through the view we're interested in, ...) odoo.tests.common.Form implements the basic *creation* flow (fields_get, default_get, onchange) up to saving the record, including proper handling of the required and readonly modifiers & their domains. * edition of existing records, including filtering out unmodified fields when saving * possibly buttons * ensuring the API is convenient
Diffstat (limited to 'odoo/addons/test_testing_utilities/models.py')
-rw-r--r--odoo/addons/test_testing_utilities/models.py171
1 files changed, 171 insertions, 0 deletions
diff --git a/odoo/addons/test_testing_utilities/models.py b/odoo/addons/test_testing_utilities/models.py
new file mode 100644
index 00000000000..2bb6e5e5dd6
--- /dev/null
+++ b/odoo/addons/test_testing_utilities/models.py
@@ -0,0 +1,171 @@
+# -*- coding: utf-8 -*-
+from __future__ import division
+from odoo import api, fields, models
+
+class A(models.Model):
+ _name = 'test_testing_utilities.a'
+
+ f1 = fields.Integer(required=True)
+ f2 = fields.Integer(default=42)
+ f3 = fields.Integer()
+ f4 = fields.Integer(compute='_compute_f4')
+
+ @api.onchange('f2')
+ def _on_change_f2(self):
+ self.f3 = int(self.f2 / 2)
+
+ @api.depends('f1', 'f2')
+ def _compute_f4(self):
+ for r in self:
+ r.f4 = r.f2 / (r.f1 or 1)
+
+class B(models.Model):
+ _name = 'test_testing_utilities.readonly'
+
+ f1 = fields.Integer(default=1, readonly=True)
+ f2 = fields.Integer(compute='_compute_f2')
+
+ @api.depends('f1')
+ def _compute_f2(self):
+ for r in self:
+ r.f2 = 2 * r.f1
+
+class C(models.Model):
+ _name = 'test_testing_utilities.c'
+
+ name = fields.Char("name", required=True)
+ f2 = fields.Many2one('test_testing_utilities.m2o')
+
+ @api.onchange('f2')
+ def _on_change_f2(self):
+ self.name = self.f2.name
+
+class M2O(models.Model):
+ _name = 'test_testing_utilities.m2o'
+
+ name = fields.Char(required=True)
+
+class M2Onchange(models.Model):
+ _name = 'test_testing_utilities.d'
+
+ # used to check that defaults & onchange to m2o work
+ f = fields.Many2one(
+ 'test_testing_utilities.m2o',
+ required=True,
+ default=lambda self: self.env['test_testing_utilities.m2o'].search(
+ [], limit=1
+ )
+ )
+ f2 = fields.Char()
+
+ @api.onchange('f2')
+ def _on_change_f2(self):
+ self.f = self.env['test_testing_utilities.m2o'].search([
+ ('name', 'ilike', self.f2),
+ ], limit=1)
+
+class M2MChange(models.Model):
+ _name = 'test_testing_utilities.e'
+
+ m2m = fields.Many2many('test_testing_utilities.sub2')
+ count = fields.Integer(compute='_m2m_count')
+
+ @api.depends('m2m')
+ def _m2m_count(self):
+ for r in self:
+ r.count = len(r.m2m)
+
+class M2MSub(models.Model):
+ _name = 'test_testing_utilities.sub2'
+
+ name = fields.Char()
+
+class M2MChange2(models.Model):
+ _name = 'test_testing_utilities.f'
+
+ def _get_some(self):
+ r = self.env['test_testing_utilities.sub2'].search([], limit=2)
+ return r
+
+ m2m = fields.Many2many(
+ 'test_testing_utilities.sub2',
+ default=_get_some,
+ )
+ m2o = fields.Many2one('test_testing_utilities.sub2')
+
+ @api.onchange('m2o')
+ def _on_change_m2o(self):
+ self.m2m = self.m2m | self.m2o
+
+class M2MReadonly(models.Model):
+ _name = 'test_testing_utilities.g'
+
+ m2m = fields.Many2many('test_testing_utilities.sub3', readonly=True)
+
+class M2MSub3(models.Model):
+ _name = 'test_testing_utilities.sub3'
+
+ name = fields.Char()
+
+class O2MChange(models.Model):
+ _name = 'test_testing_utilities.parent'
+
+ value = fields.Integer(default=1)
+ v = fields.Integer()
+ subs = fields.One2many('test_testing_utilities.sub', 'parent_id')
+
+ @api.onchange('value', 'subs')
+ def _onchange_values(self):
+ self.v = self.value + sum(s.value for s in self.subs)
+
+class O2MSub(models.Model):
+ _name = 'test_testing_utilities.sub'
+
+ name = fields.Char(compute='_compute_name')
+ value = fields.Integer(default=2)
+ v = fields.Integer()
+ parent_id = fields.Many2one('test_testing_utilities.parent')
+ has_parent = fields.Boolean()
+
+ @api.onchange('value')
+ def _onchange_value(self):
+ self.v = self.value
+
+ @api.depends('v')
+ def _compute_name(self):
+ for r in self:
+ r.name = str(r.v)
+
+ @api.onchange('has_parent')
+ def _onchange_has_parent(self):
+ self.has_parent = bool(self.parent_id)
+ if self.has_parent:
+ self.value = self.parent_id.value
+
+class O2MDefault(models.Model):
+ _name = 'test_testing_utilities.default'
+
+ def _default_subs(self):
+ return [
+ (0, 0, {'v': 5})
+ ]
+ value = fields.Integer(default=1)
+ v = fields.Integer()
+ subs = fields.One2many('test_testing_utilities.sub3', 'parent_id', default=_default_subs)
+
+class O2MSub3(models.Model):
+ _name = 'test_testing_utilities.sub3'
+
+ name = fields.Char(compute='_compute_name')
+ value = fields.Integer(default=2)
+ v = fields.Integer(default=6)
+ parent_id = fields.Many2one('test_testing_utilities.default')
+
+ @api.onchange('value')
+ def _onchange_value(self):
+ self.v = self.value
+
+ @api.depends('v')
+ def _compute_name(self):
+ for r in self:
+ r.name = str(r.v)