From 4587e6a3965b1963920670d7cda755c7bd9d6367 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Hennecart?= <jeh@odoo.com>
Date: Mon, 22 Jul 2019 12:23:22 +0000
Subject: [PATCH] [REF] website_slides: make eLearning an application with its
 own menu structure
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

Update manifest and make website_slides an application separated from
website embedded menus.

Implement new menu structure

  * Courses
    * Courses
      List view: Course Name, # Views, # Attendees, # Ratings, Revenues,
      Reviews
    * Contents

  * Reporting
    * Courses: list view on slide.channel model, ordered by # views.
        * add a graph view (group by content)
    * Contents: graph view on slide.slide model
        Area Graph: X month
        Y measure: # Views (others measures: Attendees, ...)
        Group by: course (color)
    * Reviews: see kanban of latest reviews;
    * Quiz: list view on slide.question model.
        List view: Add # Quizz Trials, # Quizz Passed, Avg Attempts

  * Configuration
    * Settings
      * Allow Forum on Courses (installs website_slides_forum)
      * Allow Certifications (installs website_slides_survey)
      * Allow Selling Courses (installs website_sale_slides)
    * Course Tags
      * See channel.tags.group with label Course Tags, form view allow to
        configure group tags
      * https://drive.google.com/a/odoo.com/file/d/1G0g2UnG5cZG55EXQ5icbgwe7T2eSZskT/view?usp=drivesdk
      * On click: open :https://drive.google.com/a/odoo.com/file/d/1I_PW3aZAbrslXadiYqmVF-_6dGXx8knd/view?usp=drivesdk
    * Content Tags

This structure will gain new items in sub-modules, notably bridge with
form and website_sale. Those will be implemented in next commits.

LINKS

Task 1978729
PR #35061

Co-Authored-By: Thibault Delavallée <tde@odoo.com>
Co-Authored-By: Jérémy Hennecart <jeh@odoo.com>
---
 addons/website_slides/__manifest__.py         |   5 +-
 addons/website_slides/controllers/main.py     |   4 +-
 addons/website_slides/data/ir_data.xml        |  15 ---
 .../models/res_config_settings.py             |   4 +-
 .../website_slides/models/slide_question.py   |  21 ++++
 addons/website_slides/models/slide_slide.py   |   3 +-
 .../views/rating_rating_views.xml             |  60 +++++++++++
 .../views/res_config_settings_views.xml       |  61 +++++++++--
 .../views/slide_channel_tag_views.xml         |  24 ++---
 .../views/slide_channel_views.xml             |  74 +++++++++++--
 .../views/slide_question_views.xml            |  80 ++++++++++++++
 .../views/slide_slide_views.xml               |  69 +++++-------
 .../views/website_slides_menu_views.xml       | 102 +++++++++++++-----
 .../views/website_slides_templates_utils.xml  |   2 +-
 14 files changed, 397 insertions(+), 127 deletions(-)
 delete mode 100644 addons/website_slides/data/ir_data.xml
 create mode 100644 addons/website_slides/views/rating_rating_views.xml
 create mode 100644 addons/website_slides/views/slide_question_views.xml

diff --git a/addons/website_slides/__manifest__.py b/addons/website_slides/__manifest__.py
index 047c21cb97ef..5373f5bd6de9 100644
--- a/addons/website_slides/__manifest__.py
+++ b/addons/website_slides/__manifest__.py
@@ -3,7 +3,7 @@
     'name': 'eLearning',
     'version': '2.0',
     'sequence': 145,
-    'summary': 'Create online Courses',
+    'summary': 'Manage and publish an eLearning platform',
     'website': 'https://www.odoo.com/page/slides',
     'category': 'Website',
     'description': """
@@ -28,6 +28,8 @@ Featuring
         'views/assets.xml',
         'views/res_config_settings_views.xml',
         'views/res_partner_views.xml',
+        'views/rating_rating_views.xml',
+        'views/slide_question_views.xml',
         'views/slide_slide_views.xml',
         'views/slide_channel_partner_views.xml',
         'views/slide_channel_views.xml',
@@ -41,7 +43,6 @@ Featuring
         'views/website_slides_templates_profile.xml',
         'views/website_slides_templates_utils.xml',
         'wizard/slide_channel_invite_views.xml',
-        'data/ir_data.xml',
         'data/gamification_data.xml',
         'data/mail_data.xml',
         'data/slide_data.xml',
diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py
index df03b5410b7f..ca0a8d83c724 100644
--- a/addons/website_slides/controllers/main.py
+++ b/addons/website_slides/controllers/main.py
@@ -835,8 +835,8 @@ class WebsiteSlides(WebsiteProfile):
         if slide.slide_type == 'webpage':
             redirect_url += "?enable_editor=1"
         if slide.slide_type == "quiz":
-            action_id = request.env.ref('website_slides.action_slides_slides').id
-            redirect_url = '/web#id=%s&action=%s&model=slide.slide&view_type=form' % (slide.id, action_id)
+            action_id = request.env.ref('website_slides.slide_slide_action').id
+            redirect_url = '/web#id=%s&action=%s&model=slide.slide&view_type=form' %( slide.id, action_id)
         return {
             'url': redirect_url,
             'channel_type': channel.channel_type,
diff --git a/addons/website_slides/data/ir_data.xml b/addons/website_slides/data/ir_data.xml
deleted file mode 100644
index 3b298c1e27d4..000000000000
--- a/addons/website_slides/data/ir_data.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<odoo>
-    <data noupdate="1">
-        <!-- jump to Channel on installation complete -->
-        <record id="action_open_channels" model="ir.actions.act_url">
-            <field name="name">Channels</field>
-            <field name="target">self</field>
-            <field name="url" eval="'/slides'"/>
-        </record>
-        <record id="base.open_menu" model="ir.actions.todo">
-            <field name="action_id" ref="action_open_channels"/>
-            <field name="state">open</field>
-        </record>
-    </data>
-</odoo>
diff --git a/addons/website_slides/models/res_config_settings.py b/addons/website_slides/models/res_config_settings.py
index 9425ba89108a..fa9e7508afcb 100644
--- a/addons/website_slides/models/res_config_settings.py
+++ b/addons/website_slides/models/res_config_settings.py
@@ -8,4 +8,6 @@ class ResConfigSettings(models.TransientModel):
     _inherit = "res.config.settings"
 
     website_slide_google_app_key = fields.Char(related='website_id.website_slide_google_app_key', readonly=False)
-    module_website_sale_slides = fields.Boolean("Sell courses")
+    module_website_sale_slides = fields.Boolean(string="Sell courses")
+    module_website_slides_forum = fields.Boolean(string="Forum on Courses")
+    module_website_slides_survey = fields.Boolean(string="Certifications")
diff --git a/addons/website_slides/models/slide_question.py b/addons/website_slides/models/slide_question.py
index 9d4971904341..98c51585dda5 100644
--- a/addons/website_slides/models/slide_question.py
+++ b/addons/website_slides/models/slide_question.py
@@ -14,6 +14,10 @@ class SlideQuestion(models.Model):
     question = fields.Char("Question Name", required=True, translate=True)
     slide_id = fields.Many2one('slide.slide', string="Slide", required=True)
     answer_ids = fields.One2many('slide.answer', 'question_id', string="Answer")
+    # statistics
+    attempts_count = fields.Integer(compute='_compute_statistics', groups='website.group_website_publisher')
+    attempts_avg = fields.Float(compute="_compute_statistics", digits=(6, 2), groups='website.group_website_publisher')
+    done_count = fields.Integer(compute="_compute_statistics", groups='website.group_website_publisher')
 
     @api.constrains('answer_ids')
     def _check_only_one_good_answer(self):
@@ -37,6 +41,23 @@ class SlideQuestion(models.Model):
             if len(question.answer_ids) < 2:
                 raise ValidationError(_("A question must at least have two possible answers"))
 
+    @api.depends('slide_id')
+    def _compute_statistics(self):
+        slide_partners = self.env['slide.slide.partner'].sudo().search([('slide_id', 'in', self.slide_id.ids)])
+        slide_stats = dict((s.slide_id.id, dict({'attempts_count': 0, 'attempts_unique': 0, 'done_count': 0})) for s in slide_partners)
+
+        for slide_partner in slide_partners:
+            slide_stats[slide_partner.slide_id.id]['attempts_count'] += slide_partner.quiz_attempts_count
+            slide_stats[slide_partner.slide_id.id]['attempts_unique'] += 1
+            if slide_partner.completed:
+                slide_stats[slide_partner.slide_id.id]['done_count'] += 1
+
+        for question in self:
+            stats = slide_stats.get(question.slide_id.id)
+            question.attempts_count = stats.get('attempts_count', 0) if stats else 0
+            question.attempts_avg = stats.get('attempts_count', 0) / stats.get('attempts_unique', 1) if stats else 0
+            question.done_count = stats.get('done_count', 0) if stats else 0
+
 
 class SlideAnswer(models.Model):
     _name = "slide.answer"
diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py
index 6cb8083536d3..2cc0e8396169 100644
--- a/addons/website_slides/models/slide_slide.py
+++ b/addons/website_slides/models/slide_slide.py
@@ -116,12 +116,11 @@ class Slide(models.Model):
         'slide.slide.partner', string="Subscriber information", compute='_compute_user_membership_id',
         help="Subscriber information for the current logged in user")
     # Quiz related fields
-    question_ids = fields.One2many("slide.question","slide_id", string="Questions")
+    question_ids = fields.One2many("slide.question", "slide_id", string="Questions")
     quiz_first_attempt_reward = fields.Integer("First attempt reward", default=10)
     quiz_second_attempt_reward = fields.Integer("Second attempt reward", default=7)
     quiz_third_attempt_reward = fields.Integer("Third attempt reward", default=5,)
     quiz_fourth_attempt_reward = fields.Integer("Reward for every attempt after the third try", default=2)
-
     # content
     slide_type = fields.Selection([
         ('infographic', 'Infographic'),
diff --git a/addons/website_slides/views/rating_rating_views.xml b/addons/website_slides/views/rating_rating_views.xml
new file mode 100644
index 000000000000..b3128c56460e
--- /dev/null
+++ b/addons/website_slides/views/rating_rating_views.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+    <record id="rating_rating_view_search_slide_channel" model="ir.ui.view">
+        <field name="name">rating.rating.view.search.slides</field>
+        <field name="model">rating.rating</field>
+        <field name="priority">20</field>
+        <field name="inherit_id" ref="rating.rating_rating_view_search"/>
+        <field name="mode">primary</field>
+        <field name="arch" type="xml">
+            <xpath expr="//filter[@name='resource']" position="after">
+                <filter string="Course" name="groupby_course" context="{'group_by': 'res_name'}"/>
+            </xpath>
+            <xpath expr="/search" position="inside">
+                <filter string="Creation Date" name="rating_last_30_days" date="create_date" default_period="last_30_days"/>
+                <separator/>
+            </xpath>
+        </field>
+    </record>
+
+    <record id="rating_rating_view_graph_slide_channel" model="ir.ui.view">
+       <field name="name">rating.rating.graph</field>
+       <field name="model">rating.rating</field>
+       <field name="priority">20</field>
+       <field name="arch" type="xml">
+            <graph string="Rating Average" type="bar" stacked="False">
+                <field name="res_name" type="row"/>
+                <field name="rating" type="col"/>
+            </graph>
+        </field>
+    </record>
+
+    <record id="rating_rating_action_slide_channel" model="ir.actions.act_window">
+        <field name="name">Courses Rating</field>
+        <field name="res_model">rating.rating</field>
+        <field name="view_mode">kanban,tree,graph,pivot,form</field>
+        <field name="domain">[('consumed', '=', True), ('res_model', '=', 'slide.channel')]</field>
+        <field name="context">{'search_default_groupby_course': 1}</field>
+        <field name="search_view_id" ref="rating_rating_view_search_slide_channel"/>
+        <field name="help" type="html">
+            <p class="o_view_nocontent_empty_folder">
+                There is no rating for those courses at the moment
+            </p>
+        </field>
+    </record>
+
+    <record id="rating_rating_action_slide_channel_report" model="ir.actions.act_window">
+        <field name="name">Courses Rating</field>
+        <field name="res_model">rating.rating</field>
+        <field name="view_mode">graph,tree</field>
+        <field name="domain">[('consumed', '=', True), ('res_model', '=', 'slide.channel')]</field>
+        <field name="context">{}</field>
+        <field name="search_view_id" ref="rating_rating_view_search_slide_channel"/>
+        <field name="view_id" ref="rating_rating_view_graph_slide_channel"/>
+        <field name="help" type="html">
+            <p class="o_view_nocontent_empty_folder">
+                There is no rating for those courses at the moment
+            </p>
+        </field>
+    </record>
+</odoo>
diff --git a/addons/website_slides/views/res_config_settings_views.xml b/addons/website_slides/views/res_config_settings_views.xml
index cc53296289cf..6925fbc33b58 100644
--- a/addons/website_slides/views/res_config_settings_views.xml
+++ b/addons/website_slides/views/res_config_settings_views.xml
@@ -5,7 +5,7 @@
         <field name="model">res.config.settings</field>
         <field name="inherit_id" ref="website.res_config_settings_view_form"/>
         <field name="arch" type="xml">
-            <div id="google_maps_setting" position="after">
+            <xpath expr="//div[@id='google_maps_setting']" position="after">
                 <div class="col-12 col-lg-6 o_setting_box" id="slides_install_setting">
                     <div class="o_setting_right_pane">
                         <span class="o_form_label">Slides</span>
@@ -26,19 +26,58 @@
                         </div>
                     </div>
                 </div>
-                <div class="col-12 col-lg-6"></div>
-                <div class="col-12 col-lg-6 o_setting_box" id="slides_install_website_sale">
-                    <div class="o_setting_left_pane">
-                        <field name="module_website_sale_slides"/>
-                    </div>
-                    <div class="o_setting_right_pane">
-                        <label for="module_website_sale_slides"/>
-                        <div class="text-muted">
-                            Sell courses on your website
+            </xpath>
+            <xpath expr="//div[hasclass('settings')]" position="inside">
+                <div class="app_settings_block" data-string="eLearning" string="eLearning" data-key="website_slides">
+                    <h2>eLearning</h2>
+                    <div class="row mt16 o_settings_container" id="elearning_selection_settings">
+                        <div class="col-12 col-lg-6 o_setting_box" id="elearning_install_forum">
+                            <div class="o_setting_left_pane">
+                                <field name="module_website_slides_forum"/>
+                            </div>
+                            <div class="o_setting_right_pane">
+                                <label for="module_website_slides_forum"/>
+                                <div class="text-muted">
+                                    Allow Forum on Courses
+                                </div>
+                            </div>
+                        </div>
+                        <div class="col-12 col-lg-6"></div>
+                        <div class="col-12 col-lg-6 o_setting_box" id="elearning_install_certif">
+                            <div class="o_setting_left_pane">
+                                <field name="module_website_slides_survey"/>
+                            </div>
+                            <div class="o_setting_right_pane">
+                                <label for="module_website_slides_survey"/>
+                                <div class="text-muted">
+                                    Allow to take certifications
+                                </div>
+                            </div>
+                        </div>
+                        <div class="col-12 col-lg-6"></div>
+                        <div class="col-12 col-lg-6 o_setting_box" id="elearning_install_sell">
+                            <div class="o_setting_left_pane">
+                                <field name="module_website_sale_slides"/>
+                            </div>
+                            <div class="o_setting_right_pane">
+                                <label for="module_website_sale_slides"/>
+                                <div class="text-muted">
+                                    Sell courses on your website
+                                </div>
+                            </div>
                         </div>
                     </div>
                 </div>
-            </div>
+            </xpath>
         </field>
     </record>
+
+    <record id="website_slides_action_settings" model="ir.actions.act_window">
+        <field name="name">Settings</field>
+        <field name="type">ir.actions.act_window</field>
+        <field name="res_model">res.config.settings</field>
+        <field name="view_mode">form</field>
+        <field name="target">inline</field>
+        <field name="context">{'module': 'website_slides'}</field>
+    </record>
 </odoo>
diff --git a/addons/website_slides/views/slide_channel_tag_views.xml b/addons/website_slides/views/slide_channel_tag_views.xml
index ee838298a611..5607dd3d7a02 100644
--- a/addons/website_slides/views/slide_channel_tag_views.xml
+++ b/addons/website_slides/views/slide_channel_tag_views.xml
@@ -5,7 +5,7 @@
         <field name="name">slide.channel.tag.view.search</field>
         <field name="model">slide.channel.tag</field>
         <field name="arch" type="xml">
-            <search string="Channel Tags">
+            <search string="Course Tags">
                 <field name="name"/>
                 <field name="group_id"/>
             </search>
@@ -16,7 +16,7 @@
         <field name="name">slide.channel.tag.view.form</field>
         <field name="model">slide.channel.tag</field>
         <field name="arch" type="xml">
-            <form string="Channel Tag">
+            <form string="Course Tag">
                 <sheet>
                     <group>
                         <field name="name"/>
@@ -31,7 +31,7 @@
         <field name="name">slide.channel.tag.view.tree</field>
         <field name="model">slide.channel.tag</field>
         <field name="arch" type="xml">
-            <tree string="Channel Tags">
+            <tree string="Course Tags" editable="top">
                 <field name="sequence" widget="handle"/>
                 <field name="group_sequence" invisible="1"/>
                 <field name="name"/>
@@ -41,7 +41,7 @@
     </record>
 
     <record id="slide_channel_tag_action" model="ir.actions.act_window">
-        <field name="name">Channel Tags</field>
+        <field name="name">Course Tags</field>
         <field name="res_model">slide.channel.tag</field>
         <field name="view_mode">tree,form</field>
     </record>
@@ -51,7 +51,7 @@
         <field name="name">slide.channel.tag.group.view.search</field>
         <field name="model">slide.channel.tag.group</field>
         <field name="arch" type="xml">
-            <search string="Channel Tag Groups">
+            <search string="Course Tag Groups">
                 <field name="name"/>
             </search>
         </field>
@@ -61,16 +61,12 @@
         <field name="name">slide.channel.tag.group.view.form</field>
         <field name="model">slide.channel.tag.group</field>
         <field name="arch" type="xml">
-            <form string="Channel Tag Group">
+            <form string="Course Tag Group">
                 <sheet>
-                    <div class="oe_button_box" name="button_box">
-                        <button class="oe_stat_button" name="website_publish_button"
-                            type="object" icon="fa-globe">
-                            <field name="is_published" widget="website_button" help="Makes a menu entry in main navigation of Slides, allowing to filter on its tags directly from main navigation."/>
-                        </button>
-                    </div>
                     <group>
                         <field name="name"/>
+                        <field name="is_published" string="Menu entry"/>
+                        <field name="tag_ids"/>
                     </group>
                 </sheet>
             </form>
@@ -81,7 +77,7 @@
         <field name="name">slide.channel.tag.group.view.tree</field>
         <field name="model">slide.channel.tag.group</field>
         <field name="arch" type="xml">
-            <tree string="Channel Tag Groups">
+            <tree string="Course Tag Groups">
                 <field name="sequence" widget="handle"/>
                 <field name="name"/>
                 <field name="is_published" string="Menu Entry"/>
@@ -90,7 +86,7 @@
     </record>
 
     <record id="slide_channel_tag_group_action" model="ir.actions.act_window">
-        <field name="name">Channel Tag Groups</field>
+        <field name="name">Course Tags</field>
         <field name="res_model">slide.channel.tag.group</field>
         <field name="view_mode">tree,form</field>
     </record>
diff --git a/addons/website_slides/views/slide_channel_views.xml b/addons/website_slides/views/slide_channel_views.xml
index 7cdf9e63d960..edd662541e57 100644
--- a/addons/website_slides/views/slide_channel_views.xml
+++ b/addons/website_slides/views/slide_channel_views.xml
@@ -17,6 +17,20 @@
             </field>
         </record>
 
+        <record model="ir.ui.view" id="slide_category_view_from_fchannel">
+            <field name="name">slide.category.form</field>
+            <field name="model">slide.category</field>
+            <field name="arch" type="xml">
+                <form string="Category">
+                    <sheet>
+                        <group>
+                            <field name="name"/>
+                        </group>
+                    </sheet>
+                </form>
+            </field>
+        </record>
+
         <record id="view_slides_category_tree" model="ir.ui.view">
             <field name="name">slide.category.tree</field>
             <field name="model">slide.category</field>
@@ -74,7 +88,7 @@
                                 <field name="active" invisible="1"/>
                                 <field name="enroll" widget="radio" options="{'horizontal': true}"/>
                                 <field name="category_ids" widget="many2many_tags" placeholder="Categories"
-                                    context="{'default_channel_id': active_id}"
+                                    context="{'default_channel_id': active_id, 'form_view_ref': 'website_slides.slide_category_view_from_fchannel'}"
                                     domain="[('channel_id','=', active_id)]"/>
                                 <field name="tag_ids" widget="many2many_tags" placeholder="Tags"/>
                                 <field name="user_id"/>
@@ -151,22 +165,39 @@
         </record>
 
         <record id="slide_channel_view_tree" model="ir.ui.view">
-            <field name="name">slide.channel.tree</field>
+            <field name="name">slide.channel.view.tree</field>
             <field name="model">slide.channel</field>
             <field name="arch" type="xml">
-                <tree string="Channel">
+                <tree string="Courses">
                     <field name="sequence" widget="handle"/>
                     <field name="name"/>
+                    <field name="channel_type"/>
+                    <field name="visibility"/>
+                    <field name="enroll"/>
+                    <field name="user_id"/>
                     <field name="website_id" groups="website.group_multi_website"/>
                     <field name="active" invisible="1"/>
-                    <field name="enroll"/>
-                    <field name="promote_strategy"/>
+                </tree>
+            </field>
+        </record>
+
+        <record id="slide_channel_view_tree_report" model="ir.ui.view">
+            <field name="name">slide.channel.view.tree.report</field>
+            <field name="model">slide.channel</field>
+            <field name="priority">20</field>
+            <field name="arch" type="xml">
+                <tree string="Courses" create="false" default_order="total_views desc">
+                    <field name="name"/>
+                    <field name="total_views"/>
+                    <field name="members_count"/>
+                    <field name="total_votes"/>
+                    <field name="rating_avg_stars"/>
                 </tree>
             </field>
         </record>
 
         <record id="slide_channel_view_search" model="ir.ui.view">
-            <field name="name">slide.channel.search</field>
+            <field name="name">slide.channel.view.search</field>
             <field name="model">slide.channel</field>
             <field name="arch" type="xml">
                 <search string="Courses">
@@ -176,14 +207,37 @@
             </field>
         </record>
 
-        <record id="action_slide_channels" model="ir.actions.act_window">
-            <field name="name">Channels</field>
+        <record id="slide_channel_view_graph" model="ir.ui.view">
+            <field name="name">slide.channel.view.graph</field>
+            <field name="model">slide.channel</field>
+            <field name="arch" type="xml">
+                <graph string="Courses" type="bar">
+                    <field name="name"/>
+                    <field name="total_views" type="measure"/>
+                </graph>
+            </field>
+        </record>
+
+        <record id="slide_channel_action_overview" model="ir.actions.act_window">
+            <field name="name">eLearning Overview</field>
             <field name="res_model">slide.channel</field>
             <field name="view_mode">tree,form</field>
-            <field name="search_view_id" ref="website_slides.slide_channel_view_search"/>
+            <field name="view_id" ref="slide_channel_view_tree"/>
+            <field name="help" type="html">
+                <p class="o_view_nocontent_smiling_face">
+                    Create a course
+                </p>
+            </field>
+        </record>
+
+        <record id="slide_channel_action_report" model="ir.actions.act_window">
+            <field name="name">Courses</field>
+            <field name="res_model">slide.channel</field>
+            <field name="view_mode">tree,graph,form</field>
+            <field name="view_id" ref="slide_channel_view_tree_report"/>
             <field name="help" type="html">
                 <p class="o_view_nocontent_smiling_face">
-                    Create a channel
+                    Create a course
                 </p>
             </field>
         </record>
diff --git a/addons/website_slides/views/slide_question_views.xml b/addons/website_slides/views/slide_question_views.xml
new file mode 100644
index 000000000000..b89be114c96f
--- /dev/null
+++ b/addons/website_slides/views/slide_question_views.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+    <record id="slide_question_view_form" model="ir.ui.view">
+        <field name="name">slide.question.view.form</field>
+        <field name="model">slide.question</field>
+        <field name="arch" type="xml">
+            <form string="Quiz">
+                <sheet>
+                    <div class="oe_edit_only">
+                        <label for="question" string="Question Name"/>
+                    </div>
+                    <h1>
+                        <field name="question" default_focus="1" placeholder="Name"/>
+                    </h1>
+                    <field name="answer_ids">
+                        <tree editable="bottom" create="true" delete="true">
+                            <field name="text_value"/>
+                            <field name="is_correct"/>
+                        </tree>
+                    </field>
+                </sheet>
+            </form>
+        </field>
+    </record>
+
+    <record id="slide_question_view_tree" model="ir.ui.view">
+        <field name="name">slide.question.view.tree</field>
+        <field name="model">slide.question</field>
+        <field name="arch" type="xml">
+            <tree string="Quizzes">
+                <field name="sequence" widget="handle"/>
+                <field name="question"/>
+                <field name="slide_id"/>
+            </tree>
+        </field>
+    </record>
+
+    <record id="slide_question_view_tree_report" model="ir.ui.view">
+        <field name="name">slide.question.view.tree.report</field>
+        <field name="model">slide.question</field>
+        <field name="priority">20</field>
+        <field name="arch" type="xml">
+            <tree string="Quizzes">
+                <field name="sequence" widget="handle"/>
+                <field name="question"/>
+                <field name="slide_id"/>
+                <field name="attempts_count"/>
+                <field name="attempts_avg"/>
+                <field name="done_count"/>
+            </tree>
+        </field>
+    </record>
+
+    <record id="slide_question_view_search" model="ir.ui.view">
+        <field name="name">slide.question.view.search</field>
+        <field name="model">slide.question</field>
+        <field name="arch" type="xml">
+            <search string="Quizzes">
+                <field name="question"/>
+                <field name="slide_id"/>
+            </search>
+        </field>
+    </record>
+
+    <record id="slide_question_action_report" model="ir.actions.act_window">
+        <field name="name">Quizzes</field>
+        <field name="type">ir.actions.act_window</field>
+        <field name="res_model">slide.question</field>
+        <field name="view_mode">tree,form</field>
+        <field name="view_id" ref="slide_question_view_tree_report"/>
+        <field name="help" type="html">
+            <p class="o_view_nocontent_smiling_face">
+                There is no quiz
+            </p>
+            <p>
+                Add quizzes at the end of your lessons to evaluate what your students understood.
+            </p>
+        </field>
+    </record>
+</odoo>
diff --git a/addons/website_slides/views/slide_slide_views.xml b/addons/website_slides/views/slide_slide_views.xml
index e380ba4abb8f..2be7ac9a8d12 100644
--- a/addons/website_slides/views/slide_slide_views.xml
+++ b/addons/website_slides/views/slide_slide_views.xml
@@ -20,14 +20,14 @@
             <field name="name">slide.tag.tree</field>
             <field name="model">slide.tag</field>
             <field name="arch" type="xml">
-                <tree string="Tags">
+                <tree string="Tags" editable="bottom">
                     <field name="name"/>
                 </tree>
             </field>
         </record>
 
         <record id="action_slide_tag" model="ir.actions.act_window">
-            <field name="name">Tags</field>
+            <field name="name">Content Tags</field>
             <field name="type">ir.actions.act_window</field>
             <field name="res_model">slide.tag</field>
             <field name="view_mode">tree,form</field>
@@ -38,7 +38,7 @@
             <field name="name">slide.slide.form</field>
             <field name="model">slide.slide</field>
             <field name="arch" type="xml">
-                <form string="Slide">
+                <form string="Lesson">
                     <sheet>
                         <widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
                         <div class="oe_button_box" name="button_box">
@@ -141,34 +141,11 @@
             </field>
         </record>
 
-          <record id="view_slide_question_form" model="ir.ui.view">
-            <field name="name">slide.question.form</field>
-            <field name="model">slide.question</field>
-            <field name="arch" type="xml">
-                <form string="Slide">
-                    <sheet>
-                        <div class="oe_edit_only">
-                            <label for="question" string="Question Name"/>
-                        </div>
-                        <h1>
-                            <field name="question" default_focus="1" placeholder="Name"/>
-                        </h1>
-                        <field name="answer_ids">
-                            <tree editable="bottom" create="true" delete="true">
-                                <field name="text_value"/>
-                                <field name="is_correct"/>
-                            </tree>
-                        </field>
-                    </sheet>
-                </form>
-            </field>
-        </record>
-
         <record id="view_slide_slide_tree" model="ir.ui.view">
             <field name="name">slide.slide.tree</field>
             <field name="model">slide.slide</field>
             <field name="arch" type="xml">
-                <tree string="Slides">
+                <tree string="Contents">
                     <field name="name"/>
                     <field name="website_id" groups="website.group_multi_website"/>
                     <field name="active" invisible="1"/>
@@ -176,6 +153,10 @@
                     <field name="channel_id"/>
                     <field name="category_id"/>
                     <field name="date_published"/>
+                    <field name="slide_views"/>
+                    <field name="public_views"/>
+                    <field name="total_views"/>
+                    <field name="completion_time"/>
                 </tree>
             </field>
         </record>
@@ -184,42 +165,50 @@
             <field name="name">slide.slide.filter</field>
             <field name="model">slide.slide</field>
             <field name="arch" type="xml">
-                <search string="Search Slides">
+                <search string="Search Contents">
                     <field name="name"/>
                     <filter name="published" string="Published" domain="[('is_published', '=', True)]"/>
                     <filter name="not_published" string="Waiting for validation" domain="[('is_published', '=', False)]"/>
                     <separator/>
                     <filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
                     <group expand="0" string="Group By">
-                        <filter string="Channel" name="channel" domain="[]" context="{'group_by': 'channel_id'}"/>
-                        <filter string="Category" name="category" domain="[]" context="{'group_by': 'category_id'}"/>
-                        <filter string="Type" name="type" domain="[]" context="{'group_by': 'slide_type'}"/>
+                        <filter string="Channel" name="groupby_channel" domain="[]" context="{'group_by': 'channel_id'}"/>
+                        <filter string="Category" name="groupby_category" domain="[]" context="{'group_by': 'category_id'}"/>
+                        <filter string="Type" name="groupby_type" domain="[]" context="{'group_by': 'slide_type'}"/>
                     </group>
                 </search>
             </field>
         </record>
 
-        <record id="view_slide_slide_graph" model="ir.ui.view">
-            <field name="name">slide.slide.graph</field>
+        <record id="slide_slide_view_graph" model="ir.ui.view">
+            <field name="name">slide.slide.view.graph</field>
             <field name="model">slide.slide</field>
             <field name="arch" type="xml">
-                <graph string="Graph of Slides">
-                    <field name="date_published" interval="month" type="col"/>
+                <graph string="Graph of Contents" stacked="False">
                     <field name="channel_id" type="row"/>
+                    <field name="total_views" type="measure"/>
                 </graph>
             </field>
         </record>
 
-        <record id="action_slides_slides" model="ir.actions.act_window">
-            <field name="name">Slides</field>
+        <record id="slide_slide_action" model="ir.actions.act_window">
+            <field name="name">Contents</field>
             <field name="res_model">slide.slide</field>
-            <field name="view_mode">tree,form,graph</field>
-            <field name="context">{'search_default_channel': 1}</field>
+            <field name="view_mode">tree,form</field>
+            <field name="context">{'search_default_groupby_channel': 1}</field>
             <field name="help" type="html">
                 <p class="o_view_nocontent_smiling_face">
-                    Add a new slide
+                    Add a new lesson
                 </p>
             </field>
         </record>
+
+        <record id="slide_slide_action_report" model="ir.actions.act_window">
+            <field name="name">Contents</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">slide.slide</field>
+            <field name="view_mode">graph,tree,form</field>
+            <field name="view_id" ref="slide_slide_view_graph"/>
+        </record>
     </data>
 </odoo>
\ No newline at end of file
diff --git a/addons/website_slides/views/website_slides_menu_views.xml b/addons/website_slides/views/website_slides_menu_views.xml
index bf558fd08309..fb69ddee1958 100644
--- a/addons/website_slides/views/website_slides_menu_views.xml
+++ b/addons/website_slides/views/website_slides_menu_views.xml
@@ -1,36 +1,80 @@
 <?xml version="1.0" encoding="utf-8"?>
 <odoo>
-    <data>
-        <menuitem name="Slides"
-            id="menu_website_slides_root"
-            sequence="32"
-            parent="website.menu_website_configuration"
-            groups="website.group_website_designer"
-            action="action_slides_slides"/>
+    <menuitem name="eLearning"
+        id="website_slides_menu_root"
+        web_icon="website_slides,static/description/icon.png"
+        groups="website.group_website_publisher"
+        action="slide_channel_action_overview"/>
 
-        <menuitem name="Slides"
-            id="menu_website_slides_root_global"
-            sequence="140"
-            parent="website.menu_website_global_configuration"
-            groups="website.group_website_designer"/>
+    <!-- Main top menu elements -->
+    <menuitem name="Courses"
+        id="website_slides_menu_courses"
+        parent="website_slides_menu_root"
+        sequence="1"/>
+    <menuitem name="Reporting"
+        id="website_slides_menu_report"
+        parent="website_slides_menu_root"
+        sequence="9"/>
+    <menuitem name="Configuration"
+        id="website_slides_menu_configuration"
+        parent="website_slides_menu_root"
+        sequence="99"/>
+    
+    <!-- Courses sub-menu -->
+    <menuitem name="Courses"
+        id="website_slides_menu_courses_courses"
+        parent="website_slides_menu_courses"
+        sequence="1"
+        action="slide_channel_action_overview"/>
+    <menuitem name="Contents"
+        id="website_slides_menu_courses_content"
+        parent="website_slides_menu_courses"
+        sequence="2"
+        action="slide_slide_action"/>
+    <menuitem name="Reviews"
+        id="website_slides_menu_courses_reviews"
+        parent="website_slides_menu_courses"
+        sequence="3"
+        action="rating_rating_action_slide_channel"/>
 
-        <menuitem action="website_slides.action_slide_channels" id="menu_action_slide_channels_global"
-            parent="menu_website_slides_root_global" sequence="1"/>
+    <!-- Reporting sub-menu -->
+    <menuitem name="Courses"
+        id="website_slides_menu_report_courses"
+        parent="website_slides_menu_report"
+        sequence="1"
+        action="slide_channel_action_report"/>
+    <menuitem name="Contents"
+        id="website_slides_menu_report_contents"
+        parent="website_slides_menu_report"
+        sequence="2"
+        action="slide_slide_action_report"/>
+    <menuitem name="Reviews"
+        id="website_slides_menu_report_reviews"
+        parent="website_slides_menu_report"
+        sequence="6"
+        action="rating_rating_action_slide_channel_report"/>
+    <menuitem name="Quizzes"
+        id="website_slides_menu_report_quizzes"
+        parent="website_slides_menu_report"
+        sequence="7"
+        action="slide_question_action_report"/>
 
-        <menuitem action="website_slides.action_ir_slide_category" id="menu_action_ir_slide_category_global" parent="menu_website_slides_root_global" sequence="2"/>
+    <!-- Settings sub-menu -->
+    <menuitem name="Settings"
+        id="website_slides_menu_config_settings"
+        parent="website_slides_menu_configuration"
+        sequence="1"
+        action="website_slides_action_settings"
+        groups="base.group_system"/>
+    <menuitem name="Course Tags"
+        id="website_slides_menu_config_course_tags"
+        parent="website_slides_menu_configuration"
+        sequence="2"
+        action="slide_channel_tag_group_action"/>
+    <menuitem name="Content Tags"
+        id="website_slides_menu_config_content_tags"
+        parent="website_slides_menu_configuration"
+        sequence="3"
+        action="action_slide_tag"/>
 
-        <menuitem action="website_slides.action_slide_tag" id="menu_slide_tag" parent="menu_website_slides_root_global" sequence="10" groups="base.group_no_one"/>
-
-        <!-- Channel tags -->
-        <menuitem id="slide_channel_tag_menu"
-            action="website_slides.slide_channel_tag_action"
-            parent="menu_website_slides_root_global"
-            sequence="20"
-            groups="base.group_no_one"/>
-        <menuitem id="slide_channel_tag_group_menu"
-            action="website_slides.slide_channel_tag_group_action"
-            parent="menu_website_slides_root_global"
-            sequence="21"
-            groups="base.group_no_one"/>
-    </data>
 </odoo>
\ No newline at end of file
diff --git a/addons/website_slides/views/website_slides_templates_utils.xml b/addons/website_slides/views/website_slides_templates_utils.xml
index 580b54023cb6..80368c76e091 100644
--- a/addons/website_slides/views/website_slides_templates_utils.xml
+++ b/addons/website_slides/views/website_slides_templates_utils.xml
@@ -37,7 +37,7 @@
 <!-- Website edit page -->
 <template id="slide_edit_options" inherit_id="website.user_navbar" name="Edit Slide Options">
     <xpath expr="//li[@id='edit-page-menu']" position="after">
-        <t t-if="main_object._name == 'slide.slide'" t-set="action" t-value="'website_slides.action_slides_slides'" />
+        <t t-if="main_object._name == 'slide.slide'" t-set="action" t-value="'website_slides.slide_slide_action'"/>
     </xpath>
 </template>
 
-- 
GitLab