92 lines
3.6 KiB
Python
92 lines
3.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import babel
|
|
from datetime import datetime, timedelta
|
|
|
|
from odoo import http, _
|
|
from odoo.http import request
|
|
|
|
from odoo.addons.website.controllers.backend import WebsiteBackend
|
|
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT
|
|
|
|
|
|
class WebsiteCrmBackend(WebsiteBackend):
|
|
|
|
@http.route()
|
|
def fetch_dashboard_data(self, date_from, date_to):
|
|
|
|
results = super(WebsiteCrmBackend, self).fetch_dashboard_data(date_from, date_to)
|
|
results['groups']['sale_salesman'] = request.env['res.users'].has_group('sales_team.group_sale_salesman')
|
|
if not results['groups']['sale_salesman']:
|
|
return results
|
|
|
|
date_from = datetime.strptime(date_from, DEFAULT_SERVER_DATE_FORMAT)
|
|
date_to = datetime.strptime(date_to, DEFAULT_SERVER_DATE_FORMAT)
|
|
|
|
lead_domain = []
|
|
|
|
website_utm = request.env['ir.model.data'].xmlid_to_res_id('utm.utm_medium_website')
|
|
if website_utm:
|
|
lead_domain += [('medium_id', '=', website_utm)]
|
|
|
|
lead_ids = request.env['crm.lead'].search(
|
|
lead_domain + [
|
|
('create_date', '>=', date_from.strftime(DEFAULT_SERVER_DATE_FORMAT)),
|
|
('create_date', '<=', date_to.strftime(DEFAULT_SERVER_DATE_FORMAT))],
|
|
)
|
|
|
|
leads = [{
|
|
'create_date': datetime.strptime(lead.create_date, DEFAULT_SERVER_DATETIME_FORMAT).strftime(DEFAULT_SERVER_DATE_FORMAT),
|
|
'campaign_id': lead.campaign_id.name,
|
|
'medium_id': lead.medium_id.name,
|
|
'source_id': lead.source_id.name,
|
|
} for lead in lead_ids]
|
|
|
|
leads_graph = self._compute_lead_graph(date_from, date_to, lead_domain)
|
|
previous_leads_graph = self._compute_lead_graph(date_from - timedelta(days=(date_to - date_from).days), date_from, lead_domain, previous=True)
|
|
|
|
results['dashboards']['leads'] = {
|
|
'graph': [
|
|
{
|
|
'values': leads_graph,
|
|
'key': _('Leads'),
|
|
},
|
|
{
|
|
'values': previous_leads_graph,
|
|
'key': _('Previous Leads'),
|
|
},
|
|
],
|
|
'leads': leads,
|
|
'lead_fields': {
|
|
'create_date': _('Create Date'),
|
|
'campaign_id': _('Campaign'),
|
|
'medium_id': _('Medium'),
|
|
'source_id': _('Source'),
|
|
},
|
|
}
|
|
|
|
return results
|
|
|
|
def _compute_lead_graph(self, date_from, date_to, lead_domain, previous=False):
|
|
|
|
days_between = (date_to - date_from).days
|
|
date_list = [(date_from + timedelta(days=x)) for x in range(0, days_between + 1)]
|
|
|
|
daily_leads = request.env['crm.lead'].read_group(
|
|
domain=lead_domain + [
|
|
('create_date', '>=', date_from.strftime(DEFAULT_SERVER_DATE_FORMAT)),
|
|
('create_date', '<=', date_to.strftime(DEFAULT_SERVER_DATE_FORMAT))],
|
|
fields=['create_date'],
|
|
groupby='create_date:day')
|
|
|
|
daily_leads_dict = {l['create_date:day']: l['create_date_count'] for l in daily_leads}
|
|
|
|
leads_graph = [{
|
|
'0': d.strftime(DEFAULT_SERVER_DATE_FORMAT) if not previous else (d + timedelta(days=days_between)).strftime(DEFAULT_SERVER_DATE_FORMAT),
|
|
# Respect read_group format in models.py
|
|
'1': daily_leads_dict.get(babel.dates.format_date(d, format='dd MMM yyyy', locale=request.env.context.get('lang') or 'en_US'), 0)
|
|
} for d in date_list]
|
|
|
|
return leads_graph
|