diff --git a/addons/product/product.py b/addons/product/product.py index e7f9903f79b..c599ce77b7d 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -256,8 +256,25 @@ class product_category(osv.osv): context = {} if name: # Be sure name_search is symetric to name_get - name = name.split(' / ')[-1] - ids = self.search(cr, uid, [('name', operator, name)] + args, limit=limit, context=context) + categories = name.split(' / ') + parents = list(categories) + child = parents.pop() + domain = [('name', operator, child)] + if parents: + names_ids = self.name_search(cr, uid, ' / '.join(parents), args=args, operator='ilike', context=context, limit=limit) + category_ids = [name_id[0] for name_id in names_ids] + if operator in expression.NEGATIVE_TERM_OPERATORS: + category_ids = self.search(cr, uid, [('id', 'not in', category_ids)]) + domain = expression.OR([[('parent_id', 'in', category_ids)], domain]) + else: + domain = expression.AND([[('parent_id', 'in', category_ids)], domain]) + for i in range(1, len(categories)): + domain = [[('name', operator, ' / '.join(categories[-1 - i:]))], domain] + if operator in expression.NEGATIVE_TERM_OPERATORS: + domain = expression.AND(domain) + else: + domain = expression.OR(domain) + ids = self.search(cr, uid, expression.AND([domain, args]), limit=limit, context=context) else: ids = self.search(cr, uid, args, limit=limit, context=context) return self.name_get(cr, uid, ids, context)