From de4e9ffd404b858c5ae514aeee22151f36a1bba1 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Sat, 25 Jul 2020 11:16:32 +0200 Subject: [PATCH] [IMP] server_action_navigate Co-authored-by: Holger Brunn [IMP] tests --- .../models/ir_actions_server.py | 2 +- .../models/ir_actions_server_navigate_line.py | 31 ++++++++++++----- server_action_navigate/readme/CONFIGURE.rst | 4 +-- server_action_navigate/readme/DESCRIPTION.rst | 8 ++--- server_action_navigate/tests/test_module.py | 34 +++++++++++++++++-- .../views/view_ir_actions_server.xml | 16 ++++----- 6 files changed, 68 insertions(+), 27 deletions(-) diff --git a/server_action_navigate/models/ir_actions_server.py b/server_action_navigate/models/ir_actions_server.py index 09ef4c5c..d22c1f2e 100644 --- a/server_action_navigate/models/ir_actions_server.py +++ b/server_action_navigate/models/ir_actions_server.py @@ -58,7 +58,7 @@ class IrActionsServer(models.Model): def run_action_navigate_multi(self, action, eval_context=None): IrModel = self.env['ir.model'] lines = action.navigate_line_ids - if len(lines) == 0: + if not lines: raise UserError(_( "The Action Server %s is not correctly set\n" " : No fields defined")) diff --git a/server_action_navigate/models/ir_actions_server_navigate_line.py b/server_action_navigate/models/ir_actions_server_navigate_line.py index fab53268..c56731eb 100644 --- a/server_action_navigate/models/ir_actions_server_navigate_line.py +++ b/server_action_navigate/models/ir_actions_server_navigate_line.py @@ -2,7 +2,7 @@ # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import fields, models +from odoo import api, fields, models class IrActionsServerNavigateLine(models.Model): @@ -10,14 +10,7 @@ class IrActionsServerNavigateLine(models.Model): _description = "Server Actions Navigation Lines" _order = "sequence" - sequence = fields.Integer(string="Sequence", default=9999) - - sequence2 = fields.Integer( - related='sequence', - string="Line Number", - readonly=True, - store=True, - ) + sequence = fields.Integer(string="Sequence", default=1) field_model = fields.Char( string="Model", related="field_id.relation", store=True) @@ -29,3 +22,23 @@ class IrActionsServerNavigateLine(models.Model): field_id = fields.Many2one( comodel_name="ir.model.fields", string="Field", required=True) + + # when adding a record, onchange is called for every field on the + # form, also in editable list views + @api.onchange('field_id') + def _onchange_field_id(self): + # check out the docstring of this in odoo/models.py + lines = self.action_id.resolve_2many_commands( + 'navigate_line_ids', + self.env.context.get('navigate_line_ids', []), + ) + lines = sum(map(self.new, lines), self.browse([])) + model = lines[-1:].field_id.relation or self.action_id.model_id.model + return { + 'domain': { + 'field_id': [ + ('ttype', 'in', ['many2one', 'one2many', 'many2many']), + ('model', '=', model), + ], + } + } diff --git a/server_action_navigate/readme/CONFIGURE.rst b/server_action_navigate/readme/CONFIGURE.rst index 10aa8138..2c2d0c41 100644 --- a/server_action_navigate/readme/CONFIGURE.rst +++ b/server_action_navigate/readme/CONFIGURE.rst @@ -6,7 +6,7 @@ * Set a name that will be used for the Contextual Action -* choose a model +* Choose a model * Select 'Navigate' option in the field 'Action To Do' @@ -22,6 +22,6 @@ **Extra options** -* you can define groups whose members will have access to that option. +* You can define groups whose members will have access to that option. * You can select an action that will be used to display the target field list. diff --git a/server_action_navigate/readme/DESCRIPTION.rst b/server_action_navigate/readme/DESCRIPTION.rst index 526a6a62..34943a7f 100644 --- a/server_action_navigate/readme/DESCRIPTION.rst +++ b/server_action_navigate/readme/DESCRIPTION.rst @@ -1,5 +1,5 @@ -This module provides a generic tools to have the possibility to see a list of -items associated to a given selection. +This module provides a generic tool to have the possibility to see a list of +records associated to a given selection of records. This is basically the UI version of ``recordset.mapped('field1.field2')``. -For exemple, if you use the sale module, you can configure an action to see -all the products that has been sold for a given selection of sale orders. +For example, if you use the sale module, you can configure an action to see +all the products that have been sold for a given selection of sale orders. diff --git a/server_action_navigate/tests/test_module.py b/server_action_navigate/tests/test_module.py index c1e14714..cb9257b6 100644 --- a/server_action_navigate/tests/test_module.py +++ b/server_action_navigate/tests/test_module.py @@ -4,6 +4,8 @@ from odoo.tests.common import TransactionCase +from odoo.tools.safe_eval import safe_eval + class TestModule(TransactionCase): @@ -18,5 +20,33 @@ class TestModule(TransactionCase): active_model="res.users", active_ids=self.users.ids).run() - self.assertNotEqual( - result.get("domain", False), False) + self.assertEqual(result.get("id", False), False) + + self.assertEqual( + result.get('res_model', False), 'res.partner.category') + + self.assertEqual( + safe_eval(result.get('domain', [])), + [("id", "in", self.users.mapped("partner_id.category_id").ids)] + ) + + def test_delete_last_line(self): + line_qty = len(self.action_server.navigate_line_ids) + self.action_server.delete_last_line() + self.assertEqual( + line_qty - 1, + len(self.action_server.navigate_line_ids) + ) + + def test_action_navigate_with_action(self): + self.action_server.navigate_action_id = self.env.ref( + "base.action_partner_category_form") + + result = self.action_server.with_context( + active_model="res.users", + active_ids=self.users.ids).run() + + self.assertEqual( + result.get("id", False), + self.env.ref("base.action_partner_category_form").id, + ) diff --git a/server_action_navigate/views/view_ir_actions_server.xml b/server_action_navigate/views/view_ir_actions_server.xml index a08b9afe..76114798 100644 --- a/server_action_navigate/views/view_ir_actions_server.xml +++ b/server_action_navigate/views/view_ir_actions_server.xml @@ -18,21 +18,19 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +