From ee10b19f67827f9e05382ee25cd6021f68ddf10d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Hennecart?= Date: Mon, 22 Jul 2019 13:08:55 +0000 Subject: [PATCH] [REF] website_sale_slides: improve integration into eLeaning application MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PURPOSE eLearning should have its own application in manager. Indeed this is becoming a big application and having it embedded inside Website application is not enough anymore. It should also hold updated and easy-to-use menus, navigation, actions and views in backend. SPECIFICATIONS Improve course form view: add a revenue stat button displaying the total of sale order linked to the course's product. Add in slide.channel kanban card * Add "Sales 150.00$" below "Watch Time" if type "on payment". Same info than the smart/stat button on the course itself. Click on the amount sends to Reporting Revenues (same than on the stat btn) Add menu entry inside Reporting * Revenues: graph view on sale.report model showing revenues of eLearning courses. Area chart, X: month Y: €, Color: course LINKS Task 1978729 PR #35061 Co-Authored-By: Thibault Delavallée Co-Authored-By: Jérémy Hennecart --- addons/website_sale_slides/__manifest__.py | 2 + addons/website_sale_slides/models/__init__.py | 1 + .../models/product_product.py | 10 ++++ .../models/slide_channel.py | 23 +++++++- .../report/sale_report_views.xml | 23 ++++++++ .../views/slide_channel_views.xml | 57 ++++++++++++++----- .../views/website_slides_menu_views.xml | 8 +++ .../views/slide_channel_views.xml | 2 +- 8 files changed, 109 insertions(+), 17 deletions(-) create mode 100644 addons/website_sale_slides/models/product_product.py create mode 100644 addons/website_sale_slides/report/sale_report_views.xml create mode 100644 addons/website_sale_slides/views/website_slides_menu_views.xml diff --git a/addons/website_sale_slides/__manifest__.py b/addons/website_sale_slides/__manifest__.py index 91fcb574d36..caafbefba60 100644 --- a/addons/website_sale_slides/__manifest__.py +++ b/addons/website_sale_slides/__manifest__.py @@ -10,7 +10,9 @@ 'depends': ['website_slides', 'website_sale'], 'installable': True, 'data': [ + 'report/sale_report_views.xml', 'views/assets.xml', + 'views/website_slides_menu_views.xml', 'views/slide_channel_views.xml', 'views/website_slides_templates.xml', ], diff --git a/addons/website_sale_slides/models/__init__.py b/addons/website_sale_slides/models/__init__.py index 715f352d147..a7ae607df42 100644 --- a/addons/website_sale_slides/models/__init__.py +++ b/addons/website_sale_slides/models/__init__.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +from . import product_product from . import slide_channel from . import sale_order diff --git a/addons/website_sale_slides/models/product_product.py b/addons/website_sale_slides/models/product_product.py new file mode 100644 index 00000000000..94fc0c6e82b --- /dev/null +++ b/addons/website_sale_slides/models/product_product.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class Product(models.Model): + _inherit = "product.product" + + channel_ids = fields.One2many('slide.channel', 'product_id', string='Courses') diff --git a/addons/website_sale_slides/models/slide_channel.py b/addons/website_sale_slides/models/slide_channel.py index 4acdb2e1ba6..88920f58e55 100644 --- a/addons/website_sale_slides/models/slide_channel.py +++ b/addons/website_sale_slides/models/slide_channel.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import models, fields +from odoo import api, fields, models class Channel(models.Model): @@ -9,11 +9,32 @@ class Channel(models.Model): enroll = fields.Selection(selection_add=[('payment', 'On payment')]) product_id = fields.Many2one('product.product', 'Product', index=True) + product_sale_revenues = fields.Float( + string='Total revenues', compute='_compute_product_sale_revenues', + groups="sales_team.group_sale_salesman") _sql_constraints = [ ('product_id_check', "CHECK( enroll!='payment' OR product_id IS NOT NULL )", "Product is required for on payment channels.") ] + @api.depends('product_id') + def _compute_product_sale_revenues(self): + domain = [ + ('state', 'in', self.env['sale.report']._get_done_states()), + ('product_id', 'in', self.product_id.ids), + ] + rg_data = dict( + (item['product_id'][0], item['price_total']) + for item in self.env['sale.report'].read_group(domain, ['product_id', 'price_total'], ['product_id']) + ) + for channel in self: + channel.product_sale_revenues = rg_data.get(channel.product_id.id, 0) + + def action_view_sales(self): + action = self.env.ref('website_sale_slides.sale_report_action_slides').read()[0] + action['domain'] = [('product_id', 'in', self.product_id.ids)] + return action + def _filter_add_members(self, target_partners, **member_values): """ Overridden to add 'payment' channels to the filtered channels. People that can write on payment-based channels can add members. """ diff --git a/addons/website_sale_slides/report/sale_report_views.xml b/addons/website_sale_slides/report/sale_report_views.xml new file mode 100644 index 00000000000..14d3bebd3c8 --- /dev/null +++ b/addons/website_sale_slides/report/sale_report_views.xml @@ -0,0 +1,23 @@ + + + + sale.report.view.graph.slides + sale.report + + + + + + + + + + eLearning Revenues + sale.report + ir.actions.act_window + graph,pivot + [("product_id.channel_ids", "!=", False)] + {'group_by': ['confirmation_date', 'product_id']} + + + diff --git a/addons/website_sale_slides/views/slide_channel_views.xml b/addons/website_sale_slides/views/slide_channel_views.xml index f620e6e14fd..cc6945147b0 100644 --- a/addons/website_sale_slides/views/slide_channel_views.xml +++ b/addons/website_sale_slides/views/slide_channel_views.xml @@ -1,16 +1,43 @@ - - - - slide.channel.view.form.inherit.sale - slide.channel - - - - - - - - - + + + slide.channel.view.form.inherit.sale + slide.channel + + + + + + + + + + + + + slide.channel.view.kanban.inherit.sale + slide.channel + + + + + + +
+ + +
+
+ + {'invisible': [('enroll', '=', 'payment')]} + +
+
+
diff --git a/addons/website_sale_slides/views/website_slides_menu_views.xml b/addons/website_sale_slides/views/website_slides_menu_views.xml new file mode 100644 index 00000000000..cb11ed28fd0 --- /dev/null +++ b/addons/website_sale_slides/views/website_slides_menu_views.xml @@ -0,0 +1,8 @@ + + + + diff --git a/addons/website_slides/views/slide_channel_views.xml b/addons/website_slides/views/slide_channel_views.xml index 898599ede25..698dd59f0c2 100644 --- a/addons/website_slides/views/slide_channel_views.xml +++ b/addons/website_slides/views/slide_channel_views.xml @@ -276,7 +276,7 @@ -
+