From 1434382ece6463e5c09bd9f25e876a63eeaeaf01 Mon Sep 17 00:00:00 2001 From: "Arthur Detroux (ard)" Date: Wed, 22 Feb 2023 09:18:28 +0000 Subject: [PATCH] [REM] website_sale: remove website sale community dashboard This dashboard depends on the website dashboard which is to be re-done in OWL. Instead of keeping this dashboard as a separate component, it will be re-done in the Dashboard App (see task-3222991). task-3164163 Part-of: odoo/odoo#112819 --- addons/website_sale/__manifest__.py | 3 - addons/website_sale/controllers/__init__.py | 1 - addons/website_sale/controllers/backend.py | 181 ------------------ .../static/src/js/website_sale_backend.js | 124 ------------ .../src/scss/website_sale_dashboard.scss | 81 -------- .../static/src/xml/website_sale_dashboard.xml | 169 ---------------- 6 files changed, 559 deletions(-) delete mode 100644 addons/website_sale/controllers/backend.py delete mode 100644 addons/website_sale/static/src/js/website_sale_backend.js delete mode 100644 addons/website_sale/static/src/scss/website_sale_dashboard.scss delete mode 100644 addons/website_sale/static/src/xml/website_sale_dashboard.xml diff --git a/addons/website_sale/__manifest__.py b/addons/website_sale/__manifest__.py index 901d8975d26..bee8dc42a43 100644 --- a/addons/website_sale/__manifest__.py +++ b/addons/website_sale/__manifest__.py @@ -87,10 +87,7 @@ ], 'web.assets_backend': [ 'website_sale/static/src/js/website_sale_video_field_preview.js', - 'website_sale/static/src/js/website_sale_backend.js', - 'website_sale/static/src/scss/website_sale_dashboard.scss', 'website_sale/static/src/scss/website_sale_backend.scss', - 'website_sale/static/src/xml/website_sale_dashboard.xml', 'website_sale/static/src/js/tours/website_sale_shop.js', 'website_sale/static/src/xml/website_sale.xml', ], diff --git a/addons/website_sale/controllers/__init__.py b/addons/website_sale/controllers/__init__.py index c61d1136c3f..6c0aeba3ee7 100644 --- a/addons/website_sale/controllers/__init__.py +++ b/addons/website_sale/controllers/__init__.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from . import backend from . import delivery from . import main from . import variant diff --git a/addons/website_sale/controllers/backend.py b/addons/website_sale/controllers/backend.py deleted file mode 100644 index b5c0c1a6792..00000000000 --- a/addons/website_sale/controllers/backend.py +++ /dev/null @@ -1,181 +0,0 @@ -# -*- coding: utf-8 -*- - -import babel.dates - -from datetime import datetime, timedelta, time - -from odoo import fields, http, _ -from odoo.addons.website.controllers.backend import WebsiteBackend -from odoo.http import request -from odoo.tools.misc import get_lang - - -class WebsiteSaleBackend(WebsiteBackend): - - @http.route() - def fetch_dashboard_data(self, website_id, date_from, date_to): - Website = request.env['website'] - current_website = website_id and Website.browse(website_id) or Website.get_current_website() - - results = super(WebsiteSaleBackend, self).fetch_dashboard_data(website_id, date_from, date_to) - - date_date_from = fields.Date.from_string(date_from) - date_date_to = fields.Date.from_string(date_to) - date_diff_days = (date_date_to - date_date_from).days - datetime_from = datetime.combine(date_date_from, time.min) - datetime_to = datetime.combine(date_date_to, time.max) - - sales_values = dict( - graph=[], - best_sellers=[], - summary=dict( - order_count=0, order_carts_count=0, order_unpaid_count=0, - order_to_invoice_count=0, order_carts_abandoned_count=0, - payment_to_capture_count=0, total_sold=0, - order_per_day_ratio=0, order_sold_ratio=0, order_convertion_pctg=0, - ) - ) - - results['dashboards']['sales'] = sales_values - - results['groups']['sale_salesman'] = request.env['res.users'].has_group('sales_team.group_sale_salesman') - - if not results['groups']['sale_salesman']: - return results - - results['dashboards']['sales']['utm_graph'] = self.fetch_utm_data(datetime_from, datetime_to) - # Product-based computation - sale_report_domain = [ - ('website_id', '=', current_website.id), - ('state', '=', 'sale'), - ('date', '>=', datetime_from), - ('date', '<=', fields.Datetime.now()) - ] - report_product_lines = request.env['sale.report']._read_group( - domain=sale_report_domain, - groupby=['product_tmpl_id'], - aggregates=['product_uom_qty:sum', 'price_subtotal:sum'], order='product_uom_qty:sum desc', limit=5) - for product_tmpl, product_uom_qty_sum, price_subtotal_sum in report_product_lines: - sales_values['best_sellers'].append({ - 'id': product_tmpl.id, - 'name': product_tmpl.name, - 'qty': product_uom_qty_sum, - 'sales': price_subtotal_sum, - }) - - # Sale-based results computation - sale_order_domain = [ - ('website_id', '=', current_website.id), - ('date_order', '>=', fields.Datetime.to_string(datetime_from)), - ('date_order', '<=', fields.Datetime.to_string(datetime_to))] - so_group_data = request.env['sale.order']._read_group(sale_order_domain, groupby=['state'], aggregates=['__count']) - for state, count in so_group_data: - if state == 'sent': - sales_values['summary']['order_unpaid_count'] += count - elif state == 'sale': - sales_values['summary']['order_count'] += count - sales_values['summary']['order_carts_count'] += count - - [price_subtotal] = request.env['sale.report']._read_group( - domain=[ - ('website_id', '=', current_website.id), - ('state', '=', 'sale'), - ('date', '>=', datetime_from), - ('date', '<=', datetime_to)], - aggregates=['price_subtotal:sum'], - )[0] - sales_values['summary'].update( - order_to_invoice_count=request.env['sale.order'].search_count(sale_order_domain + [ - ('state', '=', 'sale'), - ('order_line', '!=', False), - ('partner_id', '!=', request.env.ref('base.public_partner').id), - ('invoice_status', '=', 'to invoice'), - ]), - order_carts_abandoned_count=request.env['sale.order'].search_count(sale_order_domain + [ - ('is_abandoned_cart', '=', True), - ('cart_recovery_email_sent', '=', False) - ]), - payment_to_capture_count=request.env['payment.transaction'].search_count([ - ('state', '=', 'authorized'), - # that part perform a search on sale.order in order to comply with access rights as tx do not have any - ('sale_order_ids', 'in', request.env['sale.order'].search(sale_order_domain + [('state', '!=', 'cancel')]).ids), - ]), - total_sold=price_subtotal, - ) - - # Ratio computation - sales_values['summary']['order_per_day_ratio'] = round(float(sales_values['summary']['order_count']) / date_diff_days, 2) - sales_values['summary']['order_sold_ratio'] = round(float(sales_values['summary']['total_sold']) / sales_values['summary']['order_count'], 2) if sales_values['summary']['order_count'] else 0 - sales_values['summary']['order_convertion_pctg'] = 100.0 * sales_values['summary']['order_count'] / sales_values['summary']['order_carts_count'] if sales_values['summary']['order_carts_count'] else 0 - - # Graphes computation - if date_diff_days == 7: - previous_sale_label = _('Previous Week') - elif date_diff_days > 7 and date_diff_days <= 31: - previous_sale_label = _('Previous Month') - else: - previous_sale_label = _('Previous Year') - - sales_values['graph'] += [{ - 'values': self._compute_sale_graph(date_date_from, date_date_to, sale_report_domain), - 'key': 'Untaxed Total', - }, { - 'values': self._compute_sale_graph(date_date_from - timedelta(days=date_diff_days), date_date_from, sale_report_domain, previous=True), - 'key': previous_sale_label, - }] - - return results - - def fetch_utm_data(self, date_from, date_to): - sale_utm_domain = [ - ('website_id', '!=', False), - ('state', '=', 'sale'), - ('date_order', '>=', date_from), - ('date_order', '<=', date_to) - ] - - orders_data_groupby_campaign_id = request.env['sale.order']._read_group( - domain=sale_utm_domain + [('campaign_id', '!=', False)], - groupby=['campaign_id'], - aggregates=['amount_total:sum']) - - orders_data_groupby_medium_id = request.env['sale.order']._read_group( - domain=sale_utm_domain + [('medium_id', '!=', False)], - groupby=['medium_id'], - aggregates=['amount_total:sum']) - - orders_data_groupby_source_id = request.env['sale.order']._read_group( - domain=sale_utm_domain + [('source_id', '!=', False)], - groupby=['source_id'], - aggregates=['amount_total:sum']) - - return { - 'campaign_id': self.compute_utm_graph_data(orders_data_groupby_campaign_id), - 'medium_id': self.compute_utm_graph_data(orders_data_groupby_medium_id), - 'source_id': self.compute_utm_graph_data(orders_data_groupby_source_id), - } - - def compute_utm_graph_data(self, utm_graph_data): - return [{ - 'utm_type': utm_type.display_name, - 'amount_total': amount_total, - } for utm_type, amount_total in utm_graph_data] - - def _compute_sale_graph(self, date_from, date_to, sales_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_sales = request.env['sale.report']._read_group( - domain=sales_domain, - groupby=['date:day'], - aggregates=['price_subtotal:sum']) - - daily_sales_dict = {date_day: price_subtotal_sum for date_day, price_subtotal_sum in daily_sales} - - sales_graph = [{ - '0': fields.Date.to_string(d) if not previous else fields.Date.to_string(d + timedelta(days=days_between)), - # Respect read_group format in models.py - '1': daily_sales_dict.get(d, 0), - } for d in date_list] - - return sales_graph diff --git a/addons/website_sale/static/src/js/website_sale_backend.js b/addons/website_sale/static/src/js/website_sale_backend.js deleted file mode 100644 index 2f450b8c128..00000000000 --- a/addons/website_sale/static/src/js/website_sale_backend.js +++ /dev/null @@ -1,124 +0,0 @@ -/** @odoo-module alias=website_sale.backend **/ - -import WebsiteBackend from "website.backend.dashboard"; -var COLORS = ['#875a7b', '#21b799', '#E4A900', '#D5653E', '#5B899E', '#E46F78', '#8F8F8F']; - -WebsiteBackend.include({ - jsLibs: [ - '/web/static/lib/Chart/Chart.js', - ], - - events: Object.assign(WebsiteBackend.prototype.events, { - "click tr.o_product_template": "on_product_template", - "click .js_utm_selector": "_onClickUtmButton", - }), - - init: function (parent, context) { - this._super(parent, context); - - this.graphs.push({'name': 'sales', 'group': 'sale_salesman'}); - }, - - /** - * @override method from website backendDashboard - * @private - */ - render_graphs: function() { - this._super(); - this.utmGraphData = this.dashboards_data.sales.utm_graph; - this.utmGraphData && this._renderUtmGraph(); - }, - - //-------------------------------------------------------------------------- - // Private - //-------------------------------------------------------------------------- - - /** - * Method used to generate Pie chart, depending on user selected UTM option(campaign, medium, source) - * - * @private - */ - _renderUtmGraph: function() { - var self = this; - this.$(".utm_button_name").html(this.btnName); // change drop-down button name - var utmDataType = this.utmType || 'campaign_id'; - var graphData = this.utmGraphData[utmDataType]; - if (graphData.length) { - this.$(".o_utm_no_data_img").hide(); - this.$(".o_utm_data_graph").empty().show(); - var $canvas = $(''); - this.$(".o_utm_data_graph").append($canvas); - var context = $canvas[0].getContext('2d'); - console.log(graphData); - - var data = []; - var labels = []; - graphData.forEach(function(pt) { - data.push(pt.amount_total); - labels.push(pt.utm_type); - }); - var config = { - type: 'pie', - data: { - labels: labels, - datasets: [{ - data: data, - backgroundColor: COLORS, - }] - }, - options: { - tooltips: { - callbacks: { - label: function(tooltipItem, data) { - var label = data.labels[tooltipItem.index] || ''; - if (label) { - label += ': '; - } - var amount = data.datasets[0].data[tooltipItem.index]; - amount = self.render_monetary_field(amount, self.data.currency); - label += amount; - return label; - } - } - }, - legend: {display: false} - } - }; - new Chart(context, config); - } else { - this.$(".o_utm_no_data_img").show(); - this.$(".o_utm_data_graph").hide(); - } - }, - - //-------------------------------------------------------------------------- - // Handlers - //-------------------------------------------------------------------------- - - /** - * Onchange on UTM dropdown button, this method is called. - * - * @private - */ - _onClickUtmButton: function(ev) { - this.utmType = $(ev.currentTarget).attr('name'); - this.btnName = $(ev.currentTarget).text(); - this._renderUtmGraph(); - }, - - on_product_template: function (ev) { - ev.preventDefault(); - - var product_tmpl_id = $(ev.currentTarget).data('productId'); - this.do_action({ - type: 'ir.actions.act_window', - res_model: 'product.template', - res_id: product_tmpl_id, - views: [[false, 'form']], - target: 'current', - }, { - on_reverse_breadcrumb: this.on_reverse_breadcrumb, - }); - }, -}); -export default WebsiteBackend; diff --git a/addons/website_sale/static/src/scss/website_sale_dashboard.scss b/addons/website_sale/static/src/scss/website_sale_dashboard.scss deleted file mode 100644 index b509f220789..00000000000 --- a/addons/website_sale/static/src/scss/website_sale_dashboard.scss +++ /dev/null @@ -1,81 +0,0 @@ -.o_dashboard_sales { - - h2 { - padding: 15px; - } - h4 { margin: 3px 0 4px 0 !important; } - .o_demo_background { - margin-top: 16px; - height: 350px; - background-size: 100% !important; - background: url("/website_sale/static/src/img/website_sale_dashboard_sales_demo.png") no-repeat; - position: relative; - opacity: 0.2; - } - .o_demo_message { - color: $o-main-color-muted; - width: 100%; - @include o-position-absolute($left: 0, $top: 12%); - display: flex; - justify-content: center; - } - .o_link_enable { - @include media-breakpoint-up(lg) { - border-right: 1px solid #ccc; - } - height: initial; - padding: 5px; - text-align: center; - overflow: hidden; - text-overflow: ellipsis; - a { - color: darken($o-brand-lightsecondary, 40%); - } - &:hover { - background-color: $o-brand-lightsecondary; - } - .o_highlight { - color: $o-brand-primary; - font-size: 20px; - font-weight: bold; - } - } - .o_link_disable { - @include media-breakpoint-up(lg) { - border-right: 1px solid #ccc; - } - height: initial; - padding: 5px; - text-align: center; - overflow: hidden; - text-overflow: ellipsis; - margin: 10px 0px; - color: darken($o-brand-lightsecondary, 40%); - .o_highlight { - font-size: 20px; - font-weight: bold; - } - } - .o_invisible_border { - border-right: 0px; - } - .o_top_margin { - margin-top: 20px; - } - .o_graph_canvas_container { - position: relative; - top: 0px; - left: 0px; - width: 100%; - height: 30em; - } - .o_dashboard_utms { - .utm_chart_image { - display: block; - margin: auto; - } - .utm_dropdown { - margin-top: -5px; - } - } -} \ No newline at end of file diff --git a/addons/website_sale/static/src/xml/website_sale_dashboard.xml b/addons/website_sale/static/src/xml/website_sale_dashboard.xml deleted file mode 100644 index 2ba2d849782..00000000000 --- a/addons/website_sale/static/src/xml/website_sale_dashboard.xml +++ /dev/null @@ -1,169 +0,0 @@ - - - - -
-
-
- Unpaid Orders -
-
-
- Orders to Invoice -
-
-
- Payments to Capture -
-
-
- Abandoned Carts -
-
-
-
- - - -
-
- -

- - Sales Since Last Week - - - Sales Since Last Month - - - Sales Since Last Year - - Sales -

-

AT A GLANCE

-
-
-
-
- -
- - - -

Sales Since Last Week

-
- -

Sales Since Last Month

-
- -

Sales Since Last Year

-
-

Sales

-
-
-
-
-

There is no recent confirmed order.

-
-
-
-
-
- - - - -
- - - - - - - - - - - - -
-
-
-
-

Best Sellers

- - - - - - - - - - - -
ProductQuantitySold
-
-
-
-
- - - - - - -
-
-

REVENUE BY

- -
-
- There isn't any UTM tag detected in orders -
-
-
- - - - - - - - - - - - - -