Skip to content

Commit

Permalink
[REF] website(_crm): separate partner assignation from composer prepa…
Browse files Browse the repository at this point in the history
…ration when contacting a visitor

Purpose of this commit is to clean mail composer calls by separating context
computation from record update. Indeed most of composer code is based on
records having a partner_id correctly set, unless some templates are used that
dynamically create the partner.

In this commit we move the partner assignation on lead and its visitor outside
of the composer context computation, to better understand what is done.

LINKS

Task ID 2056759 (remove crm.partner.binding mixin)
Task ID 2088565 (crm onchange -> compute)
Community PR odoo#43127
Enterprise PR odoo/enterprise#7322
  • Loading branch information
tde-banana-odoo committed Jan 17, 2020
1 parent 25f828b commit 0504e6a
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 33 deletions.
39 changes: 21 additions & 18 deletions addons/website/models/website_visitor.py
Expand Up @@ -125,38 +125,41 @@ def _compute_time_statistics(self):
visitor.time_since_last_action = _format_time_ago(self.env, (datetime.now() - last_connection_date))
visitor.is_connected = (datetime.now() - last_connection_date) < timedelta(minutes=5)

def _prepare_visitor_send_mail_values(self):
if self.partner_id.email:
return {
'res_model': 'res.partner',
'res_id': self.partner_id.id,
'partner_ids': [self.partner_id.id],
}
return {}
def _prepare_visitor_composer_context(self):
return {
'default_res_model': 'res.partner',
'default_res_id': self.partner_id.id,
'default_partner_ids': [self.partner_id.id],
}

def _message_composer_prepare(self):
""" Purpose of this method is to actualize visitor model prior to contacting
him. Used notably for inheritance purpose, when dealing with leads that
could update the visitor model. """
if not self.partner_id or not self.partner_id.email:
return False
return True

def action_send_mail(self):
self.ensure_one()
visitor_mail_values = self._prepare_visitor_send_mail_values()
if not visitor_mail_values:
raise UserError(_("There is no email linked this visitor."))
if not self.__message_compose_prepare():
raise UserError(_("There is no contact and/or no email linked this visitor."))
visitor_composer_ctx = self._prepare_visitor_composer_context()
compose_form = self.env.ref('mail.email_compose_message_wizard_form', False)
ctx = dict(
default_model=visitor_mail_values.get('res_model'),
default_res_id=visitor_mail_values.get('res_id'),
compose_ctx = dict(
default_use_template=False,
default_partner_ids=[(6, 0, visitor_mail_values.get('partner_ids'))],
default_composition_mode='comment',
default_reply_to=self.env.user.partner_id.email,
)
compose_ctx.update(**visitor_composer_ctx)
return {
'name': _('Compose Email'),
'name': _('Contact Visitor'),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'mail.compose.message',
'views': [(compose_form.id, 'form')],
'view_id': compose_form.id,
'target': 'new',
'context': ctx,
'context': compose_ctx,
}

def _get_visitor_from_request(self, force_create=False):
Expand Down
42 changes: 27 additions & 15 deletions addons/website_crm/models/website_visitor.py
Expand Up @@ -44,19 +44,31 @@ def _compute_email_phone(self):
visitor.email = email[:-1] if email else False
visitor.mobile = mapped_data.get(visitor.id, {}).get('mobile')

def _prepare_visitor_send_mail_values(self):
visitor_mail_values = super(WebsiteVisitor, self)._prepare_visitor_send_mail_values()
if self.lead_ids:
lead = self.lead_ids._sort_by_confidence_level(reverse=True)[0]
partner_id = self.partner_id.id
if not self.partner_id:
partner_id = lead.handle_partner_assignation(action='create')[lead.id]
if not lead.partner_id:
lead.partner_id = partner_id
def _message_composer_prepare(self):
res = super(WebsiteVisitor, self)._message_composer_prepare()
if not res 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]
partner_id = main_lead.handle_partner_assignation(action='create')[lead.id]
if not main_lead.partner_id:
main_lead.partner_id = partner_id
self.partner_id = partner_id
return {
'res_model': 'crm.lead',
'res_id': lead.id,
'partner_ids': [partner_id],
}
return visitor_mail_values
return True
return res

def _prepare_visitor_composer_context(self):
if self.lead_ids:
sorted_leads = self.lead_ids._sort_by_confidence_level(reverse=True)
partner = self.partner_id
if not partner:
lead_partners = sorted_leads.mapped('partner_id')
partner = lead_partners[0] if lead_partners else partner
if partner:
return {
'default_res_model': 'crm.lead',
'default_res_id': sorted_leads[0].id,
'default_partner_ids': partner.id,
}
return super(WebsiteVisitor, self)._prepare_visitor_send_mail_values()

0 comments on commit 0504e6a

Please sign in to comment.