[REF] website_slides: make eLearning an application with its own menu structure
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>
This commit is contained in:
committed by
Thibault Delavallée
co-authored by
Thibault Delavallée
parent
ad9d7c5c06
commit
4587e6a396
@@ -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',
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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>
|
||||
@@ -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")
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 channel
|
||||
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 course
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user