new module customer_product_code_search
This commit is contained in:
parent
549cbf2579
commit
25882dafab
6 changed files with 154 additions and 0 deletions
1
customer_product_code_search/__init__.py
Normal file
1
customer_product_code_search/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
from . import models
|
||||||
21
customer_product_code_search/__manifest__.py
Normal file
21
customer_product_code_search/__manifest__.py
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"name": "Customer Product Code Search",
|
||||||
|
"version": "18.0.1.0.0",
|
||||||
|
"category": "Sales",
|
||||||
|
"summary": "Enhance product search to include customer product codes",
|
||||||
|
"description": """
|
||||||
|
This module extends the product search functionality to include customer product codes
|
||||||
|
in the product name search results. This makes it easier to find products using
|
||||||
|
customer-specific product codes in any context where products are searched.
|
||||||
|
""",
|
||||||
|
"author": "Bemade",
|
||||||
|
"website": "https://www.bemade.org",
|
||||||
|
"depends": [
|
||||||
|
"product",
|
||||||
|
"customer_product_code",
|
||||||
|
],
|
||||||
|
"data": [],
|
||||||
|
"installable": True,
|
||||||
|
"auto_install": True,
|
||||||
|
"license": "Other proprietary",
|
||||||
|
}
|
||||||
1
customer_product_code_search/models/__init__.py
Normal file
1
customer_product_code_search/models/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
from . import product
|
||||||
29
customer_product_code_search/models/product.py
Normal file
29
customer_product_code_search/models/product.py
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
from odoo import api, models
|
||||||
|
from odoo.osv import expression
|
||||||
|
|
||||||
|
|
||||||
|
class ProductProduct(models.Model):
|
||||||
|
_inherit = "product.product"
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _search_display_name(self, operator, value):
|
||||||
|
domains = super()._search_display_name(operator, value)
|
||||||
|
|
||||||
|
# Base domain for customer codes
|
||||||
|
customer_code_domain = [
|
||||||
|
"|",
|
||||||
|
("product_customer_code_ids.product_code", operator, value),
|
||||||
|
("product_customer_code_ids.product_name", operator, value),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Add partner restriction if partner_id is in context
|
||||||
|
if partner_id := self.env.context.get("partner_id"):
|
||||||
|
customer_code_domain = expression.AND(
|
||||||
|
[
|
||||||
|
customer_code_domain,
|
||||||
|
[("product_customer_code_ids.partner_id", "=", partner_id)],
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
domains = expression.OR([domains, customer_code_domain])
|
||||||
|
return domains
|
||||||
1
customer_product_code_search/tests/__init__.py
Normal file
1
customer_product_code_search/tests/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
from . import test_product_search
|
||||||
101
customer_product_code_search/tests/test_product_search.py
Normal file
101
customer_product_code_search/tests/test_product_search.py
Normal file
|
|
@ -0,0 +1,101 @@
|
||||||
|
from odoo.tests import tagged
|
||||||
|
from odoo.tests.common import TransactionCase
|
||||||
|
|
||||||
|
|
||||||
|
@tagged("post_install", "-at_install")
|
||||||
|
class TestCustomerProductCodeSearch(TransactionCase):
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
super().setUpClass()
|
||||||
|
|
||||||
|
# Create test partners
|
||||||
|
cls.partner1 = cls.env["res.partner"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Partner 1",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
cls.partner2 = cls.env["res.partner"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Partner 2",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create test products
|
||||||
|
cls.product1 = cls.env["product.product"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Product 1",
|
||||||
|
"type": "consu",
|
||||||
|
"default_code": "TEST001",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
cls.product2 = cls.env["product.product"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Product 2",
|
||||||
|
"type": "consu",
|
||||||
|
"default_code": "TEST002",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create customer product codes
|
||||||
|
cls.customer_code1 = cls.env["product.customer.code"].create(
|
||||||
|
{
|
||||||
|
"product_id": cls.product1.product_tmpl_id.id,
|
||||||
|
"partner_id": cls.partner1.id,
|
||||||
|
"product_code": "CUST001",
|
||||||
|
"product_name": "Customer 1 Product Name",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
cls.customer_code2 = cls.env["product.customer.code"].create(
|
||||||
|
{
|
||||||
|
"product_id": cls.product2.product_tmpl_id.id,
|
||||||
|
"partner_id": cls.partner2.id,
|
||||||
|
"product_code": "CUST002",
|
||||||
|
"product_name": "Customer 2 Product Name",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_search_by_customer_code_with_partner(self):
|
||||||
|
"""Test searching products by customer code with partner context"""
|
||||||
|
# Search with partner1 context
|
||||||
|
products = (
|
||||||
|
self.env["product.product"]
|
||||||
|
.with_context(partner_id=self.partner1.id)
|
||||||
|
.search([("display_name", "ilike", "CUST")])
|
||||||
|
)
|
||||||
|
self.assertIn(
|
||||||
|
self.product1,
|
||||||
|
products,
|
||||||
|
"Should find product1 when searching by customer code with partner1 context",
|
||||||
|
)
|
||||||
|
self.assertNotIn(
|
||||||
|
self.product2,
|
||||||
|
products,
|
||||||
|
"Should not find product2 when searching with partner1 context",
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_search_by_customer_code_without_partner(self):
|
||||||
|
"""Test searching products by customer code without partner context"""
|
||||||
|
# Search without partner context should find both products
|
||||||
|
products = self.env["product.product"].search(
|
||||||
|
[("display_name", "ilike", "CUST")]
|
||||||
|
)
|
||||||
|
self.assertIn(
|
||||||
|
self.product1,
|
||||||
|
products,
|
||||||
|
"Should find product1 when searching by customer code without partner context",
|
||||||
|
)
|
||||||
|
self.assertIn(
|
||||||
|
self.product2,
|
||||||
|
products,
|
||||||
|
"Should find product2 when searching by customer code without partner context",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Search for specific customer code
|
||||||
|
products = self.env["product.product"].search(
|
||||||
|
[("display_name", "ilike", "CUST002")]
|
||||||
|
)
|
||||||
|
self.assertIn(
|
||||||
|
self.product2,
|
||||||
|
products,
|
||||||
|
"Should find product2 when searching by its specific customer code without partner context",
|
||||||
|
)
|
||||||
Loading…
Reference in a new issue