From 704aaf01de21eb4cd813bb4906821d99341f3c64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Thu, 12 Jan 2023 11:36:41 +0100 Subject: [PATCH] Support None as search value of composite rec_name --- modules/account_asset/asset.py | 17 +++++++++---- modules/purchase_request/purchase_request.py | 24 ++++++++++++------- .../purchase_request_quotation/purchase.py | 17 +++++++++---- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/modules/account_asset/asset.py b/modules/account_asset/asset.py index 4af55bc931..60d209caa8 100644 --- a/modules/account_asset/asset.py +++ b/modules/account_asset/asset.py @@ -690,11 +690,18 @@ class Asset(Workflow, ModelSQL, ModelView): @classmethod def search_rec_name(cls, name, clause): - names = clause[2].split(' - ', 1) - res = [('number', clause[1], names[0])] - if len(names) != 1 and names[1]: - res.append(('product', clause[1], names[1])) - return res + domain = [] + _, operator, value = clause + if value is not None: + names = value.split(' - ', 1) + domain.append(('number', operator, value)) + if len(names) != 1 and names[1]: + domain.append(('product', operator, value)) + if operator.startswith('!') or operator.startswith('not'): + domain.insert(0, 'OR') + elif not operator.startswith('!') and not operator.startswith('not'): + domain.append(('id', '<', 0)) + return domain @classmethod def copy(cls, assets, default=None): diff --git a/modules/purchase_request/purchase_request.py b/modules/purchase_request/purchase_request.py index 462185cf7c..930164a8ae 100644 --- a/modules/purchase_request/purchase_request.py +++ b/modules/purchase_request/purchase_request.py @@ -200,14 +200,22 @@ class PurchaseRequest(ModelSQL, ModelView): @classmethod def search_rec_name(cls, name, clause): - res = [] - names = clause[2].split('@', 1) - res.append(('product.template.name', clause[1], names[0])) - if len(names) != 1 and names[1]: - res.append(('warehouse', clause[1], names[1])) - return ['OR', res, - ('description',) + tuple(clause[1:]), - ] + _, operator, value = clause + if operator.startswith('!') or operator.startswith('not'): + bool_op = 'AND' + else: + bool_op = 'OR' + domain = [bool_op] + if value is not None: + names = value.split('@', 1) + sub_domain = [('product.template.name', operator, names[0])] + if len(names) != 1 and names[1]: + sub_domain.append(('warehouse', operator, names[1])) + if bool_op == 'AND': + sub_domain.insert(0, 'OR') + domain.append(sub_domain) + domain.append(('description', *clause[1:])) + return domain @staticmethod def default_company(): diff --git a/modules/purchase_request_quotation/purchase.py b/modules/purchase_request_quotation/purchase.py index 2a44694309..b3c8fcde97 100644 --- a/modules/purchase_request_quotation/purchase.py +++ b/modules/purchase_request_quotation/purchase.py @@ -388,11 +388,18 @@ class QuotationLine(ModelSQL, ModelView): @classmethod def search_rec_name(cls, name, clause): - names = clause[2].split(' - ', 1) - res = [('quotation', clause[1], names[0])] - if len(names) != 1 and names[1]: - res.append(('supplier', clause[1], names[1])) - return res + domain = [] + _, operator, value = clause + if value is not None: + names = clause[2].split(' - ', 1) + domain.append(('quotation', operator, names[0])) + if len(names) != 1 and names[1]: + domain.append(('supplier', operator, names[1])) + if operator.startswith('!') or operator.startswith('not'): + domain.insert(0, 'OR') + elif not operator.startswith('!') and not operator.startswith('not'): + domain.append(('id', '<', 0)) + return domain @classmethod def delete(cls, quotationlines):