summaryrefslogtreecommitdiff
path: root/addons/website_crm/models
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/website_crm/models
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_crm/models')
-rw-r--r--addons/website_crm/models/__init__.py6
-rw-r--r--addons/website_crm/models/crm_lead.py73
-rw-r--r--addons/website_crm/models/res_config_settings.py20
-rw-r--r--addons/website_crm/models/website_visitor.py57
4 files changed, 156 insertions, 0 deletions
diff --git a/addons/website_crm/models/__init__.py b/addons/website_crm/models/__init__.py
new file mode 100644
index 00000000..cfa52fe0
--- /dev/null
+++ b/addons/website_crm/models/__init__.py
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import crm_lead
+from . import res_config_settings
+from . import website_visitor
diff --git a/addons/website_crm/models/crm_lead.py b/addons/website_crm/models/crm_lead.py
new file mode 100644
index 00000000..9612c999
--- /dev/null
+++ b/addons/website_crm/models/crm_lead.py
@@ -0,0 +1,73 @@
+# -*- 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.')
diff --git a/addons/website_crm/models/res_config_settings.py b/addons/website_crm/models/res_config_settings.py
new file mode 100644
index 00000000..c78d51fd
--- /dev/null
+++ b/addons/website_crm/models/res_config_settings.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from odoo import fields, models
+
+
+class ResConfigSettings(models.TransientModel):
+ _inherit = 'res.config.settings'
+
+ 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 Team', related='website_id.crm_default_team_id', readonly=False,
+ 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', related='website_id.crm_default_user_id', domain=[('share', '=', False)], readonly=False,
+ help='Default salesperson for new leads created through the Contact Us form.')
diff --git a/addons/website_crm/models/website_visitor.py b/addons/website_crm/models/website_visitor.py
new file mode 100644
index 00000000..6c996df4
--- /dev/null
+++ b/addons/website_crm/models/website_visitor.py
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import fields, models, api
+
+
+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()
+ self.flush()
+
+ 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 _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()