1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class CrmLeadForwardToPartner(models.TransientModel):
""" Forward info history to partners. """
_name = 'crm.lead.forward.to.partner'
_description = 'Lead forward to partner'
@api.model
def _convert_to_assignation_line(self, lead, partner):
lead_location = []
partner_location = []
if lead.country_id:
lead_location.append(lead.country_id.name)
if lead.city:
lead_location.append(lead.city)
if partner:
if partner.country_id:
partner_location.append(partner.country_id.name)
if partner.city:
partner_location.append(partner.city)
return {'lead_id': lead.id,
'lead_location': ", ".join(lead_location),
'partner_assigned_id': partner and partner.id or False,
'partner_location': ", ".join(partner_location),
'lead_link': self.get_lead_portal_url(lead),
}
@api.model
def default_get(self, fields):
res = super(CrmLeadForwardToPartner, self).default_get(fields)
active_ids = self.env.context.get('active_ids')
if 'body' in fields:
template = self.env.ref('website_crm_partner_assign.email_template_lead_forward_mail', False)
if template:
res['body'] = template.body_html
if active_ids:
default_composition_mode = self.env.context.get('default_composition_mode')
res['assignation_lines'] = []
leads = self.env['crm.lead'].browse(active_ids)
if default_composition_mode == 'mass_mail':
partner_assigned_dict = leads.search_geo_partner()
else:
partner_assigned_dict = {lead.id: lead.partner_assigned_id.id for lead in leads}
res['partner_id'] = leads[0].partner_assigned_id.id
for lead in leads:
partner_id = partner_assigned_dict.get(lead.id) or False
partner = self.env['res.partner'].browse(partner_id)
res['assignation_lines'].append((0, 0, self._convert_to_assignation_line(lead, partner)))
return res
def action_forward(self):
self.ensure_one()
template = self.env.ref('website_crm_partner_assign.email_template_lead_forward_mail', False)
if not template:
raise UserError(_('The Forward Email Template is not in the database'))
portal_group = self.env.ref('base.group_portal')
local_context = self.env.context.copy()
if not (self.forward_type == 'single'):
no_email = set()
for lead in self.assignation_lines:
if lead.partner_assigned_id and not lead.partner_assigned_id.email:
no_email.add(lead.partner_assigned_id.name)
if no_email:
raise UserError(_('Set an email address for the partner(s): %s', ", ".join(no_email)))
if self.forward_type == 'single' and not self.partner_id.email:
raise UserError(_('Set an email address for the partner %s', self.partner_id.name))
partners_leads = {}
for lead in self.assignation_lines:
partner = self.forward_type == 'single' and self.partner_id or lead.partner_assigned_id
lead_details = {
'lead_link': lead.lead_link,
'lead_id': lead.lead_id,
}
if partner:
partner_leads = partners_leads.get(partner.id)
if partner_leads:
partner_leads['leads'].append(lead_details)
else:
partners_leads[partner.id] = {'partner': partner, 'leads': [lead_details]}
for partner_id, partner_leads in partners_leads.items():
in_portal = False
if portal_group:
for contact in (partner.child_ids or partner).filtered(lambda contact: contact.user_ids):
in_portal = portal_group.id in [g.id for g in contact.user_ids[0].groups_id]
local_context['partner_id'] = partner_leads['partner']
local_context['partner_leads'] = partner_leads['leads']
local_context['partner_in_portal'] = in_portal
template.with_context(local_context).send_mail(self.id)
leads = self.env['crm.lead']
for lead_data in partner_leads['leads']:
leads |= lead_data['lead_id']
values = {'partner_assigned_id': partner_id, 'user_id': partner_leads['partner'].user_id.id}
leads.with_context(mail_auto_subscribe_no_notify=1).write(values)
self.env['crm.lead'].message_subscribe([partner_id])
return True
def get_lead_portal_url(self, lead):
return "%s/my/%s/%s" % (
lead.get_base_url(),
lead.type,
lead.id,
)
forward_type = fields.Selection([
('single', 'a single partner: manual selection of partner'),
('assigned', "several partners: automatic assignment, using GPS coordinates and partner's grades")
], 'Forward selected leads to', default=lambda self: self.env.context.get('forward_type') or 'single')
partner_id = fields.Many2one('res.partner', 'Forward Leads To')
assignation_lines = fields.One2many('crm.lead.assignation', 'forward_id', 'Partner Assignment')
body = fields.Html('Contents', help='Automatically sanitized HTML contents')
class CrmLeadAssignation(models.TransientModel):
_name = 'crm.lead.assignation'
_description = 'Lead Assignation'
forward_id = fields.Many2one('crm.lead.forward.to.partner', 'Partner Assignment')
lead_id = fields.Many2one('crm.lead', 'Lead')
lead_location = fields.Char('Lead Location')
partner_assigned_id = fields.Many2one('res.partner', 'Assigned Partner')
partner_location = fields.Char('Partner Location')
lead_link = fields.Char('Link to Lead')
@api.onchange('lead_id')
def _onchange_lead_id(self):
lead = self.lead_id
if not lead:
self.lead_location = False
else:
lead_location = []
if lead.country_id:
lead_location.append(lead.country_id.name)
if lead.city:
lead_location.append(lead.city)
self.lead_location = ", ".join(lead_location)
@api.onchange('partner_assigned_id')
def _onchange_partner_assigned_id(self):
partner = self.partner_assigned_id
if not partner:
self.lead_location = False
else:
partner_location = []
if partner.country_id:
partner_location.append(partner.country_id.name)
if partner.city:
partner_location.append(partner.city)
self.partner_location = ", ".join(partner_location)
|