[IMP] server_action_navigate

Co-authored-by: Holger Brunn <mail@hunki-enterprises.com>

[IMP] tests
This commit is contained in:
Sylvain LE GAL
2020-07-25 11:16:32 +02:00
parent 1a98502fc7
commit 6803f838b6
6 changed files with 68 additions and 27 deletions

View File

@@ -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"))

View File

@@ -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),
],
}
}

View File

@@ -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.

View File

@@ -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.

View File

@@ -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,
)

View File

@@ -18,21 +18,19 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
<group>
<field name="max_navigate_line_sequence" invisible="1"/>
<field name="max_navigate_line_model" invisible="1"/>
<!-- we can check emptyness of a 2many like this since v10 i think /-->
<button name="delete_last_line" string="Delete Last Line" type="object"
attrs="{'invisible': [('max_navigate_line_sequence', '=', 1)]}"/>
<field name="navigate_line_ids" context="{'default_sequence': max_navigate_line_sequence}" nolabel="1" colspan="4">
attrs="{'invisible': [('navigate_line_ids', '=', [])]}"/>
<field name="navigate_line_ids" context="{'navigate_line_ids': navigate_line_ids}" nolabel="1" colspan="4">
<tree editable="bottom" delete="false">
<field name="sequence" invisible="1"/>
<field name="sequence2"/>
<field name="field_id" domain="[
('model', '=', parent.max_navigate_line_model),
('ttype', 'in', ['many2one', 'one2many', 'many2many']),
]"/>
<!-- the handle widget takes care of the sequence /-->
<field name="sequence" widget="handle" invisible="True" />
<field name="field_id" />
<field name="field_model"/>
</tree>
</field>
<field name="navigate_action_id"
attrs="{'invisible': [('max_navigate_line_sequence', '=', 1)]}"/>
attrs="{'invisible': [('navigate_line_ids', '=', [])]}"/>
</group>
</page>
</xpath>