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