diff --git a/base_phone/models/phone_common.py b/base_phone/models/phone_common.py index 8e992bc..74ca385 100644 --- a/base_phone/models/phone_common.py +++ b/base_phone/models/phone_common.py @@ -50,16 +50,15 @@ class PhoneCommon(models.AbstractModel): end_number_to_match = presented_number sorted_phonemodels = self._get_phone_models() - # [('res.parter', 10), ('crm.lead', 20)] - for (obj, prio) in sorted_phonemodels: + for obj_dict in sorted_phonemodels: + obj = obj_dict['object'] pg_search_number = str('%' + end_number_to_match) _logger.debug( "Will search phone and mobile numbers in %s ending with '%s'", obj._name, end_number_to_match) domain = [] - for field in obj._fields: - if isinstance(obj._fields[field], Phone): - domain.append((field, '=like', pg_search_number)) + for field in obj_dict['fields']: + domain.append((field, '=like', pg_search_number)) if len(domain) > 1: domain = ['|'] * (len(domain) - 1) + domain _logger.debug('searching on %s with domain=%s', obj._name, domain) @@ -85,7 +84,7 @@ class PhoneCommon(models.AbstractModel): @api.model def _get_phone_models(self): - res = [] + phoneobj = [] for model_name in self.env.registry.keys(): senv = False try: @@ -95,10 +94,20 @@ class PhoneCommon(models.AbstractModel): if ( hasattr(senv, '_phone_name_sequence') and isinstance(senv._phone_name_sequence, int)): - res.append((senv, senv._phone_name_sequence)) + phoneobj.append((senv, senv._phone_name_sequence)) + + phoneobj_sorted = sorted(phoneobj, key=lambda element: element[1]) - phonemodels_sorted = sorted(res, key=lambda element: element[1]) - return phonemodels_sorted + res = [] + for (obj, prio) in phoneobj_sorted: + entry = {'object': obj, 'fields': []} + for field in obj._fields: + if isinstance(obj._fields[field], Phone): + entry['fields'].append(field) + res.append(entry) + # [{'fields': ['fax', 'phone', 'mobile'], 'object': res.partner()}, + # {'fields': ['fax', 'phone', 'mobile'], 'object': crm.lead()}] + return res @api.model def click2dial(self, erp_number): diff --git a/base_phone/wizard/reformat_all_phonenumbers.py b/base_phone/wizard/reformat_all_phonenumbers.py index 2c075db..6425f92 100644 --- a/base_phone/wizard/reformat_all_phonenumbers.py +++ b/base_phone/wizard/reformat_all_phonenumbers.py @@ -1,23 +1,6 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Base Phone module for Odoo -# Copyright (C) 2012-2015 Alexis de Lattre -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# © 2012-2016 Akretion (Alexis de Lattre ) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from openerp import models, fields, api import logging @@ -42,15 +25,15 @@ class ReformatAllPhonenumbers(models.TransientModel): self.ensure_one() logger.info('Starting to reformat all the phone numbers') phonenumbers_not_reformatted = u'' - phoneobjects = self.env['phone.common']._get_phone_fields() - for objname in phoneobjects: - fields = self.env[objname]._phone_fields - obj = self.env[objname] + phoneobjects = self.env['phone.common']._get_phone_models() + for obj_dict in phoneobjects: + fields = obj_dict['fields'] + obj = obj_dict['object'] logger.info( 'Starting to reformat phone numbers on object %s ' - '(fields = %s)', objname, fields) + '(fields = %s)', obj._name, fields) # search if this object has an 'active' field - if obj._columns.get('active') or objname == 'hr.employee': + if obj._fields.get('active') or obj._name == 'hr.employee': # hr.employee inherits from 'resource.resource' and # 'resource.resource' has an active field # As I don't know how to detect such cases, I hardcode it here @@ -61,32 +44,11 @@ class ReformatAllPhonenumbers(models.TransientModel): all_entries = obj.search(domain) for entry in all_entries: - init_entry_vals = {} + vals = {} for field in fields: - init_entry_vals[field] = entry[field] - entry_vals = init_entry_vals.copy() - # entry is _updated_ by the fonction - # _generic_reformat_phonenumbers() - try: - entry.with_context(raise_if_phone_parse_fails=True).\ - _reformat_phonenumbers_write(entry_vals) - except Exception, e: - name = entry.name_get()[0][1] - phonenumbers_not_reformatted += \ - "Problem on %s '%s'. Error message: %s\n" % ( - obj._description, name, unicode(e)) - logger.warning( - "Problem on %s '%s'. Error message: %s", - obj._description, name, unicode(e)) - continue - if any([ - init_entry_vals.get(field) != entry_vals.get(field) for - field in fields]): - logger.info( - '[%s] Reformating phone number: FROM %s TO %s', - obj._description, unicode(init_entry_vals), - unicode(entry_vals)) - entry.write(entry_vals) + vals[field] = entry[field] + if any([value for value in vals.values()]): + entry.write(vals) if not phonenumbers_not_reformatted: phonenumbers_not_reformatted = \ 'All phone numbers have been reformatted successfully.'