From a924cbf98333fdd3d63d96254d189cb25cf2246a Mon Sep 17 00:00:00 2001 From: axj-odoo Date: Thu, 9 Mar 2017 18:54:21 +0530 Subject: [PATCH] [ADD] website_sale_link_tracker: Display utm statistics on website dashboard Purpose ======= Utm links are really useful for website owners but this feature is hidden in Odoo apps. There is nothing pointing to that. Specification ============= - Add new module to generate utm pie chart in website_sale dashboard to track website utm link - Add new option in website settings to install "website_links" Title: Link Tracker Subtitle: Track clicks on UTM links Tooltip: Analyze the efficiency of your marketing campaigns by using trackable UTM trackers (campaigns, medium, sources). Create trackers and follow clicks from the Promote menu of your website. Those trackers can be used in Google Analytics or in Odoo reports where you can see the opportunities and sales revenues generated thanks to your links. - Add utm chart to dashboard, using nvd3 such pie chart should be easy to implement - If no data to display > Display a default picture with "There isn't any UTM tag detected in orders". - Set a real icon to app "utm" since it shows up in homepage debug mode --- addons/sale/views/sale_views.xml | 1 + addons/sale_crm/views/sale_order_views.xml | 10 +- addons/utm/static/description/icon.png | Bin 0 -> 4180 bytes addons/utm/views/utm.xml | 2 +- addons/website/models/res_config_settings.py | 1 + .../src/less/website.backendDashboard.less | 2 +- .../views/res_config_settings_views.xml | 11 ++ .../static/src/js/website_sale_backend.js | 2 + .../static/src/xml/website_sale_dashboard.xml | 94 +++++++++--------- addons/website_sale_link_tracker/__init__.py | 5 + .../website_sale_link_tracker/__manifest__.py | 18 ++++ .../controllers/__init__.py | 4 + .../controllers/backend.py | 50 ++++++++++ .../models/__init__.py | 4 + .../models/sale_order.py | 9 ++ .../website_sale_link_tracker_chart_demo.png | Bin 0 -> 14944 bytes .../js/website_sale_dashborad_utm_chart.js | 89 +++++++++++++++++ .../src/less/website_sale_link_tracker.less | 19 ++++ .../xml/website_sale_dashboard_utm_chart.xml | 32 ++++++ .../views/assets.xml | 9 ++ .../views/sale_order_views.xml | 17 ++++ 21 files changed, 329 insertions(+), 50 deletions(-) create mode 100644 addons/utm/static/description/icon.png create mode 100644 addons/website_sale_link_tracker/__init__.py create mode 100644 addons/website_sale_link_tracker/__manifest__.py create mode 100644 addons/website_sale_link_tracker/controllers/__init__.py create mode 100644 addons/website_sale_link_tracker/controllers/backend.py create mode 100644 addons/website_sale_link_tracker/models/__init__.py create mode 100644 addons/website_sale_link_tracker/models/sale_order.py create mode 100644 addons/website_sale_link_tracker/static/src/img/website_sale_link_tracker_chart_demo.png create mode 100644 addons/website_sale_link_tracker/static/src/js/website_sale_dashborad_utm_chart.js create mode 100644 addons/website_sale_link_tracker/static/src/less/website_sale_link_tracker.less create mode 100644 addons/website_sale_link_tracker/static/src/xml/website_sale_dashboard_utm_chart.xml create mode 100644 addons/website_sale_link_tracker/views/assets.xml create mode 100644 addons/website_sale_link_tracker/views/sale_order_views.xml diff --git a/addons/sale/views/sale_views.xml b/addons/sale/views/sale_views.xml index dce70b92f63..12569477dcd 100644 --- a/addons/sale/views/sale_views.xml +++ b/addons/sale/views/sale_views.xml @@ -391,6 +391,7 @@ + diff --git a/addons/sale_crm/views/sale_order_views.xml b/addons/sale_crm/views/sale_order_views.xml index b6e40ca450f..571614e1cae 100644 --- a/addons/sale_crm/views/sale_order_views.xml +++ b/addons/sale_crm/views/sale_order_views.xml @@ -31,10 +31,14 @@ + + + + + + + - - - diff --git a/addons/utm/static/description/icon.png b/addons/utm/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..07597483d019e81121fb3e4aae9323e6b427b383 GIT binary patch literal 4180 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 eTwsvv;Qs-M^z3b7xn-UJ0000 - + diff --git a/addons/website/models/res_config_settings.py b/addons/website/models/res_config_settings.py index 8e5c61213dc..60332d9e1a4 100644 --- a/addons/website/models/res_config_settings.py +++ b/addons/website/models/res_config_settings.py @@ -27,6 +27,7 @@ class ResConfigSettings(models.TransientModel): cdn_url = fields.Char(related='website_id.cdn_url') cdn_filters = fields.Text(related='website_id.cdn_filters') module_website_version = fields.Boolean("A/B Testing") + module_website_links = fields.Boolean(string="Link Trackers") favicon = fields.Binary('Favicon', related='website_id.favicon') # Set as global config parameter since methods using it are not website-aware. To be changed diff --git a/addons/website/static/src/less/website.backendDashboard.less b/addons/website/static/src/less/website.backendDashboard.less index f920418e9fc..2fa66f00d16 100644 --- a/addons/website/static/src/less/website.backendDashboard.less +++ b/addons/website/static/src/less/website.backendDashboard.less @@ -20,7 +20,7 @@ h4 { margin: 0 0 0 8px; } - .col-md-5, .col-md-7, .col-md-12 { + .col-md-6, .col-md-12 { padding: 15px; .js_field_selection { diff --git a/addons/website/views/res_config_settings_views.xml b/addons/website/views/res_config_settings_views.xml index 8ef61e3db6c..f16592e3eb0 100644 --- a/addons/website/views/res_config_settings_views.xml +++ b/addons/website/views/res_config_settings_views.xml @@ -180,6 +180,17 @@ +
+
+ +
+
+
+
diff --git a/addons/website_sale/static/src/js/website_sale_backend.js b/addons/website_sale/static/src/js/website_sale_backend.js index 543eed147ea..677219c5ef5 100644 --- a/addons/website_sale/static/src/js/website_sale_backend.js +++ b/addons/website_sale/static/src/js/website_sale_backend.js @@ -30,4 +30,6 @@ WebsiteBackend.include({ }); }, }); +return WebsiteBackend; + }); diff --git a/addons/website_sale/static/src/xml/website_sale_dashboard.xml b/addons/website_sale/static/src/xml/website_sale_dashboard.xml index 1f155c07f5f..8aac2b4d65d 100644 --- a/addons/website_sale/static/src/xml/website_sale_dashboard.xml +++ b/addons/website_sale/static/src/xml/website_sale_dashboard.xml @@ -30,14 +30,14 @@
-
+

Sales Since Last

Sales

-
+
@@ -62,58 +62,62 @@
-

AT A GLANCE

- -