Repository
odoo/odoo · module folder
Module version
2.7
Category
Website/eLearning
Folder size
19.85 MB
License
LGPL-3
Application
Yes
Auto-installable
No
Website
https://www.odoo.com/app/elearning
Last tracking update
2026-08-15 22:44:20
Authors
Odoo S.A.
Maintainers
Odoo S.A.
Committers
Xavier Morel, Raphael Collet, Thibault Delavallée, Odoo Translation Bot, Denis Ledoux, Nicolas Martinelli, Aaron Bohy, Géry Debongnie, qsm-odoo, Christophe Monniez, Alexandre Kühn, Julien Castiaux, Aurélien Warnon, Xavier-Do, Romeo Fragomeli, Victor Feyens, Sébastien Theys, Julien Mougenot, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, abd-msyukyu-odoo, William Braeckman, Romain Estievenart, Benjamin Vray, Didier (did), Florian Charlier, Patrick Hoste, Nicolas Bayet, luvi, Hubert Van De Walle, Valentin Chevalier, Renaud Thiry, tsm-odoo, Louis Wicket (wil), Thomas Lefebvre (thle), Victor Piryns (pivi), amdi-odoo, Pierre-Yves Dufays, Maruan Aguerdouh (magm), Dylan Kiss (dyki), Antoine (ande), FrancoisGe, Mayurrajsinh Rathod, divy-odoo, Astik Singh, Maryam Kia, Mehdi Outagant (MOU), Serge Bayet (seba), reka-odoo, Bastien Fafchamps (bafa), adsh-odoo, Alex Kühn, Lopes Marc (loma), aath-odoo, Chrysanthe (chgo), mano-odoo, Biraj Khatiwada, yagp-odoo, Manushi Shah, Pierre Pulinckx (PIPU), panv-odoo, sben-odoo, Pierre Pulinckx, Bastien PIERRE, Michaël Mattiello, pish-odoo, Thomas Josse (THJO), Krzysztof Magusiak (krma), pajo, defl, Giorgio Tocco (gito), Julien Launois (jula), Augustin (duau), Davide Bonetto, Alessandro Lupo, Ayush Modi, assh-odoo, Kevin Gerard (kege), Mohamed Barakat, saurabh, Julien (jdeh), ibo-odoo, chpa-odoo, panj-odoo
Odoo dependencies
Python dependencies
geoip2
System dependencies
None
Required by
hr_skills_slides, mass_mailing_slides, test_discuss_full, test_website_modules, website_sale_slides, website_slides_forum, website_slides_survey
Description
Create Online Courses
=====================

Featuring

 * Integrated course and lesson management
 * Fullscreen navigation
 * Support Youtube videos, Google documents, PDF, images, articles
 * Test knowledge with quizzes
 * Filter and Tag
 * Statistics

Code Analysis

Views touched (106)
XML IDNameModelTypeStatus
achievement_card Achivement Card ir.ui.view qweb New
course_card Course Card ir.ui.view qweb New
course_card_information Course Information ir.ui.view qweb New
course_card_information_badge New Content Badge ir.ui.view qweb Inherits website_slides.course_card_information
course_join course_join ir.ui.view qweb New
course_main Course Main ir.ui.view qweb New
course_nav Course Navigation Header ir.ui.view qweb New
course_promoted_slide Documentation Course content: promoted slide ir.ui.view qweb New
course_sidebar Course Sidebar (infos, CTA) ir.ui.view qweb New
course_slides_cards Documentation Course content: cards / categories ir.ui.view qweb New
course_slides_list Training Course content: list ir.ui.view qweb New
course_slides_list_placeholder Course Placeholder Content ir.ui.view qweb New
course_slides_list_sample Course Sample Content ir.ui.view qweb New
course_slides_list_slide Slide template for a training channel ir.ui.view qweb New
courses_footer courses_footer ir.ui.view qweb New
courses_home Odoo Courses Homepage ir.ui.view qweb New
courses_home_side_bar courses_home_side_bar ir.ui.view qweb New
courses_my courses_my ir.ui.view qweb New
courses_search_bar courses_search_bar ir.ui.view qweb New
courses_search_results courses_search_results ir.ui.view qweb New
courses_search_tags courses_search_tags ir.ui.view qweb New
display_course display_course ir.ui.view qweb New
embed_slide Embedded Slide Page ir.ui.view qweb New
embed_slide_forbidden Forbidden Embedded Slide ir.ui.view qweb New
gamification_karma_tracking_view_search gamification.karma.tracking.view.search.inherit.website.slides gamification.karma.tracking search Inherits gamification.gamification_karma_tracking_view_search
join_course_link Join Course Link ir.ui.view qweb New
lesson_card Lesson Card ir.ui.view qweb New
lesson_content_quiz Lesson: Quiz specific content ir.ui.view qweb New
lesson_content_quiz_add_buttons Lesson: Quiz Add Buttons template ir.ui.view qweb New
lesson_content_quiz_question Lesson: Quiz question template ir.ui.view qweb New
mail_activity_view_form mail.activity.view.form.inherit.slides mail.activity form Inherits mail.mail_activity_view_form
mail_notification_channel_invite mail_notification_channel_invite ir.ui.view qweb New
profile_access_denied profile_access_denied ir.ui.view qweb Inherits website_profile.profile_access_denied
rating_rating_view_form_slides rating.rating.view.form.slides rating.rating form New
rating_rating_view_graph_slide_channel rating.rating.view.graph.slides rating.rating graph New
rating_rating_view_pivot_slide_channel rating.rating.view.pivot.slides rating.rating pivot New
rating_rating_view_search_slide_channel rating.rating.view.search.slides rating.rating search Inherits rating.rating_rating_view_search
rating_rating_view_tree_slide_channel rating.rating.view.list.slides rating.rating list New
res_config_settings_view_form res.config.settings.view.form.inherit.website.slides res.config.settings form Inherits website.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.slides res.partner form Inherits base.view_partner_form
slide_aside_card Related Slide ir.ui.view qweb New
slide_aside_documentation Slide: Sidebar in Documentation ir.ui.view qweb New
slide_aside_training Slide: Sidebar in Training ir.ui.view qweb New
slide_aside_training_category Category item for the slide detailed view list ir.ui.view qweb New
slide_channel_invite_view_form slide.channel.invite.view.form slide.channel.invite form New
slide_channel_pages_kanban_view Course Pages Kanban slide.channel kanban Inherits slide_channel_view_kanban
slide_channel_pages_tree_view Course Pages List slide.channel list Inherits slide_channel_view_tree
slide_channel_partner_view_graph slide.channel.partner.view.graph slide.channel.partner graph New
slide_channel_partner_view_kanban slide.channel.partner.view.kanban slide.channel.partner kanban New
slide_channel_partner_view_pivot slide.channel.partner.view.pivot slide.channel.partner pivot New
slide_channel_partner_view_search slide.channel.partner.search slide.channel.partner search New
slide_channel_partner_view_tree slide.channel.partner.list slide.channel.partner list New
slide_channel_tag_group_view_form slide.channel.tag.group.view.form slide.channel.tag.group form New
slide_channel_tag_group_view_search slide.channel.tag.group.view.search slide.channel.tag.group search New
slide_channel_tag_group_view_tree slide.channel.tag.group.view.list slide.channel.tag.group list New
slide_channel_tag_view_form slide.channel.tag.view.form slide.channel.tag form New
slide_channel_tag_view_search slide.channel.tag.view.search slide.channel.tag search New
slide_channel_tag_view_tree slide.channel.tag.view.list slide.channel.tag list New
slide_channel_view_form_add slide.channel.view.form.add slide.channel form New
slide_channel_view_graph slide.channel.view.graph slide.channel graph New
slide_channel_view_kanban slide.channel.view.kanban slide.channel kanban New
slide_channel_view_pivot slide.channel.view.pivot slide.channel pivot New
slide_channel_view_search slide.channel.view.search slide.channel search New
slide_channel_view_tree slide.channel.view.list slide.channel list New
slide_channel_view_tree_report slide.channel.view.list.report slide.channel list New
slide_content_detailed Slide: Detailed Content ir.ui.view qweb New
slide_embed_view_search slide.embed.view.search slide.embed search New
slide_embed_view_tree slide.embed.view.list slide.embed list New
slide_fullscreen Fullscreen ir.ui.view qweb New
slide_fullscreen_sidebar_category Slides category template for fullscreen view side bar ir.ui.view qweb New
slide_main Slide Detailed View ir.ui.view qweb New
slide_question_view_form slide.question.view.form slide.question form New
slide_question_view_search slide.question.view.search slide.question search New
slide_question_view_tree slide.question.view.list slide.question list New
slide_question_view_tree_report slide.question.view.list.report slide.question list New
slide_share_link slide_share_link ir.ui.view qweb New
slide_share_modal slide_share_modal ir.ui.view qweb New
slide_share_modal_body slide_share_modal_body ir.ui.view qweb New
slide_share_modal_header slide_share_modal_header ir.ui.view qweb New
slide_share_social Slides Media Share ir.ui.view qweb New
slide_sidebar_done_button Sidebar Done Button ir.ui.view qweb New
slide_slide_partner_view_form slide.slide.partner.view.form slide.slide.partner form New
slide_slide_partner_view_search slide.slide.partner.view.search slide.slide.partner search New
slide_slide_partner_view_tree slide.slide.partner.view.list slide.slide.partner list New
slide_slide_view_graph slide.slide.view.graph slide.slide graph New
slide_slide_view_kanban slide.slide.view.kanban slide.slide kanban New
slide_slide_view_pivot slide.slide.view.pivot slide.slide pivot New
slide_slide_view_tree_report slide.slide.view.list.report slide.slide list New
slide_social_email Share by Email ir.ui.view qweb New
slide_social_embed Share on Your Website ir.ui.view qweb New
slides_home_achievements_small Users ir.ui.view qweb New
slides_home_user_achievements_small User Achievements ir.ui.view qweb New
slides_home_user_profile_small User Profile ir.ui.view qweb New
slides_home_users_small Users ir.ui.view qweb New
slides_misc_user_image User Avatar ir.ui.view qweb New
toggle_latest_achievements Display Achievements ir.ui.view qweb Inherits website_slides.slides_home_achievements_small
toggle_leaderboard Display Leaderboard ir.ui.view qweb Inherits website_slides.slides_home_users_small
user_profile_content user_profile_content ir.ui.view qweb Inherits website_profile.user_profile_content
user_quickkarma_card User QuickKarma Card ir.ui.view qweb New
view_slide_channel_form slide.channel.view.form slide.channel form New
view_slide_slide_form slide.slide.form slide.slide form New
view_slide_slide_form_wo_channel_id slide.slide.form.wo.channel_id slide.slide form Inherits view_slide_slide_form
view_slide_slide_search slide.slide.filter slide.slide search New
view_slide_slide_tree slide.slide.list slide.slide list New
view_slide_tag_form slide.tag.form slide.tag form New
view_slide_tag_tree slide.tag.list slide.tag list New
HTTP endpoints (39)
Route(s)HandlerAuthTypeMethodsFlags
/slides/<int:channel_id>, /slides/<int:channel_id>/category/<int:category_id>, /slides/<int:channel_id>/category/<int:category_id>/page/<int:page>, /slides/<model("slide.channel"):channel>, /slides/<model("slide.channel"):channel>/page/<int:page>, /slides/<model("slide.channel"):channel>/tag/<model("slide.tag"):tag>, /slides/<model("slide.channel"):channel>/tag/<model("slide.tag"):tag>/page/<int:page>, /slides/<model("slide.channel"):channel>/category/<model("slide.slide"):category>, /slides/<model("slide.channel"):channel>/category/<model("slide.slide"):category>/page/<int:page> WebsiteSlides.channel public http ALL sudo website
/slides/add_slide WebsiteSlides.create_slide user jsonrpc POST sudo website
/slides/slide/get_html_content WebsiteSlides.get_html_content public jsonrpc ALL website
/slides/prepare_preview WebsiteSlides.prepare_preview user jsonrpc POST website
/slides/slide/archive WebsiteSlides.slide_archive user jsonrpc ALL sudo website
/slides/category/add WebsiteSlides.slide_category_add user http POST website
/slides/category/search_read WebsiteSlides.slide_category_search_read user jsonrpc POST website
/slides/<int:channel_id>/identify WebsiteSlides.slide_channel_identify_from_invite public http ALL website
/slides/<int:channel_id>/invite WebsiteSlides.slide_channel_invite public http ALL website
/slides/channel/join WebsiteSlides.slide_channel_join public jsonrpc ALL sudo website
/slides/channel/leave WebsiteSlides.slide_channel_leave user jsonrpc ALL website
/slides/channel/send_share_email WebsiteSlides.slide_channel_send_share_email user jsonrpc ALL website
/slides/channel/subscribe WebsiteSlides.slide_channel_subscribe user jsonrpc ALL website
/slides/channel/tag/add WebsiteSlides.slide_channel_tag_add user jsonrpc POST website
/slide_channel_tag/add WebsiteSlides.slide_channel_tag_create_or_get user jsonrpc POST website
/slides/channel/tag/group/search_read WebsiteSlides.slide_channel_tag_group_search_read user jsonrpc POST website
/slides/channel/tag/search_read WebsiteSlides.slide_channel_tag_search_read user jsonrpc POST website
/slides/channel/unsubscribe WebsiteSlides.slide_channel_unsubscribe user jsonrpc ALL website
/slides/slide/<int:slide_id>/get_image WebsiteSlides.slide_get_image public http ALL website
/slides/slide/<model("slide.slide"):slide>/pdf_content WebsiteSlides.slide_get_pdf_content public http ALL website
/slides/slide/like WebsiteSlides.slide_like public jsonrpc ALL sudo website
/slides/slide/toggle_is_preview WebsiteSlides.slide_preview user jsonrpc ALL website
/slides/slide/quiz/get WebsiteSlides.slide_quiz_get public jsonrpc ALL website
/slides/slide/quiz/question_add_or_update WebsiteSlides.slide_quiz_question_add_or_update user jsonrpc POST website
/slides/slide/quiz/reset WebsiteSlides.slide_quiz_reset user jsonrpc ALL website
/slides/slide/quiz/save_to_session WebsiteSlides.slide_quiz_save_to_session public jsonrpc ALL website
/slides/slide/quiz/submit WebsiteSlides.slide_quiz_submit public jsonrpc ALL sudo website
/slides/slide/send_share_email WebsiteSlides.slide_send_share_email user jsonrpc ALL website
/slides/slide/set_completed WebsiteSlides.slide_set_completed public jsonrpc ALL website
/slides/slide/<model("slide.slide"):slide>/set_completed WebsiteSlides.slide_set_completed_and_redirect user http ALL website
/slides/slide/set_uncompleted WebsiteSlides.slide_set_uncompleted public jsonrpc ALL website
/slides/slide/<model("slide.slide"):slide>/set_uncompleted WebsiteSlides.slide_set_uncompleted_and_redirect user http ALL website
/slides/slide/<int:slide_id>/share WebsiteSlides.slide_shared_view public http ALL website
/slides/tag/search_read WebsiteSlides.slide_tag_search_read user jsonrpc POST website
/slides/slide/<model("slide.slide"):slide> WebsiteSlides.slide_view public http ALL sudo website
/slides, /slides/page/<int:page>, /slides/tag/<string:slug_tags>, /slides/tag/<string:slug_tags>/page/<int:page> WebsiteSlides.slides_channel public http ALL website
/slides/embed/<int:slide_id> WebsiteSlides.slides_embed public http ALL website
/slides/embed_external/<int:slide_id> WebsiteSlides.slides_embed_external public http ALL website
/slides/all, /slides/all/tag/<string:slug_tags> WebsiteSlidesLegacy.slides_channel_all public http ALL website
Models touched (22)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • challenge_category Selection
    ondelete={'slides': 'set default'} selection_add=[('slides', 'Website / Slides')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • request_partner_id Many2one → res.partner
    ondelete='cascade' string='Requesting Partner' args: 'res.partner'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • module_mass_mailing_slides Boolean
    string='Mailing'
  • module_website_sale_slides Boolean
    string='Sell on eCommerce'
  • module_website_slides_forum Boolean
    string='Forum'
  • module_website_slides_survey Boolean
    string='Certifications'
  • website_slide_google_app_key Char
    readonly=False related='website_id.website_slide_google_app_key'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)
    Automatically subscribe new users to linked slide channels

New fields (4)
  • slide_channel_company_count Integer
    compute='_compute_slide_channel_company_count' groups='website_slides.group_website_slides_officer' args: 'Company Course Count'
  • slide_channel_completed_ids One2many → slide.channel
    compute='_compute_slide_channel_values' groups='website_slides.group_website_slides_officer' search='_search_slide_channel_completed_ids' string='Completed Courses' args: 'slide.channel'
  • slide_channel_count Integer
    compute='_compute_slide_channel_values' groups='website_slides.group_website_slides_officer' args: 'Course Count'
  • slide_channel_ids Many2many → slide.channel
    compute='_compute_slide_channel_values' groups='website_slides.group_website_slides_officer' search='_search_slide_channel_ids' string='eLearning Courses' args: 'slide.channel'
Public methods (1)
  • action_view_courses(self)
    View partners courses. In singleton mode, return courses followed by all its contacts (if company) or by themselves (if not a company). Otherwise simply set a domain on required partners. The courses to which the partner(s) is not enrolled (e.g. invited) are not shown.

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
    Trigger automatic subscription based on user groups
  • get_gamification_redirection_data(self)
  • write(self, vals)
    Trigger automatic subscription based on updated user groups

New fields (5)
  • comment Text
    help='This comment will be displayed to the user if they select this answer' translate=True args: 'Comment'
  • is_correct Boolean
    args: 'Is correct answer'
  • question_id Many2one → slide.question
    index=True ondelete='cascade' required=True string='Question' args: 'slide.question'
  • sequence Integer
    args: 'Sequence'
  • text_value Char
    required=True translate=True args: 'Answer'
Public methods (0)

No public methods.

New fields (66)
  • access_token Char
    copy=False default=_default_access_token args: 'Security Token'
  • active Boolean
    default=True tracking=100
  • allow_comment Boolean
    compute='_compute_allow_comment' help='Allow Attendees to like and comment your content and to submit reviews on your course.' precompute=True readonly=False store=True args: 'Allow rating on Course'
  • can_comment Boolean
    compute='_compute_action_rights' compute_sudo=False args: 'Can Comment'
  • can_review Boolean
    compute='_compute_action_rights' compute_sudo=False args: 'Can Review'
  • can_upload Boolean
    compute='_compute_can_upload' compute_sudo=False args: 'Can Upload'
  • can_vote Boolean
    compute='_compute_action_rights' compute_sudo=False args: 'Can Vote'
  • channel_partner_all_ids One2many → slide.channel.partner
    groups='website_slides.group_website_slides_officer' string='All Attendees Information' args: 'slide.channel.partner', 'channel_id'
  • channel_partner_ids One2many → slide.channel.partner
    domain=[('member_status', '!=', 'invited')] groups='website_slides.group_website_slides_officer' string='Enrolled Attendees Information' args: 'slide.channel.partner', 'channel_id'
  • channel_type Selection
    default='training' help='Defines the course type (e.g., "Training" for interactive learning, or "Documentation" for resources and guides).' required=True string='Course type' args: [('training', 'Training'), ('documentation', 'Documentation')]
  • color Integer
    default=0 help='Used to decorate kanban view' args: 'Color Index'
  • completed Boolean
    compute='_compute_user_statistics' compute_sudo=False args: 'Done'
  • completed_template_id Many2one → mail.template
    default=<expr> domain=[('model', '=', 'slide.channel.partner')] help='Defines the email your Attendees will receive once they reach the end of your course.' string='Completion Notification' args: 'mail.template'
  • completion Integer
    compute='_compute_user_statistics' compute_sudo=False args: 'Completion'
  • description Html
    help='The description that is displayed on top of the course page, just below the title' sanitize_attributes=False sanitize_form=False translate=True args: 'Description'
  • description_html Html
    sanitize_attributes=False sanitize_form=False translate=tools.html_translate args: 'Detailed Description'
  • description_short Html
    help='The description that is displayed on the course card' sanitize_attributes=False sanitize_form=False translate=True args: 'Short Description'
  • enroll Selection
    compute='_compute_enroll' copy=False default='public' help='Defines how people can enroll to your Course.' readonly=False required=True store=True string='Enroll Policy' args: [('public', 'Open'), ('invite', 'On Invitation')]
  • enroll_group_ids Many2many → res.groups
    help='Members of those groups are automatically added as members of the channel.' string='Auto Enroll Groups' args: 'res.groups'
  • enroll_msg Html
    default=_get_default_enroll_msg help='Message explaining the enroll process' sanitize_attributes=False translate=tools.html_translate args: 'Enroll Message'
  • has_requested_access Boolean
    compute='_compute_has_requested_access' compute_sudo=False string='Access Requested'
  • is_member Boolean
    compute='_compute_membership_values' help='Is the attendee actively enrolled.' search='_search_is_member' string='Is Enrolled Attendee'
  • is_member_invited Boolean
    compute='_compute_membership_values' help='Is the invitation for this attendee pending.' search='_search_is_member_invited' string='Is Invited Attendee'
  • is_visible Boolean
    compute='_compute_is_visible' search='_search_is_visible' string='Is Visible On Website'
  • karma_gen_channel_finish Integer
    default=10 string='Course finished'
  • karma_gen_channel_rank Integer
    default=5 string='Course ranked'
  • karma_review Integer
    default=10 help='Karma needed to add a review on the course' args: 'Add Review'
  • karma_slide_comment Integer
    default=3 help='Karma needed to add a comment on a slide of this course' args: 'Add Comment'
  • karma_slide_vote Integer
    default=3 help='Karma needed to like/dislike a slide of this course.' args: 'Vote'
  • members_all_count Integer
    compute='_compute_members_counts' args: '# Enrolled or Invited Attendees'
  • members_completed_count Integer
    compute='_compute_members_counts' args: '# Completed Attendees'
  • members_count Integer
    compute='_compute_members_counts' args: '# Enrolled Attendees'
  • members_engaged_count Integer
    compute='_compute_members_counts' help="Active attendees include both 'joined' and 'ongoing' attendees." args: '# Active Attendees'
  • members_invited_count Integer
    compute='_compute_members_counts' args: '# Invited Attendees'
  • name Char
    required=True translate=True args: 'Name'
  • nbr_article Integer
    compute='_compute_slides_statistics' store=True args: 'Articles'
  • nbr_document Integer
    compute='_compute_slides_statistics' store=True args: 'Documents'
  • nbr_infographic Integer
    compute='_compute_slides_statistics' store=True args: 'Infographics'
  • nbr_quiz Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Quizs'
  • nbr_video Integer
    compute='_compute_slides_statistics' store=True args: 'Videos'
  • partner_has_new_content Boolean
    compute='_compute_partner_has_new_content' compute_sudo=False
  • partner_ids Many2many → res.partner
    compute='_compute_partners' help='Enrolled partners in the course' search='_search_partner_ids' string='Attendees' args: 'res.partner'
  • prerequisite_channel_ids Many2many → slide.channel
    domain="[('id', '!=', id), ('visibility', '=', visibility), ('website_published', '=', website_published)]" help='Prerequisite courses to complete before accessing this one.' string='Prerequisites' args: 'slide.channel', 'slide_channel_prerequisite_slide_channel_rel', 'channel_id', 'prerequisite_channel_id'
  • prerequisite_of_channel_ids Many2many → slide.channel
    help='Courses that have this course as prerequisite.' string='Prerequisite Of' args: 'slide.channel', 'slide_channel_prerequisite_slide_channel_rel', 'prerequisite_channel_id', 'channel_id'
  • prerequisite_user_has_completed Boolean
    compute='_compute_prerequisite_user_has_completed' args: 'Has Completed Prerequisite'
  • promote_strategy Selection
    copy=False default='latest' help='Defines the content that will be promoted on the course home page' required=False string='Featured Content' args: [('latest', 'Latest Created'), ('most_voted', 'Most Voted'), ('most_viewed', 'Most Viewed'), ('specific', 'Select Manually'), ('none', 'None')]
  • promoted_slide_id Many2one → slide.slide
    copy=False string='Promoted Slide' args: 'slide.slide'
  • publish_template_id Many2one → mail.template
    default=<expr> domain=[('model', '=', 'slide.slide')] help='Defines the email your Attendees will receive each time you upload new content.' string='New Content Notification' args: 'mail.template'
  • rating_avg_stars Float
    compute='_compute_rating_stats' compute_sudo=True digits=(16, 1) args: 'Rating Average (Stars)'
  • sequence Integer
    default=10
  • share_channel_template_id Many2one → mail.template
    default=<expr> help='Email template used when sharing a channel' string='Channel Share Template' args: 'mail.template'
  • share_slide_template_id Many2one → mail.template
    default=<expr> help='Email template used when sharing a slide' string='Share Template' args: 'mail.template'
  • slide_category_ids One2many → slide.slide
    compute='_compute_category_and_slide_ids' string='Categories' args: 'slide.slide'
  • slide_content_ids One2many → slide.slide
    compute='_compute_category_and_slide_ids' string='Content' args: 'slide.slide'
  • slide_ids One2many → slide.slide
    copy=True string='Slides and categories' args: 'slide.slide', 'channel_id'
  • slide_last_update Date
    compute='_compute_slide_last_update' store=True args: 'Last Update'
  • slide_partner_ids One2many → slide.slide.partner
    copy=False groups='website_slides.group_website_slides_officer' string='Slide User Data' args: 'slide.slide.partner', 'channel_id'
  • tag_ids Many2many → slide.channel.tag
    help='Used to categorize and filter displayed channels/courses' string='Tags' args: 'slide.channel.tag', 'slide_channel_tag_rel', 'channel_id', 'tag_id'
  • total_slides Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Contents'
  • total_time Float
    compute='_compute_slides_statistics' digits=(10, 2) store=True args: 'Duration'
  • total_views Integer
    compute='_compute_slides_statistics' store=True args: 'Visits'
  • total_votes Integer
    compute='_compute_slides_statistics' store=True args: 'Votes'
  • upload_group_ids Many2many → res.groups
    groups='base.group_user' help='Group of users allowed to publish contents on a documentation course.' string='Upload Groups' args: 'res.groups', 'rel_upload_groups', 'channel_id', 'group_id'
  • user_id Many2one → res.users
    default=<expr> string='Responsible' args: 'res.users'
  • visibility Selection
    default='public' help='Defines who can access your courses and their content.' required=True string='Show Course To' args: [('public', 'Everyone'), ('connected', 'Signed In'), ('members', 'Course Attendees'), ('link', 'Anyone with the link')]
  • website_default_background_image_url Char
    compute='_compute_website_default_background_image_url' args: 'Background image URL'
Public methods (19)
  • action_archive(self)
    Archiving a channel does it on its slides, too. We want to be archiving the channel FIRST. So that when slides are archived and the recompute is triggered, it does not try to mark the channel as "completed". That happens because it counts slide_done / slide_total, but slide_total will be 0 since all the slides for the course have been archived as well.
  • action_channel_enroll(self)
  • action_channel_invite(self)
  • action_grant_access(self, partner_id)
  • action_redirect_to_completed_members(self)
  • action_redirect_to_engaged_members(self)
  • action_redirect_to_invited_members(self)
  • action_redirect_to_members(self, status_filter='')
    Redirects to attendees of the course. If status_filter is set to 'invited' / 'engaged' ('joined' + 'ongoing') / 'completed', attendees are filtered accordingly.
  • action_refuse_access(self, partner_id)
  • action_request_access(self)
    Request access to the channel. Returns a dict with keys being either 'error' (specific error raised) or 'done' (request done or not).
  • action_unarchive(self)
    Unarchiving a channel does it on its slides, too. We want to archive the channel LAST. So that when it recomputes stats for the channel and completion, it correctly counts the slides_total by counting slides that are already un-archived.
  • action_view_ratings(self)
  • action_view_slides(self)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_backend_menu_id(self)
  • message_post(self, *, parent_id=False, subtype_id=False, **kwargs)
    Temporary workaround to avoid spam. If someone replies on a channel through the 'Presentation Published' email, it should be considered as a note as we don't want all channel followers to be notified of this answer. Also make sure that only one review can be posted per course.
  • unlink(self)
    " Necessary override to avoid cache issues in the ORM. This signals the ORM to remove slides first to avoid having the SQL cascade the deletion, which attempts to recompute slide statistics of removed slides and creates a cache failure. Indeed, slides statistics are computed using a read_group which will try to flush the records first and fail with a "Could not find all values of slide.slide.category_id to flush them". (Fix suggested by the ORM team). (See '_compute_slides_statistics' and '_compute_category_completion_time').
  • write(self, vals)

New fields (8)
  • attachment_ids Many2many → ir.attachment
    bypass_search_access=True string='Attachments' args: 'ir.attachment'
  • channel_id Many2one → slide.channel
    required=True string='Course' args: 'slide.channel'
  • channel_invite_url Char
    compute='_compute_channel_invite_url' args: 'Course Link'
  • channel_published Boolean
    related='channel_id.is_published'
  • channel_visibility Selection
    related='channel_id.visibility'
  • enroll_mode Boolean
    help='Whether invited partners will be added as enrolled. Otherwise, they will be added as invited.' readonly=True args: 'Enroll partners'
  • partner_ids Many2many → res.partner
    string='Recipients' args: 'res.partner'
  • send_email Boolean
    compute='_compute_send_email' readonly=False store=True args: 'Send Email'
Public methods (1)
  • action_invite(self)
    Process the wizard content and proceed with sending the related email(s), rendering any template patterns on the fly if needed. This method is used both to add members as 'joined' (when adding attendees) and as 'invited' (on invitation), depending on the value of enroll_mode. Archived members can be invited or enrolled. They will become 'invited', or another status if enrolled depending on their progress. Invited members can be reinvited, or enrolled depending on enroll_mode.

New fields (15)
  • active Boolean
    default=True string='Active'
  • channel_enroll Selection
    related='channel_id.enroll'
  • channel_id Many2one → slide.channel
    index=True ondelete='cascade' required=True string='Course' args: 'slide.channel'
  • channel_type Selection
    related='channel_id.channel_type'
  • channel_user_id Many2one → res.users
    related='channel_id.user_id' string='Responsible' args: 'res.users'
  • channel_visibility Selection
    related='channel_id.visibility'
  • channel_website_id Many2one → website
    related='channel_id.website_id' string='Website' args: 'website'
  • completed_slides_count Integer
    default=0 args: '# Completed Contents'
  • completion Integer
    aggregator='avg' default=0 args: '% Completed Contents'
  • invitation_link Char
    compute='_compute_invitation_link' args: 'Invitation Link'
  • last_invitation_date Datetime
    args: 'Last Invitation Date'
  • member_status Selection
    default='joined' readonly=True required=True string='Attendee Status' args: [('invited', 'Invite Sent'), ('joined', 'Joined'), ('ongoing', 'Ongoing'), ('completed', 'Finished')]
  • next_slide_id Many2one → slide.slide
    compute='_compute_next_slide_id' string='Next Lesson' args: 'slide.slide'
  • partner_email Char
    readonly=True related='partner_id.email'
  • partner_id Many2one → res.partner
    index=True ondelete='cascade' required=True args: 'res.partner'
Public methods (1)
  • unlink(self)
    Override unlink method : Remove attendee from a channel, then also remove slide.slide.partner related to.

New fields (6)
  • channel_ids Many2many → slide.channel
    string='Channels' args: 'slide.channel', 'slide_channel_tag_rel', 'tag_id', 'channel_id'
  • color Integer
    default=<expr> help='Tag color used in both backend and website. No color means no display in kanban or front-end, to distinguish internal tags from public categorization tags' string='Color Index'
  • group_id Many2one → slide.channel.tag.group
    index=True ondelete='cascade' required=True string='Group' args: 'slide.channel.tag.group'
  • group_sequence Integer
    index=True readonly=True related='group_id.sequence' store=True args: 'Group sequence'
  • name Char
    required=True translate=True args: 'Name'
  • sequence Integer
    default=10 index=True required=True args: 'Sequence'
Public methods (0)

No public methods.

New fields (3)
  • name Char
    required=True translate=True args: 'Group Name'
  • sequence Integer
    default=10 index=True required=True args: 'Sequence'
  • tag_ids One2many → slide.channel.tag
    string='Tags' args: 'slide.channel.tag', 'group_id'
Public methods (0)

No public methods.

New fields (4)
  • count_views Integer
    default=1 args: '# Views'
  • slide_id Many2one → slide.slide
    index=True ondelete='cascade' required=True string='Presentation' args: 'slide.slide'
  • url Char
    args: 'Third Party Website URL'
  • website_name Char
    compute='_compute_website_name' args: 'Website'
Public methods (0)

No public methods.

New fields (8)
  • answer_ids One2many → slide.answer
    copy=True string='Answer' args: 'slide.answer', 'question_id'
  • answers_validation_error Char
    compute='_compute_answers_validation_error' args: 'Error on Answers'
  • attempts_avg Float
    compute='_compute_statistics' digits=(6, 2) groups='website_slides.group_website_slides_officer'
  • attempts_count Integer
    compute='_compute_statistics' groups='website_slides.group_website_slides_officer'
  • done_count Integer
    compute='_compute_statistics' groups='website_slides.group_website_slides_officer'
  • question Char
    required=True translate=True args: 'Question Name'
  • sequence Integer
    args: 'Sequence'
  • slide_id Many2one → slide.slide
    index=True ondelete='cascade' required=True string='Content' args: 'slide.slide'
Public methods (0)

No public methods.

New fields (69)
  • active Boolean
    default=True tracking=100
  • binary_content Binary
    attachment=True args: 'File'
  • can_self_mark_completed Boolean
    compute='_compute_mark_complete_actions' help='The slide can be marked as completed even without opening it' args: 'Can Mark Completed'
  • can_self_mark_uncompleted Boolean
    compute='_compute_mark_complete_actions' help='The slide can be marked as not completed and the progression' args: 'Can Mark Uncompleted'
  • category_id Many2one → slide.slide
    compute='_compute_category_id' index='btree_not_null' store=True string='Section' args: 'slide.slide'
  • channel_allow_comment Boolean
    related='channel_id.allow_comment' string='Allows comment'
  • channel_id Many2one → slide.channel
    index=True ondelete='cascade' required=True string='Course' args: 'slide.channel'
  • channel_type Selection
    related='channel_id.channel_type' string='Channel type'
  • comments_count Integer
    compute='_compute_comments_count' args: 'Number of comments'
  • completion_time Float
    compute='_compute_category_completion_time' digits=(10, 4) readonly=False recursive=True store=True args: 'Duration'
  • date_published Datetime
    copy=False readonly=True tracking=False args: 'Publish Date'
  • description Html
    sanitize_attributes=False sanitize_overridable=True translate=True args: 'Description'
  • dislikes Integer
    compute='_compute_like_info' compute_sudo=False store=True args: 'Dislikes'
  • document_binary_content Binary
    readonly=False related='binary_content' args: 'PDF Content'
  • document_google_url Char
    help='Link of the document (we currently only support Google Drive as source)' readonly=False related='url' args: 'Document Link'
  • embed_code Html
    compute='_compute_embed_code' readonly=True sanitize=False args: 'Embed Code'
  • embed_code_external Html
    compute='_compute_embed_code' help="Same as 'Embed Code' but used to embed the content on an external website." readonly=True sanitize=False args: 'External Embed Code'
  • embed_count Integer
    compute='_compute_embed_counts' args: '# of Embeds'
  • embed_ids One2many → slide.embed
    string='External Slide Embeds' args: 'slide.embed', 'slide_id'
  • google_drive_id Char
    compute='_compute_google_drive_id' args: 'Google Drive ID of the external URL'
  • html_content Html
    help="Custom HTML content for slides of category 'Article'." sanitize_attributes=False sanitize_form=False sanitize_overridable=True translate=True args: 'HTML Content'
  • image_1920 Image
    compute='_compute_image_1920' readonly=False store=True
  • image_binary_content Binary
    readonly=False related='binary_content' args: 'Image Content'
  • image_google_url Char
    help='Link of the image (we currently only support Google Drive as source)' readonly=False related='url' args: 'Image Link'
  • is_category Boolean
    default=False args: 'Is a category'
  • is_new_slide Boolean
    compute='_compute_is_new_slide' args: 'Is New Slide'
  • is_preview Boolean
    default=False help="The course is accessible by anyone : the users don't need to join the channel to access the content of the course." args: 'Allow Preview'
  • is_published Boolean
    tracking=1
  • likes Integer
    compute='_compute_like_info' compute_sudo=False store=True args: 'Likes'
  • name Char
    required=True translate=True args: 'Title'
  • nbr_article Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Articles'
  • nbr_document Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Documents'
  • nbr_infographic Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Images'
  • nbr_quiz Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Quizs'
  • nbr_video Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Videos'
  • partner_ids Many2many → res.partner
    copy=False groups='website_slides.group_website_slides_officer' string='Subscribers' args: 'res.partner', 'slide_slide_partner', 'slide_id', 'partner_id'
  • public_views Integer
    copy=False default=0 readonly=True args: '# of Public Views'
  • question_ids One2many → slide.question
    copy=True string='Questions' args: 'slide.question', 'slide_id'
  • questions_count Integer
    compute='_compute_questions_count' string='Numbers of Questions'
  • quiz_first_attempt_reward Integer
    default=10 args: 'Reward: first attempt'
  • quiz_fourth_attempt_reward Integer
    default=2 args: 'Reward: every attempt after the third try'
  • quiz_second_attempt_reward Integer
    default=7 args: 'Reward: second attempt'
  • quiz_third_attempt_reward Integer
    default=5 args: 'Reward: third attempt'
  • sequence Integer
    default=0 args: 'Sequence'
  • slide_category Selection
    default='document' required=True string='Category' args: [('infographic', 'Image'), ('article', 'Article'), ('document', 'Document'), ('video', 'Video'), ('quiz', 'Quiz')]
  • slide_icon_class Char
    compute='_compute_slide_icon_class' args: 'Slide Icon fa-class'
  • slide_ids One2many → slide.slide
    string='Content' args: 'slide.slide', 'category_id'
  • slide_partner_ids One2many → slide.slide.partner
    copy=False groups='website_slides.group_website_slides_officer' string='Subscribers information' args: 'slide.slide.partner', 'slide_id'
  • slide_resource_downloadable Boolean
    default=False help='Allow the user to download the content of the slide.' args: 'Allow Download'
  • slide_resource_ids One2many → slide.slide.resource
    copy=True string='Additional Resource for this slide' args: 'slide.slide.resource', 'slide_id'
  • slide_type Selection
    compute='_compute_slide_type' help='Subtype of the slide category, allows more precision on the actual file type / source type.' readonly=False store=True string='Slide Type' args: [('image', 'Image'), ('article', 'Article'), ('quiz', 'Quiz'), ('pdf', 'PDF'), ('sheet', 'Sheet (Excel, Google Sheet, ...)'), ('doc', 'Document (Word, Google Doc, ...)'), ('slides', 'Slides (PowerPoint, Google Slides, ...)'), ('youtube_video', 'YouTube Video'), ('google_drive_video', 'Google Drive Video'), ('vimeo_video', 'Vimeo Video')]
  • slide_views Integer
    compute='_compute_slide_views' store=True args: '# of Website Views'
  • source_type Selection
    default='local_file' required=True args: [('local_file', 'Upload from Device'), ('external', 'Retrieve from Google Drive')]
  • tag_ids Many2many → slide.tag
    string='Tags' args: 'slide.tag', 'rel_slide_tag', 'slide_id', 'tag_id'
  • total_slides Integer
    compute='_compute_slides_statistics' store=True
  • total_views Integer
    compute='_compute_total' default='0' store=True args: '# Total Views'
  • url Char
    help='URL of the Google Drive file or URL of the YouTube video' args: 'External URL'
  • user_has_completed Boolean
    compute='_compute_user_membership_id' compute_sudo=False args: 'Is Member'
  • user_has_completed_category Boolean
    compute='_compute_category_completed' args: 'Is Category Completed'
  • user_id Many2one → res.users
    default=<expr> string='Uploaded by' args: 'res.users'
  • user_membership_id Many2one → slide.slide.partner
    compute='_compute_user_membership_id' compute_sudo=False help='Subscriber information for the current logged in user' string='Subscriber information' args: 'slide.slide.partner'
  • user_vote Integer
    compute='_compute_user_membership_id' compute_sudo=False args: 'User vote'
  • video_source_type Selection
    compute='_compute_video_source_type' string='Video Source' args: [('youtube', 'YouTube'), ('google_drive', 'Google Drive'), ('vimeo', 'Vimeo')]
  • video_url Char
    help='Link of the video (we support YouTube, Google Drive and Vimeo as sources)' readonly=False related='url' args: 'Video Link'
  • vimeo_id Char
    compute='_compute_vimeo_id' args: 'Video Vimeo ID'
  • website_id Many2one
    readonly=True related='channel_id.website_id'
  • website_published Boolean
    tracking=False
  • website_share_url Char
    compute='_compute_website_share_url' args: 'Share URL'
  • youtube_id Char
    compute='_compute_youtube_id' args: 'Video YouTube ID'
Public methods (13)
  • action_dislike(self)
  • action_like(self)
  • action_mark_completed(self)
  • action_mark_uncompleted(self)
  • action_set_viewed(self, quiz_attempts_inc=False)
  • action_view_embeds(self)
  • copy_data(self, default=None)
    Sets the sequence to zero so that it always lands at the beginning of the newly selected course as an uncategorized slide
  • create(self, vals_list)
    @api.model_create_multi
  • get_backend_menu_id(self)
  • get_base_url(self)
    As website_id is not defined on this record, we rely on channel website_id for base URL.
  • message_post(self, *, message_type='notification', **kwargs)
  • unlink(self)
  • write(self, vals)

New fields (7)
  • channel_id Many2one → slide.channel
    index=True ondelete='cascade' related='slide_id.channel_id' store=True string='Channel' args: 'slide.channel'
  • completed Boolean
    args: 'Completed'
  • partner_id Many2one → res.partner
    index=True ondelete='cascade' required=True args: 'res.partner'
  • quiz_attempts_count Integer
    default=0 args: 'Quiz attempts count'
  • slide_category Selection
    related='slide_id.slide_category'
  • slide_id Many2one → slide.slide
    index=True ondelete='cascade' required=True string='Content' args: 'slide.slide'
  • vote Integer
    default=0 args: 'Vote'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (8)
  • data Binary
    compute='_compute_reset_resources' readonly=False store=True args: 'Resource'
  • download_url Char
    compute='_compute_download_url' args: 'Download URL'
  • file_name Char
    store=True
  • link Char
    compute='_compute_reset_resources' readonly=False store=True args: 'Link'
  • name Char
    compute='_compute_name' readonly=False store=True args: 'Name'
  • resource_type Selection
    required=True args: [('file', 'File'), ('url', 'Link')]
  • sequence Integer
    string='Sequence'
  • slide_id Many2one → slide.slide
    index=True ondelete='cascade' required=True args: 'slide.slide'
Public methods (0)

No public methods.

New fields (1)
  • name Char
    required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (1)
  • website_slide_google_app_key Char
    groups='base.group_system' args: 'Google Doc Key'
Public methods (1)
  • get_suggested_controllers(self)

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…