feat: category filter dropdown on unmatched Odoo products panel
Filter by Odoo product category or clear filter. Backend supports both include and exclude category filtering. Loads all categories on init for the dropdown. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -21,7 +21,8 @@ class WooProductSearchController(http.Controller):
|
||||
'/woo/search/odoo_products',
|
||||
type='jsonrpc', auth='user', methods=['POST'],
|
||||
)
|
||||
def search_odoo_products(self, query='', instance_id=None, limit=20, offset=0, **kw):
|
||||
def search_odoo_products(self, query='', instance_id=None, limit=20, offset=0,
|
||||
category_id=None, exclude_category_ids=None, **kw):
|
||||
"""
|
||||
Search Odoo products by name or internal reference (SKU).
|
||||
|
||||
@@ -30,6 +31,8 @@ class WooProductSearchController(http.Controller):
|
||||
instance_id (int): woo.instance ID (used for future per-instance filtering).
|
||||
limit (int): Max results to return (default 20).
|
||||
offset (int): Offset for pagination (default 0).
|
||||
category_id (int): Filter by Odoo product category.
|
||||
exclude_category_ids (list): Exclude these category IDs.
|
||||
|
||||
Returns:
|
||||
dict with 'results' list and 'total' count
|
||||
@@ -45,6 +48,19 @@ class WooProductSearchController(http.Controller):
|
||||
('default_code', 'ilike', query),
|
||||
]
|
||||
|
||||
if category_id:
|
||||
domain.append(('categ_id', '=', int(category_id)))
|
||||
|
||||
if exclude_category_ids:
|
||||
if isinstance(exclude_category_ids, str):
|
||||
import json as _json
|
||||
try:
|
||||
exclude_category_ids = _json.loads(exclude_category_ids)
|
||||
except (ValueError, TypeError):
|
||||
exclude_category_ids = []
|
||||
if exclude_category_ids:
|
||||
domain.append(('categ_id', 'not in', [int(x) for x in exclude_category_ids]))
|
||||
|
||||
total = request.env['product.product'].search_count(domain)
|
||||
products = request.env['product.product'].search(domain, limit=limit, offset=offset)
|
||||
|
||||
@@ -56,6 +72,7 @@ class WooProductSearchController(http.Controller):
|
||||
'default_code': p.default_code or '',
|
||||
'list_price': p.list_price,
|
||||
'qty_available': p.qty_available,
|
||||
'categ_name': p.categ_id.name if p.categ_id else '',
|
||||
}
|
||||
for p in products
|
||||
],
|
||||
@@ -110,6 +127,18 @@ class WooProductSearchController(http.Controller):
|
||||
'total': total,
|
||||
}
|
||||
|
||||
@http.route(
|
||||
'/woo/search/odoo_categories',
|
||||
type='jsonrpc', auth='user', methods=['POST'],
|
||||
)
|
||||
def get_odoo_categories(self, **kw):
|
||||
"""Return all Odoo product categories for filtering."""
|
||||
categories = request.env['product.category'].search([], order='complete_name')
|
||||
return [
|
||||
{'id': c.id, 'name': c.name, 'complete_name': c.complete_name}
|
||||
for c in categories
|
||||
]
|
||||
|
||||
@http.route(
|
||||
'/woo/search/mapped',
|
||||
type='jsonrpc', auth='user', methods=['POST'],
|
||||
|
||||
Reference in New Issue
Block a user