Skip to content

Commit

Permalink
pt_multi_link: improve UX by searching templates on default_code
Browse files Browse the repository at this point in the history
  • Loading branch information
sebalix committed May 17, 2023
1 parent db2a33c commit 133aafb
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 2 deletions.
33 changes: 33 additions & 0 deletions product_template_multi_link/models/product_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

from odoo import _, api, fields, models
from odoo.exceptions import AccessError
from odoo.osv import expression


class ProductTemplate(models.Model):
Expand Down Expand Up @@ -103,3 +104,35 @@ def get_links_by_code(self, code):
return self.product_template_link_ids.filtered(
lambda r: r.type_id.code == code and r.is_link_active
)

@api.model
def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
# NOTE: Odoo limits the search on the name of templates as soon as
# the 'id' field is present in 'args' domain, and this 'id' criteria is
# set by the view on purpose to avoid a search on variants.
# Improve this search by looking also on template's default_code
# if there is only a domain on 'id'.
search_default_code = self.env.context.get("name_search_default_code")
if name and len(args or []) == 1 and args[0][0] == 'id' and search_default_code:
args = expression.AND(
[
args,
expression.OR(
[
[("default_code", operator, name)],
[(self._rec_name, operator, name)],
]
)
]
)
# Reset 'name' so base '_name_search' won't add '_rec_name'
# to 'args' (already added above).
# See 'odoo.models.BaseModel._name_search'.
name = ""
return super()._name_search(
name=name,
args=args,
operator=operator,
limit=limit,
name_get_uid=name_get_uid
)
1 change: 1 addition & 0 deletions product_template_multi_link/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from . import test_product_template_link_type
from . import test_product_template_link
from . import test_product_template_linker
from . import test_product_template
50 changes: 50 additions & 0 deletions product_template_multi_link/tests/test_product_template.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# Copyright 2023 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)

from odoo.tests.common import SavepointCase


class TestProductTemplate(SavepointCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env = cls.env(
context=dict(
cls.env.context,
tracking_disable=True,
# compatibility flag when you run tests on a db
# where `product_variant_multi_link` is installed.
_product_variant_link_bypass_check=True,
)
)
cls.product_template = cls.env["product.template"].create(
{"name": "PTL_name", "default_code": "PTL_default_code"}
)

def test_product_template_name_search_with_name(self):
# As soon as the value is matching the name of the template, it's working,
# with or without the domain on 'id'
product = self.env["product.template"].name_search("PTL_name")
self.assertTrue(product)
product = self.env["product.template"].name_search(
"PTL_name", args=[("id", "!=", 0)]
)
self.assertTrue(product)
product = self.env["product.template"].with_context(name_search_default_code=True).name_search(
"PTL_name", args=[("id", "!=", 0)]
)
self.assertTrue(product)

def test_product_template_name_search_with_default_code(self):
product = self.env["product.template"].name_search("PTL_default_code")
self.assertTrue(product)
# Searching with the default_code => the template is not found
product = self.env["product.template"].name_search(
"PTL_default_code", args=[("id", "!=", 0)]
)
self.assertFalse(product)
# Same but enable the search on default_code => the template is now found
product = self.env["product.template"].with_context(name_search_default_code=True).name_search(
"PTL_default_code", args=[("id", "!=", 0)]
)
self.assertTrue(product)
12 changes: 10 additions & 2 deletions product_template_multi_link/views/product_template_link_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,17 @@
<field name="model">product.template.link</field>
<field name="arch" type="xml">
<tree editable="top">
<field name="left_product_tmpl_id" domain="[('id', '!=', 0)]" />
<field
name="left_product_tmpl_id"
domain="[('id', '!=', 0)]"
context="{'name_search_default_code': True}"
/>
<field name="type_id" />
<field name="right_product_tmpl_id" domain="[('id', '!=', 0)]" />
<field
name="right_product_tmpl_id"
domain="[('id', '!=', 0)]"
context="{'name_search_default_code': True}"
/>
</tree>
</field>
</record>
Expand Down

0 comments on commit 133aafb

Please sign in to comment.