diff --git a/server_action_navigate/__manifest__.py b/server_action_navigate/__manifest__.py index 12d8164b8..14a1affa8 100644 --- a/server_action_navigate/__manifest__.py +++ b/server_action_navigate/__manifest__.py @@ -12,9 +12,6 @@ "license": "AGPL-3", "depends": ["base"], "maintainers": ["legalsylvain"], - "data": [ - "security/ir.model.access.csv", - "views/view_ir_actions_server.xml", - ], + "data": ["security/ir.model.access.csv", "views/view_ir_actions_server.xml"], "demo": ["demo/ir_actions_server.xml"], } diff --git a/server_action_navigate/demo/ir_actions_server.xml b/server_action_navigate/demo/ir_actions_server.xml index f5e0ce01f..f04aecd23 100644 --- a/server_action_navigate/demo/ir_actions_server.xml +++ b/server_action_navigate/demo/ir_actions_server.xml @@ -1,32 +1,26 @@ - + - - See tags of Partners navigate - + - - + 1 - + - - + 2 - + - - + - diff --git a/server_action_navigate/models/ir_actions_server.py b/server_action_navigate/models/ir_actions_server.py index d22c1f2ec..5395cbba8 100644 --- a/server_action_navigate/models/ir_actions_server.py +++ b/server_action_navigate/models/ir_actions_server.py @@ -13,25 +13,29 @@ class IrActionsServer(models.Model): navigate_action_id = fields.Many2one( string="Navigation Action", - comodel_name='ir.actions.act_window', + comodel_name="ir.actions.act_window", domain="[('res_model', '=', max_navigate_line_model)]", help="Define here the action used when the navigation will be executed" - " if empty, a generic action will be used.") + " if empty, a generic action will be used.", + ) navigate_line_ids = fields.One2many( comodel_name="ir.actions.server.navigate.line", - string="Navigate Lines", inverse_name="action_id") + string="Navigate Lines", + inverse_name="action_id", + ) max_navigate_line_sequence = fields.Integer( - string='Max Navigate sequence in lines', - compute='_compute_max_navigate_line', - store=True + string="Max Navigate sequence in lines", + compute="_compute_max_navigate_line", + store=True, ) max_navigate_line_model = fields.Char( string="Max Navigate Model in lines", compute="_compute_max_navigate_line", - store=True) + store=True, + ) @api.depends("navigate_line_ids", "model_id") def _compute_max_navigate_line(self): @@ -43,11 +47,13 @@ class IrActionsServer(models.Model): """ for action in self: action.max_navigate_line_sequence = ( - max(action.mapped('navigate_line_ids.sequence') or [0]) + 1) - action.max_navigate_line_model =\ - action.navigate_line_ids\ - and action.navigate_line_ids[-1].field_model\ + max(action.mapped("navigate_line_ids.sequence") or [0]) + 1 + ) + action.max_navigate_line_model = ( + action.navigate_line_ids + and action.navigate_line_ids[-1].field_model or action.model_id.model + ) def delete_last_line(self): self.ensure_one() @@ -56,34 +62,34 @@ class IrActionsServer(models.Model): @api.model def run_action_navigate_multi(self, action, eval_context=None): - IrModel = self.env['ir.model'] + IrModel = self.env["ir.model"] lines = action.navigate_line_ids if not lines: - raise UserError(_( - "The Action Server %s is not correctly set\n" - " : No fields defined")) + raise UserError( + _("The Action Server %s is not correctly set\n" " : No fields defined") + ) mapped_field_value = ".".join(lines.mapped("field_id.name")) - item_ids = eval_context['records'].mapped(mapped_field_value).ids - domain = "[('id','in',[" + ','.join(map(str, item_ids)) + "])]" + item_ids = eval_context["records"].mapped(mapped_field_value).ids + domain = "[('id','in',[" + ",".join(map(str, item_ids)) + "])]" # Use Defined action if defined if action.navigate_action_id: return_action = action.navigate_action_id result = return_action.read()[0] - result['domain'] = domain + result["domain"] = domain else: # Otherwise, return a default action model_name = action.max_navigate_line_model - model = IrModel.search([('model', '=', model_name)]) - view_mode = 'tree,form' + model = IrModel.search([("model", "=", model_name)]) + view_mode = "tree,form" result = { - 'name': model.name, - 'domain': domain, - 'res_model': model_name, - 'target': 'current', - 'type': 'ir.actions.act_window', - 'view_mode': view_mode, + "name": model.name, + "domain": domain, + "res_model": model_name, + "target": "current", + "type": "ir.actions.act_window", + "view_mode": view_mode, } return result 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 c56731eb7..72e02c290 100644 --- a/server_action_navigate/models/ir_actions_server_navigate_line.py +++ b/server_action_navigate/models/ir_actions_server_navigate_line.py @@ -12,33 +12,34 @@ class IrActionsServerNavigateLine(models.Model): sequence = fields.Integer(string="Sequence", default=1) - field_model = fields.Char( - string="Model", related="field_id.relation", store=True) + field_model = fields.Char(string="Model", related="field_id.relation", store=True) action_id = fields.Many2one( - comodel_name="ir.actions.server", string="Action", - required=True, ondelete="cascade") + comodel_name="ir.actions.server", + string="Action", + required=True, + ondelete="cascade", + ) field_id = fields.Many2one( - comodel_name="ir.model.fields", string="Field", - required=True) + 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') + @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', []), + "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), + "domain": { + "field_id": [ + ("ttype", "in", ["many2one", "one2many", "many2many"]), + ("model", "=", model), ], } } diff --git a/server_action_navigate/tests/test_module.py b/server_action_navigate/tests/test_module.py index cb9257b62..aac624e46 100644 --- a/server_action_navigate/tests/test_module.py +++ b/server_action_navigate/tests/test_module.py @@ -3,50 +3,46 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo.tests.common import TransactionCase - from odoo.tools.safe_eval import safe_eval class TestModule(TransactionCase): - def setUp(self): super().setUp() self.action_server = self.env.ref( - "server_action_navigate.navigate_partner_2_tags") + "server_action_navigate.navigate_partner_2_tags" + ) self.users = self.env["res.users"].search([]) def test_action_result(self): result = self.action_server.with_context( - active_model="res.users", - active_ids=self.users.ids).run() + active_model="res.users", active_ids=self.users.ids + ).run() self.assertEqual(result.get("id", False), False) - self.assertEqual( - result.get('res_model', False), 'res.partner.category') + 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)] + 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) - ) + 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") + "base.action_partner_category_form" + ) result = self.action_server.with_context( - active_model="res.users", - active_ids=self.users.ids).run() + 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 76114798f..21f028760 100644 --- a/server_action_navigate/views/view_ir_actions_server.xml +++ b/server_action_navigate/views/view_ir_actions_server.xml @@ -1,40 +1,55 @@ - + - - ir.actions.server - - + - + - - + + -