# Copyright 2015-2019 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) from odoo import _, models from itertools import product class MassReconciledAdvancedRefDeepSearch(models.TransientModel): _name = 'mass.reconcile.advanced.ref.deep.search' _inherit = 'mass.reconcile.advanced.ref' @staticmethod def _compare_values(key, value, opposite_value): """Can be inherited to modify the equality condition specifically according to the matcher key (maybe using a like operator instead of equality on 'ref' as instance) """ # consider that empty vals are not valid matchers # it can still be inherited for some special cases # where it would be allowed if not (value and opposite_value): return False if value == opposite_value or \ (key == 'ref' and value in opposite_value): return True return False @staticmethod def _compare_matcher_values(key, values, opposite_values): """ Compare every values from a matcher vs an opposite matcher and return True if it matches """ for value, ovalue in product(values, opposite_values): # we do not need to compare all values, if one matches # we are done if MassReconciledAdvancedRefDeepSearch._compare_values( key, value, ovalue): return True return False @staticmethod def _compare_matchers(matcher, opposite_matcher): """ Prepare and check the matchers to compare """ mkey, mvalue = matcher omkey, omvalue = opposite_matcher assert mkey == omkey, \ (_("A matcher %s is compared with a matcher %s, the _matchers and " "_opposite_matchers are probably wrong") % (mkey, omkey)) if not isinstance(mvalue, (list, tuple)): mvalue = mvalue, if not isinstance(omvalue, (list, tuple)): omvalue = omvalue, return MassReconciledAdvancedRefDeepSearch.\ _compare_matcher_values(mkey, mvalue, omvalue)