From 5956788c3b6538c8b2a50db70af268f3c3cd9e67 Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Wed, 6 Feb 2013 08:37:14 +0100 Subject: [PATCH 1/4] [FIX] Multi-company safe partner search --- account_banking/wizard/banktools.py | 43 +++++++++++------------------ 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/account_banking/wizard/banktools.py b/account_banking/wizard/banktools.py index 80d3e83ce..360584445 100644 --- a/account_banking/wizard/banktools.py +++ b/account_banking/wizard/banktools.py @@ -121,56 +121,45 @@ def _has_attr(obj, attr): except KeyError: return False -def get_or_create_partner(pool, cursor, uid, name, address, postal_code, city, +def get_or_create_partner(pool, cr, uid, name, address, postal_code, city, country_code, log): ''' Get or create the partner belonging to the account holders name If multiple partners are found with the same name, select the first and add a warning to the import log. + + TODO: revive the search by address components other than country ''' partner_obj = pool.get('res.partner') - partner_ids = partner_obj.search(cursor, uid, [('name', 'ilike', name)]) + partner_ids = partner_obj.search(cr, uid, [('name', 'ilike', name)]) if not partner_ids: # Try brute search on address and then match reverse - address_obj = pool.get('res.partner.address') - filter = [('partner_id', '<>', None)] + filter_ = [] if country_code: country_obj = pool.get('res.country') country_ids = country_obj.search( - cursor, uid, [('code','=',country_code.upper())] + cr, uid, [('code','=',country_code.upper())] ) country_id = country_ids and country_ids[0] or False - filter.append(('country_id', '=', country_id)) - # disable for now. Apparently, address is an array of lines. - if address and False: - if len(address) >= 1: - filter.append(('street', 'ilike', address[0])) - if len(address) > 1: - filter.append(('street2', 'ilike', address[1])) - if city: - filter.append(('city', 'ilike', city)) - if postal_code: - filter.append(('zip', 'ilike', postal_code)) - address_ids = address_obj.search(cursor, uid, filter) + filter_.append(('address.country_id', '=', country_id)) + partner_search_ids = partner_obj.search( + cr, uid, filter_) key = name.lower() - - # Make sure to get a unique list - partner_ids = list(set([x.partner_id.id - for x in address_obj.browse(cursor, uid, address_ids) - # Beware for dangling addresses - if _has_attr(x.partner_id, 'name') and - x.partner_id.name.lower() in key - ])) + partners = partner_obj.read(cr, uid, partner_search_ids, ['name']) + partner_ids = [x['id'] for x in partners if ( + len(x['name']) > 3 and + x['name'].lower() in key)] + print "Found partner_ids %s" % partner_ids if not partner_ids: if (not country_code) or not country_id: - user = pool.get('res.user').browse(cursor, uid, uid) + user = pool.get('res.user').browse(cr, uid, uid) country_id = ( user.company_id.partner_id.country and user.company_id.partner_id.country.id or False ) - partner_id = partner_obj.create(cursor, uid, dict( + partner_id = partner_obj.create(cr, uid, dict( name=name, active=True, comment='Generated from Bank Statements Import', address=[(0,0,{ 'street': address and address[0] or '', From 5bde8a5bc1f87e630b9c396bdcf02447b5205d49 Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Wed, 6 Feb 2013 11:00:03 +0100 Subject: [PATCH 2/4] [FIX] Reinstate search by zip and city [RFR] Remove debug statement --- account_banking/wizard/banktools.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/account_banking/wizard/banktools.py b/account_banking/wizard/banktools.py index 360584445..d8b1818d1 100644 --- a/account_banking/wizard/banktools.py +++ b/account_banking/wizard/banktools.py @@ -129,28 +129,31 @@ def get_or_create_partner(pool, cr, uid, name, address, postal_code, city, If multiple partners are found with the same name, select the first and add a warning to the import log. - TODO: revive the search by address components other than country + TODO: revive the search by lines from the address argument ''' partner_obj = pool.get('res.partner') partner_ids = partner_obj.search(cr, uid, [('name', 'ilike', name)]) if not partner_ids: # Try brute search on address and then match reverse - filter_ = [] + criteria = [] if country_code: country_obj = pool.get('res.country') country_ids = country_obj.search( cr, uid, [('code','=',country_code.upper())] ) country_id = country_ids and country_ids[0] or False - filter_.append(('address.country_id', '=', country_id)) + criteria.append(('address.country_id', '=', country_id)) + if city: + criteria.append(('address.city', 'ilike', city)) + if postal_code: + criteria.append(('address.zip', 'ilike', postal_code)) partner_search_ids = partner_obj.search( - cr, uid, filter_) + cr, uid, criteria) key = name.lower() partners = partner_obj.read(cr, uid, partner_search_ids, ['name']) partner_ids = [x['id'] for x in partners if ( len(x['name']) > 3 and x['name'].lower() in key)] - print "Found partner_ids %s" % partner_ids if not partner_ids: if (not country_code) or not country_id: user = pool.get('res.user').browse(cr, uid, uid) From a11fa72a8788fad3f3e95f9e6f8bf7f6da6e357e Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Thu, 7 Feb 2013 10:38:41 +0100 Subject: [PATCH 3/4] [RFR] PEP8 [RFR] Refactor double check on country_id and country_code [IMP] Select longest matching partner name if multiple matches [IMP] Propagate context in get_or_create_partner --- account_banking/banking_import_transaction.py | 2 +- account_banking/wizard/banktools.py | 41 ++++++++++--------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/account_banking/banking_import_transaction.py b/account_banking/banking_import_transaction.py index 45bbaa6b0..1873f9791 100644 --- a/account_banking/banking_import_transaction.py +++ b/account_banking/banking_import_transaction.py @@ -1314,7 +1314,7 @@ class banking_import_transaction(osv.osv): transaction.remote_owner_address, transaction.remote_owner_postalcode, transaction.remote_owner_city, - country_code, results['log'] + country_code, results['log'], context=context) ) if transaction.remote_account: partner_bank_id = create_bank_account( diff --git a/account_banking/wizard/banktools.py b/account_banking/wizard/banktools.py index d8b1818d1..814c4e032 100644 --- a/account_banking/wizard/banktools.py +++ b/account_banking/wizard/banktools.py @@ -19,14 +19,11 @@ # ############################################################################## -import sys import datetime -import re from tools.translate import _ from account_banking.parsers import convert from account_banking import sepa from account_banking.struct import struct -import unicodedata __all__ = [ 'get_period', @@ -122,7 +119,7 @@ def _has_attr(obj, attr): return False def get_or_create_partner(pool, cr, uid, name, address, postal_code, city, - country_code, log): + country_code, log, context=None): ''' Get or create the partner belonging to the account holders name @@ -132,15 +129,17 @@ def get_or_create_partner(pool, cr, uid, name, address, postal_code, city, TODO: revive the search by lines from the address argument ''' partner_obj = pool.get('res.partner') - partner_ids = partner_obj.search(cr, uid, [('name', 'ilike', name)]) + partner_ids = partner_obj.search(cr, uid, [('name', 'ilike', name)], + context=context) + country_id = False if not partner_ids: # Try brute search on address and then match reverse criteria = [] if country_code: country_obj = pool.get('res.country') country_ids = country_obj.search( - cr, uid, [('code','=',country_code.upper())] - ) + cr, uid, [('code', '=', country_code.upper())], + context=context) country_id = country_ids and country_ids[0] or False criteria.append(('address.country_id', '=', country_id)) if city: @@ -148,36 +147,38 @@ def get_or_create_partner(pool, cr, uid, name, address, postal_code, city, if postal_code: criteria.append(('address.zip', 'ilike', postal_code)) partner_search_ids = partner_obj.search( - cr, uid, criteria) + cr, uid, criteria, context=context) key = name.lower() - partners = partner_obj.read(cr, uid, partner_search_ids, ['name']) - partner_ids = [x['id'] for x in partners if ( - len(x['name']) > 3 and - x['name'].lower() in key)] + partners = [] + for partner in partner_obj.read( + cr, uid, partner_search_ids, ['name'], context=context): + if (len(partner['name']) > 3 and partner['name'].lower() in key): + partners.append(partner) + partners.sort(key=lambda x: len(x['name']), reverse=True) + partner_ids = [x['id'] for x in partners] if not partner_ids: - if (not country_code) or not country_id: - user = pool.get('res.user').browse(cr, uid, uid) + if not country_id: + user = pool.get('res.user').browse(cr, uid, uid, context=context) country_id = ( user.company_id.partner_id.country and user.company_id.partner_id.country.id or False ) partner_id = partner_obj.create(cr, uid, dict( - name=name, active=True, comment='Generated from Bank Statements Import', + name=name, active=True, + comment='Generated from Bank Statements Import', address=[(0,0,{ 'street': address and address[0] or '', 'street2': len(address) > 1 and address[1] or '', 'city': city, 'zip': postal_code or '', 'country_id': country_id, - })], - )) + })]), context=context) else: if len(partner_ids) > 1: log.append( - _('More than one possible match found for partner with name %(name)s') - % {'name': name} - ) + _('More than one possible match found for partner with ' + 'name %(name)s') % {'name': name}) partner_id = partner_ids[0] return partner_id From 373007591fbfc5740b05766a793680b08868e50b Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Thu, 7 Feb 2013 10:56:06 +0100 Subject: [PATCH 4/4] [FIX] Lingering parenthesis --- account_banking/banking_import_transaction.py | 1 - 1 file changed, 1 deletion(-) diff --git a/account_banking/banking_import_transaction.py b/account_banking/banking_import_transaction.py index 1873f9791..aad6cc8a8 100644 --- a/account_banking/banking_import_transaction.py +++ b/account_banking/banking_import_transaction.py @@ -1315,7 +1315,6 @@ class banking_import_transaction(osv.osv): transaction.remote_owner_postalcode, transaction.remote_owner_city, country_code, results['log'], context=context) - ) if transaction.remote_account: partner_bank_id = create_bank_account( self.pool, cr, uid, partner_id,