# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import fields, models, api from odoo.osv import expression class WebsiteVisitor(models.Model): _inherit = 'website.visitor' lead_ids = fields.Many2many('crm.lead', string='Leads', groups="sales_team.group_sale_salesman") lead_count = fields.Integer('# Leads', compute="_compute_lead_count", groups="sales_team.group_sale_salesman") @api.depends('lead_ids') def _compute_lead_count(self): for visitor in self: visitor.lead_count = len(visitor.lead_ids) @api.depends('partner_id.email_normalized', 'partner_id.mobile', 'lead_ids.email_normalized', 'lead_ids.mobile') def _compute_email_phone(self): super(WebsiteVisitor, self)._compute_email_phone() left_visitors = self.filtered(lambda visitor: not visitor.email or not visitor.mobile) leads = left_visitors.mapped('lead_ids').sorted('create_date', reverse=True) visitor_to_lead_ids = dict((visitor.id, visitor.lead_ids.ids) for visitor in left_visitors) for visitor in left_visitors: visitor_leads = leads.filtered(lambda lead: lead.id in visitor_to_lead_ids[visitor.id]) if not visitor.email: visitor.email = next((lead.email_normalized for lead in visitor_leads if lead.email_normalized), False) if not visitor.mobile: visitor.mobile = next((lead.mobile or lead.phone for lead in visitor_leads if lead.mobile or lead.phone), False) def _check_for_message_composer(self): check = super(WebsiteVisitor, self)._check_for_message_composer() if not check and self.lead_ids: sorted_leads = self.lead_ids._sort_by_confidence_level(reverse=True) partners = sorted_leads.mapped('partner_id') if not partners: main_lead = self.lead_ids[0] main_lead._handle_partner_assignment(create_missing=True) self.partner_id = main_lead.partner_id.id return True return check def _inactive_visitors_domain(self): """ Visitors tied to leads are considered always active and should not be deleted. """ domain = super()._inactive_visitors_domain() return expression.AND([domain, [('lead_ids', '=', False)]]) def _merge_visitor(self, target): """ Link the leads to the main visitor to avoid them being lost. """ if self.lead_ids: target.write({ 'lead_ids': [(4, lead.id) for lead in self.lead_ids] }) return super()._merge_visitor(target) def _prepare_message_composer_context(self): if not self.partner_id and self.lead_ids: sorted_leads = self.lead_ids._sort_by_confidence_level(reverse=True) lead_partners = sorted_leads.mapped('partner_id') partner = lead_partners[0] if lead_partners else False if partner: return { 'default_model': 'crm.lead', 'default_res_id': sorted_leads[0].id, 'default_partner_ids': partner.ids, } return super(WebsiteVisitor, self)._prepare_message_composer_context()