Now, compute's methods are executed on default, which leads to a crash when these methods try to use the actual records but there isn't one yet (e.g. at the creation of a record). - Fix the traceback raised when creating a lead because of the visitor_page_count method when self.ids is empty on default compute. - Since the default_get() and the first_onchange() are also now combined, we need to adapt the syntax of the default get for the field opportunity_ids, replacing the array of ids by the command syntax '[(6, 0, ids)]'. task-2325629 X-original-commit: acbc97bfe290ef3c7b8f7a1160266e49485099ae
74 lines
3.4 KiB
Python
74 lines
3.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models, SUPERUSER_ID
|
|
|
|
|
|
class Lead(models.Model):
|
|
_inherit = 'crm.lead'
|
|
|
|
visitor_ids = fields.Many2many('website.visitor', string="Web Visitors")
|
|
visitor_page_count = fields.Integer('# Page Views', compute="_compute_visitor_page_count")
|
|
|
|
@api.depends('visitor_ids.page_ids')
|
|
def _compute_visitor_page_count(self):
|
|
mapped_data = {}
|
|
if self.ids:
|
|
self.flush(['visitor_ids'])
|
|
sql = """ SELECT l.id as lead_id, count(*) as page_view_count
|
|
FROM crm_lead l
|
|
JOIN crm_lead_website_visitor_rel lv ON l.id = lv.crm_lead_id
|
|
JOIN website_visitor v ON v.id = lv.website_visitor_id
|
|
JOIN website_track p ON p.visitor_id = v.id
|
|
WHERE l.id in %s
|
|
GROUP BY l.id"""
|
|
self.env.cr.execute(sql, (tuple(self.ids),))
|
|
page_data = self.env.cr.dictfetchall()
|
|
mapped_data = {data['lead_id']: data['page_view_count'] for data in page_data}
|
|
for lead in self:
|
|
lead.visitor_page_count = mapped_data.get(lead.id, 0)
|
|
|
|
def action_redirect_to_page_views(self):
|
|
visitors = self.visitor_ids
|
|
action = self.env["ir.actions.actions"]._for_xml_id("website.website_visitor_page_action")
|
|
action['domain'] = [('visitor_id', 'in', visitors.ids)]
|
|
# avoid grouping if only few records
|
|
if len(visitors.website_track_ids.ids) > 15 and len(visitors.page_ids.ids) > 1:
|
|
action['context'] = {'search_default_group_by_page': '1'}
|
|
return action
|
|
|
|
def _merge_data(self, fields):
|
|
merged_data = super(Lead, self)._merge_data(fields)
|
|
# add all the visitors from all lead to merge
|
|
merged_data['visitor_ids'] = [(6, 0, self.visitor_ids.ids)]
|
|
return merged_data
|
|
|
|
def website_form_input_filter(self, request, values):
|
|
values['medium_id'] = values.get('medium_id') or \
|
|
self.default_get(['medium_id']).get('medium_id') or \
|
|
self.sudo().env.ref('utm.utm_medium_website').id
|
|
values['team_id'] = values.get('team_id') or \
|
|
request.website.crm_default_team_id.id
|
|
values['user_id'] = values.get('user_id') or \
|
|
request.website.crm_default_user_id.id
|
|
values['type'] = 'lead' if self.with_user(SUPERUSER_ID).env['res.users'].has_group('crm.group_use_lead') else 'opportunity'
|
|
return values
|
|
|
|
|
|
class Website(models.Model):
|
|
_inherit = 'website'
|
|
|
|
def _get_crm_default_team_domain(self):
|
|
if not self.env.user.has_group('crm.group_use_lead'):
|
|
return [('use_opportunities', '=', True)]
|
|
return [('use_leads', '=', True)]
|
|
|
|
crm_default_team_id = fields.Many2one(
|
|
'crm.team', string='Default Sales Teams',
|
|
default=lambda self: self.env['crm.team'].search([], limit=1),
|
|
domain=lambda self: self._get_crm_default_team_domain(),
|
|
help='Default Sales Team for new leads created through the Contact Us form.')
|
|
crm_default_user_id = fields.Many2one(
|
|
'res.users', string='Default Salesperson', domain=[('share', '=', False)],
|
|
help='Default salesperson for new leads created through the Contact Us form.')
|