From 91b62235f8e1d686e86d06d9334e83d268cf7ba3 Mon Sep 17 00:00:00 2001 From: Pierre Paridans Date: Tue, 7 Aug 2018 09:56:08 +0200 Subject: [PATCH] [IMP] base: Allow to select a record by its name on a server action line Purpose ======= When you update a record on a server action, you can modify a field value (like the partner id). It's boring to be forced to specify the id on the server action line. It would be easier to search on the record name. Specification ============= A a server action line type 'Reference'. It allows to select the partner name (Agrolait) instead of being forced to specify its id (3493). --- odoo/addons/base/models/ir_actions.py | 37 ++++++++++++++++++++- odoo/addons/base/views/ir_actions_views.xml | 5 ++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/odoo/addons/base/models/ir_actions.py b/odoo/addons/base/models/ir_actions.py index 9b856cbf9e8..89f560a52bc 100644 --- a/odoo/addons/base/models/ir_actions.py +++ b/odoo/addons/base/models/ir_actions.py @@ -583,7 +583,42 @@ class IrServerObjectLines(models.Model): "When Formula type is selected, this field may be a Python expression " " that can use the same values as for the code field on the server action.\n" "If Value type is selected, the value will be used directly without evaluation.") - type = fields.Selection([('value', 'Value'), ('equation', 'Python expression')], 'Evaluation Type', default='value', required=True, change_default=True) + type = fields.Selection([ + ('value', 'Value'), + ('reference', 'Reference'), + ('equation', 'Python expression') + ], 'Evaluation Type', default='value', required=True, change_default=True) + resource_ref = fields.Reference( + string='Record', selection='_selection_target_model', + compute='_compute_resource_ref', inverse='_set_resource_ref') + + @api.model + def _selection_target_model(self): + models = self.env['ir.model'].search([]) + return [(model.model, model.name) for model in models] + + @api.depends('col1.relation', 'value', 'type') + def _compute_resource_ref(self): + for line in self: + if line.type in ['reference', 'value'] and line.col1 and line.col1.relation: + value = line.value or '' + try: + value = int(value) + if not self.env[line.col1.relation].browse(value).exists(): + record = self.env[line.col1.relation]._search([], limit=1) + value = record[0] if record else 0 + except ValueError: + record = self.env[line.col1.relation]._search([], limit=1) + value = record[0] if record else 0 + line.resource_ref = '%s,%s' % (line.col1.relation, value) + else: + line.resource_ref = False + + @api.onchange('resource_ref') + def _set_resource_ref(self): + for line in self.filtered(lambda line: line.type == 'reference'): + if line.resource_ref: + line.value = str(line.resource_ref.id) @api.multi def eval_value(self, eval_context=None): diff --git a/odoo/addons/base/views/ir_actions_views.xml b/odoo/addons/base/views/ir_actions_views.xml index d9b768814f5..7da45aa8617 100644 --- a/odoo/addons/base/views/ir_actions_views.xml +++ b/odoo/addons/base/views/ir_actions_views.xml @@ -276,6 +276,8 @@ + + - + +