Odoo18-Base/addons/partner_autocomplete/models/res_company.py

102 lines
3.7 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import logging
import threading
from odoo.addons.iap.tools import iap_tools
from odoo import api, fields, models, tools
_logger = logging.getLogger(__name__)
COMPANY_AC_TIMEOUT = 5
class ResCompany(models.Model):
_name = 'res.company'
_inherit = 'res.company'
partner_gid = fields.Integer('Company database ID', related="partner_id.partner_gid", store=True)
iap_enrich_auto_done = fields.Boolean('Enrich Done')
@api.model_create_multi
def create(self, vals_list):
res = super().create(vals_list)
if not getattr(threading.current_thread(), 'testing', False):
res.iap_enrich_auto()
return res
@api.model
def _get_view(self, view_id=None, view_type='form', **options):
arch, view = super()._get_view(view_id, view_type, **options)
if view_type == 'form':
for node in arch.xpath(
"//field[@name='name']"
"|//field[@name='vat']"
):
node.attrib['widget'] = 'field_partner_autocomplete'
return arch, view
def iap_enrich_auto(self):
""" Enrich company. This method should be called by automatic processes
and a protection is added to avoid doing enrich in a loop. """
if self.env.user._is_system():
for company in self.filtered(lambda company: not company.iap_enrich_auto_done):
company._enrich()
self.iap_enrich_auto_done = True
return True
def _enrich(self):
""" This method calls the partner autocomplete service from IAP to enrich
partner related fields of the company.
:return bool: either done, either failed """
self.ensure_one()
_logger.info("Starting enrich of company %s (%s)", self.name, self.id)
company_domain = self._get_company_domain()
if not company_domain:
return False
company_data = self.env['res.partner'].enrich_by_domain(company_domain, timeout=COMPANY_AC_TIMEOUT)
if not company_data or company_data.get("error"):
return
company_data = {field: value for field, value in company_data.items()
if field in self.partner_id._fields and value and (field == 'image_1920' or not self.partner_id[field])}
# for company: from state_id / country_id display_name like to IDs
company_data.update(self._enrich_extract_m2o_id(company_data, ['state_id', 'country_id']))
self.partner_id.write(company_data)
return True
def _enrich_extract_m2o_id(self, iap_data, m2o_fields):
""" Extract m2O ids from data (because of res.partner._format_data_company) """
extracted_data = {}
for m2o_field in m2o_fields:
relation_data = iap_data.get(m2o_field)
if relation_data and isinstance(relation_data, dict):
extracted_data[m2o_field] = relation_data.get('id', False)
return extracted_data
def _get_company_domain(self):
""" Extract the company domain to be used by IAP services.
The domain is extracted from the website or the email information.
e.g:
- www.info.proximus.be -> proximus.be
- info@proximus.be -> proximus.be """
self.ensure_one()
company_domain = tools.email_domain_extract(self.email) if self.email else False
if company_domain and company_domain not in iap_tools._MAIL_PROVIDERS:
return company_domain
company_domain = tools.url_domain_extract(self.website) if self.website else False
if not company_domain or company_domain in ['localhost', 'example.com']:
return False
return company_domain