Right now, when we choose to automatically enrich the leads from CRM settings, it activates a cron to periodically enrich the leads using IAP service. This commit improves the behavior by enriching the leads after the records creation using cron trigger. That way it is done nearly after creation and user gets enrich information sooner. To make it clear to users, the description for 'auto' mode is improved to 'Enrich all leads on creation'. Also, now we select 'auto' mode by default instead of 'manual', and display 'Enrich' button on form view irrespective of the selected mode (if lead meets certain conditions) unlike before. Rest of the behavior is still same as before. For example, we still have server action which can enrich the selected leads in batch, which is useful if there are existing leads before we enable 'Lead Enrichment' feature. Task-2269743 Part-of: odoo/odoo#60605
153 lines
5.7 KiB
Python
153 lines
5.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from contextlib import contextmanager
|
|
from unittest.mock import patch
|
|
|
|
from odoo import exceptions
|
|
from odoo.addons.iap.tools import iap_tools
|
|
from odoo.addons.iap.models.iap_enrich_api import IapEnrichAPI
|
|
from odoo.tests import common
|
|
|
|
|
|
class MockIAPEnrich(common.TransactionCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(MockIAPEnrich, cls).setUpClass()
|
|
cls._init_iap_mock()
|
|
|
|
@contextmanager
|
|
def mockIAPEnrichGateway(self, default_data=None, email_data=None, sim_error=None, failing_emails=None):
|
|
|
|
def _contact_iap(local_endpoint, params):
|
|
sim_result = {
|
|
'name': 'Simulator INC',
|
|
'location': 'Simulator Street',
|
|
'city': 'SimCity',
|
|
'postal_code': '9876',
|
|
'country_code': 'BE',
|
|
'clearbit_id': 'idontknow',
|
|
'phone_numbers': ['+3269001122', '+32456001122'],
|
|
'twitter': 'testtwitter',
|
|
'facebook': 'testfacebook',
|
|
}
|
|
if default_data:
|
|
sim_result.update(default_data)
|
|
# mock single sms sending
|
|
if local_endpoint == '/iap/clearbit/1/lead_enrichment_email':
|
|
result = {}
|
|
for lead_id, email in params['domains'].items():
|
|
if sim_error and sim_error == 'credit':
|
|
raise iap_tools.InsufficientCreditError('InsufficientCreditError')
|
|
elif sim_error and sim_error == 'jsonrpc_exception':
|
|
raise exceptions.AccessError(
|
|
'The url that this service requested returned an error. Please contact the author of the app. The url it tried to contact was ' + local_endpoint
|
|
)
|
|
result[str(lead_id)] = dict(sim_result)
|
|
if email_data and email_data.get(email):
|
|
result[str(lead_id)].update(email_data[email])
|
|
return result
|
|
|
|
try:
|
|
with patch.object(IapEnrichAPI, '_contact_iap', side_effect=_contact_iap) as contact_iap_mock:
|
|
yield
|
|
finally:
|
|
pass
|
|
|
|
@classmethod
|
|
def _init_iap_mock(cls):
|
|
cls.base_de = cls.env.ref('base.de')
|
|
cls.de_state_st = cls.env['res.country.state'].create({
|
|
'name': 'DE ST State',
|
|
'code': 'st',
|
|
'country_id': cls.base_de.id
|
|
})
|
|
cls.base_be = cls.env.ref('base.be')
|
|
cls.be_state_bw = cls.env['res.country.state'].create({
|
|
'name': 'Béwééé dis',
|
|
'code': 'bw',
|
|
'country_id': cls.base_be.id
|
|
})
|
|
|
|
def _get_iap_company_data(self, base_name, service=None, add_values=None):
|
|
return {
|
|
'domain': '%s.de' % base_name,
|
|
'clearbit_id': '123_ClearbitID_%s' % base_name,
|
|
|
|
# Company Info
|
|
'name': '%s GmbH' % base_name,
|
|
'legal_name': '%s GmbH legal_name' % base_name,
|
|
'description': '%s GmbH description' % base_name,
|
|
'founded_year': '1930',
|
|
'logo': 'https://logo.clearbit.com/%slogo.com' % base_name,
|
|
'company_type': 'private',
|
|
|
|
# Contacts
|
|
'phone_numbers': ['+4930499193937', '+4930653376208'],
|
|
'email': [
|
|
'info@%s.example.com' % base_name,
|
|
'info2@%s.example.com' % base_name
|
|
],
|
|
|
|
# Timezone
|
|
'timezone': 'Europe/Berlin',
|
|
'timezone_url': 'https://time.is/Berlin',
|
|
|
|
# Social
|
|
'facebook': "%s Facebook Handle" % base_name,
|
|
'linkedin': "%s Linkedin Handle" % base_name,
|
|
'crunchbase': "organization/%s" % base_name,
|
|
|
|
# Twitter
|
|
'twitter': '%s Twitter Handle' % base_name,
|
|
'twitter_bio': '%s Twitter Bio' % base_name,
|
|
'twitter_followers': 1250,
|
|
'twitter_location': 'Berlin',
|
|
|
|
# Metrics
|
|
'estimated_annual_revenue': '1000000',
|
|
'employees': 3.14,
|
|
'market_cap': 6.28,
|
|
'raised': 15000,
|
|
'annual_revenue': 1000000,
|
|
|
|
# Category
|
|
'sector': '%s sector' % base_name,
|
|
'sector_primary': '%s sector_primary' % base_name,
|
|
'industry': '%s industry' % base_name,
|
|
'industry_group': '%s industry_group' % base_name,
|
|
'sub_industry': '%s sub_industry' % base_name,
|
|
'tag': ['Automation', 'Construction'],
|
|
'tech': ['3d_cart', 'nginx'],
|
|
|
|
# Site
|
|
'website_title': '%s Website Title' % base_name,
|
|
|
|
# GEO Data
|
|
'location': 'Mennrather Str. 123456',
|
|
'street_number': '123456',
|
|
'street_name': 'Mennrather Str.',
|
|
'sub_premise': 'sub premise',
|
|
'postal_code': '41179',
|
|
'city': 'Mönchengladbach',
|
|
'state_code': self.de_state_st.code,
|
|
'state_name': self.de_state_st.name,
|
|
'country_code': self.base_de.code,
|
|
'country_name': self.base_de.name,
|
|
}
|
|
|
|
def _get_iap_contact_data(self, base_name, service=None, add_values=None):
|
|
people_data = []
|
|
for index in range(2):
|
|
payload = {
|
|
'full_name': 'Contact %s %s' % (base_name, index),
|
|
'email': 'test.contact.%s@%s.example.com' % (index, base_name),
|
|
'phone': '+49 30 548406496',
|
|
'seniority': 'manager',
|
|
'title': 'Doing stuff',
|
|
'role': 'health_professional',
|
|
}
|
|
people_data.append(payload)
|
|
return people_data
|