The lang in the context can be None or False
To avoid similar error as revealed at ede29e6d, correctly retrieve the context
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
|