eLearning

website_slides
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/website_slides
VERSION
VERSION 2.7
CATEGORY
CATEGORYWebsite/eLearning
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Denis Ledoux, Xavier Morel, Nicolas Martinelli, Géry Debongnie, Aaron Bohy, 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, Hubert Van De Walle, luvi, Valentin Chevalier, Renaud Thiry, Thomas Lefebvre (thle), Louis Wicket (wil), tsm-odoo, 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), Chrysanthe (chgo), aath-odoo, mano-odoo, Biraj Khatiwada, yagp-odoo, Manushi Shah, panv-odoo, Pierre Pulinckx (PIPU), sben-odoo, Michaël Mattiello, Pierre Pulinckx, Bastien PIERRE, pish-odoo, Thomas Josse (THJO), Krzysztof Magusiak (krma), pajo, defl, Giorgio Tocco (gito), Davide Bonetto, Alessandro Lupo, Julien Launois (jula), Augustin (duau), Ayush Modi, assh-odoo, Kevin Gerard (kege), Mohamed Barakat, saurabh, Julien (jdeh), ibo-odoo, chpa-odoo, panj-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/elearning
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:45
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - portal_rating
    - portal
    - web
    - base
    - html_editor
    - bus
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
    - rating
    - website
    - digest
    - resource
    - social_media
    - google_recaptcha
    - utm
    - html_builder
    - website_mail
    - website_profile
    - website_partner
    - gamification
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES geoip2
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 xpath 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 field 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 xpath 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 xpath Inherits website.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.slides res.partner xpath 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 xpath Inherits slide_channel_view_kanban
slide_channel_pages_tree_view Course Pages List slide.channel xpath 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 field 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
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)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/website_slides
VERSION
VERSION 2.7
CATEGORY
CATEGORYWebsite/eLearning
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Xavier Morel, Nicolas Martinelli, Nicolas Lempereur, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Yannick Tivisse, qsm-odoo, Odoo Online, Romain Derie, Christophe Monniez, Jorge Pinna Puissant, Alexandre Kühn, Julien Castiaux, Aurélien Warnon, Xavier-Do, Romeo Fragomeli, Adrien Dieudonné, Sébastien Theys, Julien Mougenot, Luis González, std-odoo, Tiffany Chang (tic), Gorash, Pierre Paridans, abd-msyukyu-odoo, Romain Estievenart, Benjamin Vray, Didier (did), Florian Vranckx, Florian Charlier, Patrick Hoste, Hubert Van De Walle, Renaud Thiry, Vincent Larcin, Ipsita Borisagar, damr, Thomas Lefebvre (thle), Louis Wicket (wil), tsm-odoo, Victor Piryns (pivi), amdi-odoo, Pierre-Yves Dufays, Maruan Aguerdouh (magm), Dylan Kiss (dyki), Antoine (ande), Michael (mcm), Mayurrajsinh Rathod, Vivek Pathak, bram1000, Mahdi Cheikh Rouhou (macr), omra-odoo, Andrzej(pian), kdeb@odoo.com, Jay Savaliya, Astik Singh, Maryam Kia, reka-odoo, Eteil Djoumatchoua(etdj) etdj@odoo.com, Nathaniel (naja), Julien Carion (juca), adsh-odoo, Lopes Marc (loma), Shubham Thanki, Chrysanthe (chgo), aath-odoo, Louis (wil), mano-odoo, Shaan Thakkar (THSH), Biraj Khatiwada, Elisabeth Dickinson, Xavier Luyckx (xlu), yagp-odoo, Antoine (anso), Pierre Pulinckx (PIPU), Khushi, Pierre Pulinckx (pipu), Pierre Pulinckx, Bastien PIERRE, pish-odoo, Thomas Josse (THJO), defl, Giorgio Tocco (gito), Davide Bonetto, Ayush Modi, Mohamed Barakat, saurabh, Kadam Darji, ibo-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/elearning
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:59
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - portal_rating
    - portal
    - web
    - base
    - web_editor
    - bus
    - html_editor
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
    - rating
    - website
    - digest
    - resource
    - social_media
    - google_recaptcha
    - utm
    - website_mail
    - website_profile
    - website_partner
    - gamification
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES geoip2
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (103)
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_arrow New Content Ribbon 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_all Odoo All Courses ir.ui.view qweb New
courses_footer courses_footer ir.ui.view qweb New
courses_home Odoo Courses Homepage 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 xpath 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_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 xpath 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 xpath Inherits website.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.slides res.partner xpath 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 xpath Inherits slide_channel_view_kanban
slide_channel_pages_tree_view Course Pages List slide.channel xpath 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_searchbar_input_snippet_options slide search bar snippet options ir.ui.view qweb Inherits website.searchbar_input_snippet_options
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
snippet_options Slides Snippet Options ir.ui.view qweb Inherits website.snippet_options
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 field 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
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 (0)

No new fields.

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
    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 (65)
  • access_token Char
    copy=False default=_default_access_token args: 'Security Token'
  • active Boolean
    default=True tracking=100
  • allow_comment Boolean
    default=True help='Allow Attendees to like and comment your content and to submit reviews on your course.' 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' 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'
  • 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
    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')]
  • website_default_background_image_url Char
    compute='_compute_website_default_background_image_url' args: 'Background image URL'
Public methods (19)
  • 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_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)
    @api.returns('mail.message', <expr>)
    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.
  • open_website_url(self)
    Overridden to use a relative URL instead of an absolute when website_id is False.
  • toggle_active(self)
    Archiving/unarchiving a channel does it on its slides, too. 1. When archiving 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. 2. When un-archiving 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.
  • 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
    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
    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' store=True string='Section' args: 'slide.slide'
  • channel_allow_comment Boolean
    related='channel_id.allow_comment' string='Allows comment'
  • channel_id Many2one → slide.channel
    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 (14)
  • 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)
  • message_post(self, *, message_type='notification', **kwargs)
    @api.returns('mail.message', <expr>)
  • open_website_url(self)
    Overridden to use a relative URL instead of an absolute when website_id is False.
  • toggle_active(self)
  • unlink(self)
  • write(self, values)

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, values)

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
    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)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/website_slides
VERSION
VERSION 2.7
CATEGORY
CATEGORYWebsite/eLearning
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Xavier ALT, Xavier Morel, Nicolas Lempereur, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Damien Bouvy, Yannick Tivisse, qsm-odoo, Dharmraj Jhala, Odoo Online, Romain Derie, Christophe Monniez, Jorge Pinna Puissant, Alexandre Kühn, Julien Castiaux, Aurélien Warnon, Xavier-Do, Romeo Fragomeli, Victor Feyens, Adrien Dieudonné, Sébastien Theys, Joseph Caburnay, Julien Mougenot, Luis González, Samuel Degueldre, std-odoo, Nasreddin Boulif (bon), Tiffany Chang (tic), Rémy Voet (ryv), Pierre Rousseau, Gorash, Pierre Paridans, Romain Estievenart, Benjamin Vray, Benoit Socias, Hubert Van de Walle (huvw), Guillaume (gdi), Florian Vranckx, Arthur Detroux (ard), Florian Charlier, Patrick Hoste, Abdelouahab (abla), Nicolas Bayet, Dossogne Bertrand, luvi, Renaud Thiry, niyasraphy, Thomas Lefebvre (thle), mehjabinfarsana, Andro Gvivradze, Louis Wicket (wil), Mahamadasif Ansari, Thomas Becquevort (thbe), amdi-odoo, Pierre-Yves Dufays, Om Rabara, Saurabh Choraria, Maruan Aguerdouh (magm), Dylan Kiss (dyki), Bruno Boi, Antoine (ande), FrancoisGe, Michael (mcm), Mayurrajsinh Rathod, Vivek Pathak, bram1000, Xavier Bol (xbo), Brieuc-brd, Mahdi Cheikh Rouhou (macr), Noe Antoine, Andrzej(pian), kdeb@odoo.com, Jay Savaliya, Astik Singh, Jérémy Hennecart (jeh), Eteil Djoumatchoua(etdj) etdj@odoo.com, Nathaniel (naja), Julien Carion (juca), adsh-odoo, Lopes Marc (loma), Shubham Thanki, Chrysanthe (chgo), aath-odoo, shsa-odoo, Louis (wil), mano-odoo, Shaan Thakkar (THSH), Biraj Khatiwada, Elisabeth Dickinson, yagp-odoo, Khushi, thsh-odoo, Pierre Pulinckx (pipu), fdardenne, Bastien PIERRE, Sahil Patel, Aditya Sharma, pish-odoo, Thomas Josse (THJO), Pulinckx Pierre (PIPU), defl, Mohamed Barakat
WEBSITE
WEBSITEhttps://www.odoo.com/app/elearning
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - portal_rating
    - portal
    - web
    - base
    - web_editor
    - bus
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
    - rating
    - website
    - digest
    - resource
    - social_media
    - google_recaptcha
    - utm
    - website_mail
    - website_profile
    - website_partner
    - gamification
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES geoip2
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (103)
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_arrow New Content Ribbon 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_all Odoo All Courses ir.ui.view qweb New
courses_footer courses_footer ir.ui.view qweb New
courses_home Odoo Courses Homepage 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 xpath 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_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 xpath Inherits rating.rating_rating_view_search
rating_rating_view_tree_slide_channel rating.rating.view.tree.slides rating.rating tree New
res_config_settings_view_form res.config.settings.view.form.inherit.website.slides res.config.settings xpath Inherits website.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.slides res.partner xpath 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 xpath Inherits slide_channel_view_kanban
slide_channel_pages_tree_view Course Pages Tree slide.channel xpath 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.tree slide.channel.partner tree 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.tree slide.channel.tag.group tree 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.tree slide.channel.tag tree 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.tree slide.channel tree New
slide_channel_view_tree_report slide.channel.view.tree.report slide.channel tree 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.tree slide.embed tree 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.tree slide.question tree New
slide_question_view_tree_report slide.question.view.tree.report slide.question tree New
slide_searchbar_input_snippet_options slide search bar snippet options ir.ui.view qweb Inherits website.searchbar_input_snippet_options
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.tree slide.slide.partner tree 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.tree.report slide.slide tree 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
snippet_options Slides Snippet Options ir.ui.view qweb Inherits website.snippet_options
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 field Inherits view_slide_slide_form
view_slide_slide_search slide.slide.filter slide.slide search New
view_slide_slide_tree slide.slide.tree slide.slide tree New
view_slide_tag_form slide.tag.form slide.tag form New
view_slide_tag_tree slide.tag.tree slide.tag tree New
Models touched (23)

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 (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
    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 (0)

No new fields.

Public methods (0)

No public methods.

New fields (65)
  • access_token Char
    copy=False default=_default_access_token args: 'Security Token'
  • active Boolean
    default=True tracking=100
  • allow_comment Boolean
    default=True help='Allow Attendees to like and comment your content and to submit reviews on your course.' 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' 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'
  • 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
    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')]
  • website_default_background_image_url Char
    compute='_compute_website_default_background_image_url' args: 'Background image URL'
Public methods (19)
  • 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_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)
    @api.returns('mail.message', <expr>)
    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.
  • open_website_url(self)
    Overridden to use a relative URL instead of an absolute when website_id is False.
  • toggle_active(self)
    Archiving/unarchiving a channel does it on its slides, too. 1. When archiving 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. 2. When un-archiving 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.
  • 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
    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 (0)

No new fields.

Public methods (0)

No public methods.

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
    default=0 group_operator='avg' 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
    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' store=True string='Section' args: 'slide.slide'
  • channel_allow_comment Boolean
    related='channel_id.allow_comment' string='Allows comment'
  • channel_id Many2one → slide.channel
    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 (14)
  • 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(self, default=None)
    @api.returns('self', <expr>)
    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)
  • message_post(self, *, message_type='notification', **kwargs)
    @api.returns('mail.message', <expr>)
  • open_website_url(self)
    Overridden to use a relative URL instead of an absolute when website_id is False.
  • toggle_active(self)
  • unlink(self)
  • write(self, values)

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, values)

New fields (7)
  • 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')]
  • slide_id Many2one → slide.slide
    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)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/website_slides
VERSION
VERSION 2.6
CATEGORY
CATEGORYWebsite/eLearning
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Goffin Simon, Aaron Bohy, Jeremy Kersten, Damien Bouvy, Yannick Tivisse, qsm-odoo, Dharmraj Jhala, Romain Derie, Jorge Pinna Puissant, Alexandre Kühn, Julien Castiaux, Aurélien Warnon, Xavier-Do, Romeo Fragomeli, Victor Feyens, Sébastien Theys, Nikunj Ladava, Luis González, Samuel Degueldre, std-odoo, Nasreddin Boulif (bon), Tiffany Chang (tic), Nathan Marotte (nama), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, Romain Estievenart, Benjamin Vray, Arnaud Baes, Benoit Socias, Hubert Van de Walle (huvw), Guillaume (gdi), Merlin (megu), thcl-odoo, Florian Vranckx, Arthur Detroux (ard), Florian Charlier, Patrick Hoste, Abdelouahab (abla), Nicolas Bayet, Jinjiu Liu, Laurent Stukkens (LTU), luvi, Fabio Barbero, Pierrot (prro), Thomas Lefebvre (thle), Eleftherios Kritsotakis, Andro Gvivradze, Louis Wicket (wil), tsm-odoo, Mahamadasif Ansari, amdi-odoo, Pierre-Yves Dufays, Saurabh Choraria, Naman Shah, Maruan Aguerdouh (magm), Sébastien Geelen (sge), Bruno Boi, Antoine (ande), Michael (mcm), Mayurrajsinh Rathod, Rahul Prajapati, Adrien Schoffeniels, bram1000, Mahdi Cheikh Rouhou (macr), Noe Antoine, kdeb@odoo.com, Jay Savaliya, Jérémy Hennecart (jeh), Eteil Djoumatchoua(etdj) etdj@odoo.com, adsh-odoo, Lopes Marc (loma), Martin Trigaux (mat), Shubham Thanki, Thomas Josse, Biraj Khatiwada, yagp-odoo, thsh-odoo, Thomas Josse (THJO)
WEBSITE
WEBSITEhttps://www.odoo.com/app/elearning
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:53
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - portal_rating
    - portal
    - web
    - base
    - web_editor
    - bus
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
    - rating
    - website
    - digest
    - resource
    - social_media
    - google_recaptcha
    - utm
    - website_mail
    - website_profile
    - website_partner
    - gamification
    - web_kanban_gauge
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (100)
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_arrow New Content Ribbon 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_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_all Odoo All Courses ir.ui.view qweb New
courses_footer courses_footer ir.ui.view qweb New
courses_home Odoo Courses Homepage 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
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_notification_channel_invite mail_notification_channel_invite ir.ui.view qweb New
private_profile private_profile ir.ui.view qweb Inherits website_profile.private_profile
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 xpath Inherits rating.rating_rating_view_search
rating_rating_view_tree_slide_channel rating.rating.view.tree.slides rating.rating tree New
res_config_settings_view_form res.config.settings.view.form.inherit.website.slides res.config.settings xpath Inherits website.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.slides res.partner xpath 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 xpath Inherits slide_channel_view_kanban
slide_channel_pages_tree_view Course Pages Tree slide.channel xpath Inherits slide_channel_view_tree
slide_channel_partner_view_kanban slide.channel.partner.view.kanban slide.channel.partner kanban New
slide_channel_partner_view_search slide.channel.partner.search slide.channel.partner search New
slide_channel_partner_view_tree slide.channel.partner.tree slide.channel.partner tree 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.tree slide.channel.tag.group tree 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.tree slide.channel.tag tree 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.tree slide.channel tree New
slide_channel_view_tree_report slide.channel.view.tree.report slide.channel tree 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.tree slide.embed tree 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_icon slide_icon 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.tree slide.question tree New
slide_question_view_tree_report slide.question.view.tree.report slide.question tree New
slide_searchbar_input_snippet_options slide search bar snippet options ir.ui.view qweb Inherits website.searchbar_input_snippet_options
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.tree slide.slide.partner tree 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.tree.report slide.slide tree 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
snippet_options Slides Snippet Options ir.ui.view qweb Inherits website.snippet_options
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 field Inherits view_slide_slide_form
view_slide_slide_search slide.slide.filter slide.slide search New
view_slide_slide_tree slide.slide.tree slide.slide tree New
view_slide_tag_form slide.tag.form slide.tag form New
view_slide_tag_tree slide.tag.tree slide.tag tree New
Models touched (19)

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 (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_completed_ids' 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_count' groups='website_slides.group_website_slides_officer' args: 'Course Count'
  • slide_channel_ids Many2many → slide.channel
    copy=False groups='website_slides.group_website_slides_officer' string='eLearning Courses' args: 'slide.channel', 'slide_channel_partner', 'partner_id', 'channel_id'
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.

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
    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 (58)
  • access_token Char
    copy=False default=_default_access_token args: 'Security Token'
  • active Boolean
    default=True tracking=100
  • allow_comment Boolean
    default=True help='Allow Attendees to like and comment your content and to submit reviews on your course.' 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_ids One2many → slide.channel.partner
    depends=['partner_ids'] groups='website_slides.group_website_slides_officer' string='Members Information' args: 'slide.channel.partner', 'channel_id'
  • channel_type Selection
    default='training' 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
    copy=False default='public' help='Defines how people can enroll to your Course.' required=True string='Enroll Policy' args: [('public', 'Public'), ('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_is_member' compute_sudo=False string='Is Member'
  • karma_gen_channel_finish Integer
    default=10 string='Course finished'
  • karma_gen_channel_rank Integer
    default=5 string='Course ranked'
  • karma_gen_slide_vote Integer
    default=1 string='Lesson voted'
  • 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_count Integer
    compute='_compute_members_count' args: 'Attendees count'
  • members_done_count Integer
    compute='_compute_members_done_count' args: 'Attendees Done Count'
  • 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
    context={'active_test': False} copy=False depends=['channel_partner_ids'] help='All members of the channel.' string='Members' args: 'res.partner', 'slide_channel_partner', 'channel_id', 'partner_id'
  • 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
    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='Visibility' args: [('public', 'Open To All'), ('members', 'Members Only')]
  • website_background_image_url Char
    compute='_compute_website_background_image_url' args: 'Background image URL'
Public methods (16)
  • action_add_member(self, **member_values)
    Adds the logged in user in the channel members. (see '_action_add_members' for more info) Returns True if added successfully, False otherwise.
  • action_channel_invite(self)
  • action_grant_access(self, partner_id)
  • action_redirect_to_done_members(self)
  • action_redirect_to_members(self, completed=False)
    Redirects to attendees of the course. If completed is True, a filter will be added in action that will display only attendees who have completed the course.
  • 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_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)
    @api.returns('mail.message', <expr>)
    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.
  • open_website_url(self)
    Overridden to use a relative URL instead of an absolute when website_id is False.
  • toggle_active(self)
    Archiving/unarchiving a channel does it on its slides, too. 1. When archiving 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. 2. When un-archiving 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.
  • write(self, vals)

New fields (3)
  • attachment_ids Many2many → ir.attachment
    string='Attachments' args: 'ir.attachment'
  • channel_id Many2one → slide.channel
    required=True string='Slide channel' args: 'slide.channel'
  • partner_ids Many2many → res.partner
    string='Recipients' args: 'res.partner'
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

New fields (11)
  • channel_enroll Selection
    related='channel_id.enroll'
  • channel_id Many2one → slide.channel
    index=True ondelete='cascade' required=True 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 Boolean
    help='Channel validated, even if slides / lessons are added once done.' args: 'Is Completed'
  • completed_slides_count Integer
    args: '# Completed Slides'
  • completion Integer
    args: '% Completed Slides'
  • 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 (7)
  • answer_ids One2many → slide.answer
    copy=True string='Answer' args: 'slide.answer', 'question_id'
  • 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
    ondelete='cascade' required=True string='Content' args: 'slide.slide'
Public methods (0)

No public methods.

New fields (67)
  • 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' store=True string='Section' args: 'slide.slide'
  • channel_allow_comment Boolean
    related='channel_id.allow_comment' string='Allows comment'
  • channel_id Many2one → slide.channel
    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
    digits=(10, 4) 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_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_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 (14)
  • 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(self, default=None)
    @api.returns('self', <expr>)
    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)
  • message_post(self, *, message_type='notification', **kwargs)
    @api.returns('mail.message', <expr>)
  • open_website_url(self)
    Overridden to use a relative URL instead of an absolute when website_id is False.
  • toggle_active(self)
  • unlink(self)
  • write(self, values)

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, values)

New fields (6)
  • data Binary
    compute='_compute_reset_resources' readonly=False store=True args: 'Resource'
  • 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')]
  • slide_id Many2one → slide.slide
    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)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/website_slides
VERSION
VERSION 2.4
CATEGORY
CATEGORYWebsite/eLearning
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Xavier Morel, Goffin Simon, Mohammed Shekha, Nicolas Lempereur, Jeremy Kersten, Yannick Tivisse, qsm-odoo, Dharmraj Jhala, Romain Derie, Jorge Pinna Puissant, Aurélien Warnon, Xavier-Do, Victor Feyens, Xavier Dubuc, Sébastien Theys, Nasreddin (bon), Julien Mougenot, Anh Thao Pham (pta), Luis González, Samuel Degueldre, std-odoo, Achraf (abz), Philémon van Helden, Jérémy Hennecart, Nasreddin Boulif (bon), Nicolas Galler, Tiffany Chang (tic), Nathan Marotte (nama), IEL, Mathieu Duckerts-Antoine, Djamel (otd), Hiral Bhavsar, Kevin Baptiste, Benoit Socias, Hubert Van de Walle (huvw), thcl-odoo, Didier (did), Florian Vranckx, Florian Charlier, Patrick Hoste, Nicolas Bayet, Jinjiu Liu, Michael Mattiello (mcm), dht-odoo, Fabio Barbero, Julien Banken, Ipsita Borisagar, Pierrot (prro), Thomas Lefebvre (thle), Andro Gvivradze, Siddarth Gajjar, Qiuyu (QHO), Soukéina Bojabza, Munaf Khan, Saurabh Choraria, Maruan Aguerdouh (magm), Sébastien Geelen (sge), Bruno Boi, Antoine (ande), Mayurrajsinh Rathod, bram1000, Lavish Chhatwani, Leonardo Pavan Rocha, Zelong Lin, Jay Savaliya, adsh-odoo, Lopes Marc (loma), Martin Trigaux (mat)
WEBSITE
WEBSITEhttps://www.odoo.com/app/elearning
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - portal_rating
    - portal
    - web
    - base
    - web_editor
    - http_routing
    - mail
    - base_setup
    - bus
    - web_tour
    - auth_signup
    - rating
    - website
    - digest
    - resource
    - social_media
    - google_recaptcha
    - utm
    - website_mail
    - website_profile
    - website_partner
    - gamification
    - web_kanban_gauge
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Create Online Courses
=====================

Featuring

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

Code Analysis

Views touched (88)
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_arrow New Content Ribbon ir.ui.view qweb Inherits website_slides.course_card_information
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_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_all Odoo All Courses ir.ui.view qweb New
courses_footer courses_footer ir.ui.view qweb New
courses_home Odoo Courses Homepage 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
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_notification_channel_invite mail_notification_channel_invite ir.ui.view qweb New
private_profile private_profile ir.ui.view qweb Inherits website_profile.private_profile
rating_rating_view_graph_slide_channel rating.rating.view.graph.slides rating.rating graph New
rating_rating_view_kanban_slide_channel rating.rating.view.kanban.slides rating.rating kanban 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 xpath Inherits rating.rating_rating_view_search
res_config_settings_view_form res.config.settings.view.form.inherit.website.slides res.config.settings xpath Inherits website.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.slides res.partner xpath 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_partner_view_kanban slide.channel.partner.view.kanban slide.channel.partner kanban New
slide_channel_partner_view_search slide.channel.partner.search slide.channel.partner search New
slide_channel_partner_view_tree slide.channel.partner.tree slide.channel.partner tree 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.tree slide.channel.tag.group tree 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.tree slide.channel.tag tree 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_search slide.channel.view.search slide.channel search New
slide_channel_view_tree slide.channel.view.tree slide.channel tree New
slide_channel_view_tree_report slide.channel.view.tree.report slide.channel tree New
slide_content_detailed Slide: Detailed Content ir.ui.view qweb New
slide_edit_options Edit Slide Options ir.ui.view qweb Inherits website.user_navbar
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_icon slide_icon 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.tree slide.question tree New
slide_question_view_tree_report slide.question.view.tree.report slide.question tree New
slide_searchbar_input_snippet_options slide search bar snippet options ir.ui.view qweb Inherits website.searchbar_input_snippet_options
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_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_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_navbar_inherit_website_slides user_navbar_inherit_website_slides ir.ui.view qweb Inherits website.user_navbar
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 field Inherits view_slide_slide_form
view_slide_slide_search slide.slide.filter slide.slide search New
view_slide_slide_tree slide.slide.tree slide.slide tree New
view_slide_tag_form slide.tag.form slide.tag form New
view_slide_tag_tree slide.tag.tree slide.tag tree New
Models touched (20)

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 (1)
  • binary_content(self, xmlid=None, model='ir.attachment', id=None, field='datas', unique=False, filename=None, filename_field='name', download=False, mimetype=None, default_mimetype='application/octet-stream', access_token=None)

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_completed_ids' 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_count' groups='website_slides.group_website_slides_officer' args: 'Course Count'
  • slide_channel_ids Many2many → slide.channel
    copy=False groups='website_slides.group_website_slides_officer' string='eLearning Courses' args: 'slide.channel', 'slide_channel_partner', 'partner_id', 'channel_id'
Public methods (1)
  • action_view_courses(self)
    View partners courses. In singleton mode, return courses followed by all its contacts (if company) or by himself (if not a company). Otherwise simply set a domain on required partners.

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 he selects this answer' translate=True args: 'Comment'
  • is_correct Boolean
    args: 'Is correct answer'
  • question_id Many2one → slide.question
    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 (57)
  • access_token Char
    copy=False default=_default_access_token args: 'Security Token'
  • active Boolean
    default=True tracking=100
  • allow_comment Boolean
    default=True help='If checked it allows members to either:\n * like content and post comments on documentation course;\n * post comment and review on training course;' 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_ids One2many → slide.channel.partner
    depends=['partner_ids'] groups='website_slides.group_website_slides_officer' string='Members Information' args: 'slide.channel.partner', 'channel_id'
  • channel_type Selection
    default='training' 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> help="Email attendees once they've finished the course" string='Completion Email' 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
    default='public' help='Condition to enroll: everyone, on invite, on payment (sale bridge).' required=True string='Enroll Policy' args: [('public', 'Public'), ('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_is_member' compute_sudo=False string='Is Member'
  • karma_gen_channel_finish Integer
    default=10 string='Course finished'
  • karma_gen_channel_rank Integer
    default=5 string='Course ranked'
  • karma_gen_slide_vote Integer
    default=1 string='Lesson voted'
  • 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_count Integer
    compute='_compute_members_count' args: 'Attendees count'
  • members_done_count Integer
    compute='_compute_members_done_count' args: 'Attendees Done Count'
  • name Char
    required=True translate=True args: 'Name'
  • nbr_document Integer
    compute='_compute_slides_statistics' store=True args: 'Documents'
  • nbr_infographic Integer
    compute='_compute_slides_statistics' store=True args: 'Infographics'
  • nbr_presentation Integer
    compute='_compute_slides_statistics' store=True args: 'Presentations'
  • nbr_quiz Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Quizs'
  • nbr_video Integer
    compute='_compute_slides_statistics' store=True args: 'Videos'
  • nbr_webpage Integer
    compute='_compute_slides_statistics' store=True args: 'Webpages'
  • partner_has_new_content Boolean
    compute='_compute_partner_has_new_content' compute_sudo=False
  • partner_ids Many2many → res.partner
    context={'active_test': False} copy=False depends=['channel_partner_ids'] help='All members of the channel.' string='Members' args: 'res.partner', 'slide_channel_partner', 'channel_id', 'partner_id'
  • promote_strategy Selection
    default='latest' help="Depending the promote strategy, a slide will appear on the top of the course's page :\n * Latest Published : the slide created last.\n * Most Voted : the slide which has to most votes.\n * Most Viewed ; the slide which has been viewed the most.\n * Specific : You choose the slide to appear.\n * None : No slides will be shown.\n" required=False string='Promoted Content' args: [('latest', 'Latest Published'), ('most_voted', 'Most Voted'), ('most_viewed', 'Most Viewed'), ('specific', 'Specific'), ('none', 'None')]
  • promoted_slide_id Many2one → slide.slide
    string='Promoted Slide' args: 'slide.slide'
  • publish_template_id Many2one → mail.template
    default=<expr> help='Email attendees once a new content is published' string='New Content Email' 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 help='Display order'
  • share_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='Slides' args: 'slide.slide'
  • slide_ids One2many → slide.slide
    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: 'Content'
  • 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
    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='Applied directly as ACLs. Allow to hide channels and their content for non members.' required=True string='Visibility' args: [('public', 'Public'), ('members', 'Members Only')]
Public methods (14)
  • action_add_member(self, **member_values)
    Adds the logged in user in the channel members. (see '_action_add_members' for more info) Returns True if added successfully, False otherwise.
  • action_channel_invite(self)
  • action_grant_access(self, partner_id)
  • action_redirect_to_done_members(self)
  • action_redirect_to_members(self, completed=False)
    Redirects to attendees of the course. If completed is True, a filter will be added in action that will display only attendees who have completed the course.
  • 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_view_ratings(self)
  • action_view_slides(self)
  • create(self, vals)
    @api.model
  • get_backend_menu_id(self)
  • message_post(self, *, parent_id=False, subtype_id=False, **kwargs)
    @api.returns('mail.message', <expr>)
    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.
  • toggle_active(self)
    Archiving/unarchiving a channel does it on its slides, too. 1. When archiving 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. 2. When un-archiving 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.
  • write(self, vals)

New fields (3)
  • attachment_ids Many2many → ir.attachment
    string='Attachments' args: 'ir.attachment'
  • channel_id Many2one → slide.channel
    required=True string='Slide channel' args: 'slide.channel'
  • partner_ids Many2many → res.partner
    string='Recipients' args: 'res.partner'
Public methods (2)
  • action_invite(self)
    Process the wizard content and proceed with sending the related email(s), rendering any template patterns on the fly if needed
  • create(self, values)
    @api.model

New fields (11)
  • channel_enroll Selection
    related='channel_id.enroll'
  • channel_id Many2one → slide.channel
    index=True ondelete='cascade' required=True 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 Boolean
    help='Channel validated, even if slides / lessons are added once done.' args: 'Is Completed'
  • completed_slides_count Integer
    args: '# Completed Slides'
  • completion Integer
    args: '% Completed Slides'
  • 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 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 (3)
  • 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
    required=True args: 'Third Party Website URL'
Public methods (0)

No public methods.

New fields (7)
  • answer_ids One2many → slide.answer
    string='Answer' args: 'slide.answer', 'question_id'
  • 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
    required=True string='Content' args: 'slide.slide'
Public methods (0)

No public methods.

New fields (51)
  • active Boolean
    default=True tracking=100
  • category_id Many2one → slide.slide
    compute='_compute_category_id' store=True string='Section' args: 'slide.slide'
  • channel_allow_comment Boolean
    related='channel_id.allow_comment' string='Allows comment'
  • channel_id Many2one → slide.channel
    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
    digits=(10, 4) help='The estimated completion time for this slide' args: 'Duration'
  • datas Binary
    attachment=True args: 'Content'
  • date_published Datetime
    readonly=True tracking=1 args: 'Publish Date'
  • description Html
    sanitize_attributes=False translate=True args: 'Description'
  • dislikes Integer
    compute='_compute_like_info' compute_sudo=False store=True args: 'Dislikes'
  • document_id Char
    help='Youtube or Google Document ID' args: 'Document ID'
  • embed_code Html
    compute='_compute_embed_code' readonly=True sanitize=False args: 'Embed Code'
  • embedcount_ids One2many → slide.embed
    string='Embed Count' args: 'slide.embed', 'slide_id'
  • html_content Html
    help="Custom HTML content for slides of type 'Web Page'." sanitize_attributes=False sanitize_form=False translate=True args: 'HTML Content'
  • 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'
  • likes Integer
    compute='_compute_like_info' compute_sudo=False store=True args: 'Likes'
  • link_ids One2many → slide.slide.link
    string='External URL for this slide' args: 'slide.slide.link', 'slide_id'
  • mime_type Char
    args: 'Mime-type'
  • name Char
    required=True translate=True args: 'Title'
  • 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 Infographics'
  • nbr_presentation Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Presentations'
  • 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'
  • nbr_webpage Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Webpages'
  • 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 args: '# of Public Views'
  • question_ids One2many → slide.question
    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_ids One2many → slide.slide
    string='Slides' 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=True help='Allow the user to download the content of the slide.' args: 'Allow Download'
  • slide_resource_ids One2many → slide.slide.resource
    string='Additional Resource for this slide' args: 'slide.slide.resource', 'slide_id'
  • slide_type Selection
    default='document' help='The document type will be set automatically based on the document URL and properties (e.g. height and width for presentation and document).' required=True string='Type' args: [('infographic', 'Infographic'), ('webpage', 'Web Page'), ('presentation', 'Presentation'), ('document', 'Document'), ('video', 'Video'), ('quiz', 'Quiz')]
  • slide_views Integer
    compute='_compute_slide_views' store=True args: '# of Website Views'
  • 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: 'Views'
  • url Char
    help='Youtube or Google Document URL' args: 'Document URL'
  • 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'
  • website_id Many2one
    readonly=True related='channel_id.website_id'
Public methods (12)
  • action_dislike(self)
  • action_like(self)
  • action_set_completed(self)
  • action_set_viewed(self, quiz_attempts_inc=False)
  • copy(self, default=None)
    @api.returns('self', <expr>)
    Sets the sequence to zero so that it always lands at the beginning of the newly selected course as an uncategorized slide
  • create(self, values)
    @api.model
  • get_access_action(self, access_uid=None)
    Instead of the classic form view, redirect to website if it is published.
  • get_backend_menu_id(self)
  • message_post(self, *, message_type='notification', **kwargs)
    @api.returns('mail.message', <expr>)
  • toggle_active(self)
  • unlink(self)
  • write(self, values)

New fields (3)
  • link Char
    required=True args: 'Link'
  • name Char
    required=True args: 'Title'
  • slide_id Many2one → slide.slide
    ondelete='cascade' required=True args: 'slide.slide'
Public methods (0)

No public methods.

New fields (6)
  • 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_id Many2one → slide.slide
    index=True ondelete='cascade' required=True args: 'slide.slide'
  • vote Integer
    default=0 args: 'Vote'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (3)
  • data Binary
    args: 'Resource'
  • name Char
    required=True args: 'Name'
  • slide_id Many2one → slide.slide
    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)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/website_slides
VERSION
VERSION 2.2
CATEGORY
CATEGORYWebsite/eLearning
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Mohammed Shekha, Nicolas Martinelli, Nicolas Lempereur, Aaron Bohy, Jeremy Kersten, GitHub, Barad Mahendra, Yannick Tivisse, qsm-odoo, Dharmraj Jhala, Romain Derie, Christophe Monniez, Jorge Pinna Puissant, Julien Castiaux, Aurélien Warnon, Xavier-Do, jvm-odoo, jerome hanke (jhk), Victor Feyens, Andrea Grazioso (agr-odoo), Sébastien Theys, Nasreddin (bon), Julien Mougenot, fw-bot, Anh Thao Pham (pta), Debauche Stéphane, Samuel Degueldre, std-odoo, Achraf (abz), David Beguin, Naglis Jonaitis, Philémon van Helden, Jérémy Hennecart, Nasreddin Boulif (bon), Nicolas Galler, Tiffany Chang (tic), Nathan Marotte (nama), IEL, fja-odoo, Mathieu Duckerts-Antoine, Djamel (otd), Hiral Bhavsar, Kevin Baptiste, Benoit Socias, mcm-odoo, Didier (did), Florian Vranckx, Florian Charlier, Patrick Hoste, Jinjiu Liu, Julien Banken, Pierrot (prro), Francois (fge), Andro Gvivradze, Louis Wicket (wil), Saurabh Choraria, Mitul Shah, Mayurrajsinh Rathod, bram1000, Lavish Chhatwani
WEBSITE
WEBSITEhttps://www.odoo.com/page/slides
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - portal_rating
    - portal
    - web
    - base
    - web_editor
    - http_routing
    - mail
    - base_setup
    - bus
    - web_tour
    - auth_signup
    - rating
    - website
    - digest
    - resource
    - social_media
    - website_mail
    - website_profile
    - website_partner
    - gamification
    - web_kanban_gauge
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Create Online Courses
=====================

Featuring

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

Code Analysis

Views touched (92)
XML IDNameModelTypeStatus
achievement_card Achivement Card ir.ui.view qweb New
assets_backend Slides Backend Assets ir.ui.view qweb Inherits web.assets_backend
assets_editor_inherit_website_slides website_slides Assets Editor ir.ui.view qweb Inherits website.assets_editor
assets_frontend Slides Frontend Assets ir.ui.view qweb Inherits website.assets_frontend
assets_tests Slides Tests Assets ir.ui.view qweb Inherits web.assets_tests
course_card Course Card ir.ui.view qweb New
course_card_information Course Information ir.ui.view qweb New
course_card_information_arrow New Content Ribbon ir.ui.view qweb Inherits website_slides.course_card_information
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_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_all Odoo All Courses ir.ui.view qweb New
courses_footer courses_footer ir.ui.view qweb New
courses_home Odoo Courses Homepage 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
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_notification_channel_invite mail_notification_channel_invite ir.ui.view qweb New
private_profile private_profile ir.ui.view qweb Inherits website_profile.private_profile
rating_rating_view_graph_slide_channel rating.rating.view.graph.slides rating.rating graph New
rating_rating_view_kanban_slide_channel rating.rating.view.kanban.slides rating.rating kanban 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 xpath Inherits rating.rating_rating_view_search
res_config_settings_view_form res.config.settings.view.form.inherit.website.slides res.config.settings xpath Inherits website.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.slides res.partner xpath 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_partner_view_search slide.channel.partner.search slide.channel.partner search New
slide_channel_partner_view_tree slide.channel.partner.tree slide.channel.partner tree 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.tree slide.channel.tag.group tree 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.tree slide.channel.tag tree 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_search slide.channel.view.search slide.channel search New
slide_channel_view_tree slide.channel.view.tree slide.channel tree New
slide_channel_view_tree_report slide.channel.view.tree.report slide.channel tree New
slide_content_detailed Slide: Detailed Content ir.ui.view qweb New
slide_edit_options Edit Slide Options ir.ui.view qweb Inherits website.user_navbar
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_icon slide_icon 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.tree slide.question tree New
slide_question_view_tree_report slide.question.view.tree.report slide.question tree 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_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_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_navbar_inherit_website_slides user_navbar_inherit_website_slides ir.ui.view qweb Inherits website.user_navbar
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 field Inherits view_slide_slide_form
view_slide_slide_search slide.slide.filter slide.slide search New
view_slide_slide_tree slide.slide.tree slide.slide tree New
view_slide_tag_form slide.tag.form slide.tag form New
view_slide_tag_tree slide.tag.tree slide.tag tree New
website_slides.slide_embed_assets Website slides embed assets ir.ui.view qweb New
website_slides_tests eLearning tests ir.ui.view qweb Inherits web.qunit_suite_tests
Models touched (20)

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 (1)
  • binary_content(self, xmlid=None, model='ir.attachment', id=None, field='datas', unique=False, filename=None, filename_field='name', download=False, mimetype=None, default_mimetype='application/octet-stream', access_token=None)

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 (3)
  • slide_channel_company_count Integer
    compute='_compute_slide_channel_company_count' args: 'Company Course Count'
  • slide_channel_count Integer
    compute='_compute_slide_channel_count' args: 'Course Count'
  • slide_channel_ids Many2many → slide.channel
    copy=False string='eLearning Courses' args: 'slide.channel', 'slide_channel_partner', 'partner_id', 'channel_id'
Public methods (1)
  • action_view_courses(self)

New fields (0)

No new fields.

Public methods (3)
  • create(self, values)
    @api.model
    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 he selects this answer' translate=True args: 'Comment'
  • is_correct Boolean
    args: 'Is correct answer'
  • question_id Many2one → slide.question
    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 (56)
  • access_token Char
    copy=False default=_default_access_token args: 'Security Token'
  • active Boolean
    default=True tracking=100
  • allow_comment Boolean
    default=True help='If checked it allows members to either:\n * like content and post comments on documentation course;\n * post comment and review on training course;' 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_ids One2many → slide.channel.partner
    depends=['partner_ids'] groups='website_slides.group_website_slides_officer' string='Members Information' args: 'slide.channel.partner', 'channel_id'
  • channel_type Selection
    default='training' 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'
  • completion Integer
    compute='_compute_user_statistics' compute_sudo=False args: 'Completion'
  • description Text
    help='The description that is displayed on top of the course page, just below the title' translate=True args: 'Description'
  • description_html Html
    sanitize_attributes=False sanitize_form=False translate=tools.html_translate args: 'Detailed Description'
  • description_short Text
    help='The description that is displayed on the course card' translate=True args: 'Short Description'
  • enroll Selection
    default='public' help='Condition to enroll: everyone, on invite, on payment (sale bridge).' required=True string='Enroll Policy' args: [('public', 'Public'), ('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_is_member' compute_sudo=False string='Is Member'
  • karma_gen_channel_finish Integer
    default=10 string='Course finished'
  • karma_gen_channel_rank Integer
    default=5 string='Course ranked'
  • karma_gen_slide_vote Integer
    default=1 string='Lesson voted'
  • 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_count Integer
    compute='_compute_members_count' args: 'Attendees count'
  • members_done_count Integer
    compute='_compute_members_done_count' args: 'Attendees Done Count'
  • name Char
    required=True translate=True args: 'Name'
  • nbr_document Integer
    compute='_compute_slides_statistics' store=True args: 'Documents'
  • nbr_infographic Integer
    compute='_compute_slides_statistics' store=True args: 'Infographics'
  • nbr_presentation Integer
    compute='_compute_slides_statistics' store=True args: 'Presentations'
  • nbr_quiz Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Quizs'
  • nbr_video Integer
    compute='_compute_slides_statistics' store=True args: 'Videos'
  • nbr_webpage Integer
    compute='_compute_slides_statistics' store=True args: 'Webpages'
  • partner_has_new_content Boolean
    compute='_compute_partner_has_new_content' compute_sudo=False
  • partner_ids Many2many → res.partner
    context={'active_test': False} copy=False depends=['channel_partner_ids'] help='All members of the channel.' string='Members' args: 'res.partner', 'slide_channel_partner', 'channel_id', 'partner_id'
  • promote_strategy Selection
    default='latest' help="Depending the promote strategy, a slide will appear on the top of the course's page :\n * Latest Published : the slide created last.\n * Most Voted : the slide which has to most votes.\n * Most Viewed ; the slide which has been viewed the most.\n * Specific : You choose the slide to appear.\n * None : No slides will be shown.\n" required=False string='Promoted Content' args: [('latest', 'Latest Published'), ('most_voted', 'Most Voted'), ('most_viewed', 'Most Viewed'), ('specific', 'Specific'), ('none', 'None')]
  • promoted_slide_id Many2one → slide.slide
    string='Promoted Slide' args: 'slide.slide'
  • publish_template_id Many2one → mail.template
    default=<expr> help='Email template to send slide publication through email' string='New Content Email' 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 help='Display order'
  • share_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='Slides' args: 'slide.slide'
  • slide_ids One2many → slide.slide
    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: 'Content'
  • 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
    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='Applied directly as ACLs. Allow to hide channels and their content for non members.' required=True string='Visibility' args: [('public', 'Public'), ('members', 'Members Only')]
Public methods (15)
  • action_add_member(self, **member_values)
    Adds the logged in user in the channel members. (see '_action_add_members' for more info) Returns True if added successfully, False otherwise.
  • action_channel_invite(self)
  • action_grant_access(self, partner_id)
  • action_redirect_to_done_members(self)
  • action_redirect_to_members(self, state=None)
  • action_redirect_to_running_members(self)
  • 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_view_ratings(self)
  • action_view_slides(self)
  • create(self, vals)
    @api.model
  • get_backend_menu_id(self)
  • message_post(self, *, parent_id=False, subtype_id=False, **kwargs)
    @api.returns('mail.message', <expr>)
    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.
  • toggle_active(self)
    Archiving/unarchiving a channel does it on its slides, too. 1. When archiving 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. 2. When un-archiving 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.
  • write(self, vals)

New fields (6)
  • attachment_ids Many2many → ir.attachment
    string='Attachments' args: 'ir.attachment'
  • body Html
    compute='_compute_body' readonly=False sanitize_style=True store=True args: 'Contents'
  • channel_id Many2one → slide.channel
    required=True string='Slide channel' args: 'slide.channel'
  • partner_ids Many2many → res.partner
    string='Recipients' args: 'res.partner'
  • subject Char
    compute='_compute_subject' readonly=False store=True args: 'Subject'
  • template_id Many2one → mail.template
    domain="[('model', '=', 'slide.channel.partner')]" args: 'mail.template', 'Use template'
Public methods (2)
  • action_invite(self)
    Process the wizard content and proceed with sending the related email(s), rendering any template patterns on the fly if needed
  • create(self, values)
    @api.model

New fields (6)
  • channel_id Many2one → slide.channel
    index=True ondelete='cascade' required=True args: 'slide.channel'
  • completed Boolean
    help='Channel validated, even if slides / lessons are added once done.' args: 'Is Completed'
  • completed_slides_count Integer
    args: '# Completed Slides'
  • completion Integer
    args: '% Completed Slides'
  • 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
    help='Color to apply to this tag (including in website).' string='Color Index'
  • group_id Many2one → slide.channel.tag.group
    index=True 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 (3)
  • count_views Integer
    default=1 args: '# Views'
  • slide_id Many2one → slide.slide
    index=True required=True string='Presentation' args: 'slide.slide'
  • url Char
    required=True args: 'Third Party Website URL'
Public methods (0)

No public methods.

New fields (7)
  • answer_ids One2many → slide.answer
    string='Answer' args: 'slide.answer', 'question_id'
  • 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
    required=True string='Content' args: 'slide.slide'
Public methods (0)

No public methods.

New fields (51)
  • active Boolean
    default=True tracking=100
  • category_id Many2one → slide.slide
    compute='_compute_category_id' store=True string='Section' args: 'slide.slide'
  • channel_allow_comment Boolean
    related='channel_id.allow_comment' string='Allows comment'
  • channel_id Many2one → slide.channel
    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
    digits=(10, 4) help='The estimated completion time for this slide' args: 'Duration'
  • datas Binary
    attachment=True args: 'Content'
  • date_published Datetime
    readonly=True tracking=1 args: 'Publish Date'
  • description Text
    translate=True args: 'Description'
  • dislikes Integer
    compute='_compute_like_info' compute_sudo=False store=True args: 'Dislikes'
  • document_id Char
    help='Youtube or Google Document ID' args: 'Document ID'
  • embed_code Text
    compute='_compute_embed_code' readonly=True args: 'Embed Code'
  • embedcount_ids One2many → slide.embed
    string='Embed Count' args: 'slide.embed', 'slide_id'
  • html_content Html
    help="Custom HTML content for slides of type 'Web Page'." sanitize_attributes=False sanitize_form=False translate=True args: 'HTML Content'
  • 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'
  • likes Integer
    compute='_compute_like_info' compute_sudo=False store=True args: 'Likes'
  • link_ids One2many → slide.slide.link
    string='External URL for this slide' args: 'slide.slide.link', 'slide_id'
  • mime_type Char
    args: 'Mime-type'
  • name Char
    required=True translate=True args: 'Title'
  • 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 Infographics'
  • nbr_presentation Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Presentations'
  • 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'
  • nbr_webpage Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Webpages'
  • 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 args: '# of Public Views'
  • question_ids One2many → slide.question
    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_ids One2many → slide.slide
    string='Slides' 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=True help='Allow the user to download the content of the slide.' args: 'Allow Download'
  • slide_resource_ids One2many → slide.slide.resource
    string='Additional Resource for this slide' args: 'slide.slide.resource', 'slide_id'
  • slide_type Selection
    default='document' help='The document type will be set automatically based on the document URL and properties (e.g. height and width for presentation and document).' required=True string='Type' args: [('infographic', 'Infographic'), ('webpage', 'Web Page'), ('presentation', 'Presentation'), ('document', 'Document'), ('video', 'Video'), ('quiz', 'Quiz')]
  • slide_views Integer
    compute='_compute_slide_views' store=True args: '# of Website Views'
  • 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: 'Views'
  • url Char
    help='Youtube or Google Document URL' args: 'Document URL'
  • 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'
  • website_id Many2one
    readonly=True related='channel_id.website_id'
Public methods (12)
  • action_dislike(self)
  • action_like(self)
  • action_set_completed(self)
  • action_set_viewed(self, quiz_attempts_inc=False)
  • copy(self, default=None)
    @api.returns('self', <expr>)
    Sets the sequence to zero so that it always lands at the beginning of the newly selected course as an uncategorized slide
  • create(self, values)
    @api.model
  • get_access_action(self, access_uid=None)
    Instead of the classic form view, redirect to website if it is published.
  • get_backend_menu_id(self)
  • message_post(self, *, message_type='notification', **kwargs)
    @api.returns('mail.message', <expr>)
  • toggle_active(self)
  • unlink(self)
  • write(self, values)

New fields (3)
  • link Char
    required=True args: 'Link'
  • name Char
    required=True args: 'Title'
  • slide_id Many2one → slide.slide
    ondelete='cascade' required=True args: 'slide.slide'
Public methods (0)

No public methods.

New fields (6)
  • 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_id Many2one → slide.slide
    index=True ondelete='cascade' required=True args: 'slide.slide'
  • vote Integer
    default=0 args: 'Vote'
Public methods (2)
  • create(self, values)
  • write(self, values)

New fields (3)
  • data Binary
    args: 'Resource'
  • name Char
    required=True args: 'Name'
  • slide_id Many2one → slide.slide
    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)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/website_slides
VERSION
VERSION 2.0
CATEGORY
CATEGORYWebsite/Website
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Richard Mathot, Aaron Bohy, Jeremy Kersten, Lucas Perais (lpe), Damien Bouvy, Yannick Tivisse, qsm-odoo, Odoo Online, Romain Derie, jem-odoo, Jorge Pinna Puissant, Alexandre Kühn, Adrian Torres, Julien Castiaux, Aurélien Warnon, Priyanka Kakadiya, Xavier-Do, jvm-odoo, mgh-odoo, jerome hanke (jhk), Victor Feyens, Andrea Grazioso (agr-odoo), Sébastien Theys, Nasreddin (bon), fw-bot, Achraf (abz), David Beguin, Lucas Lefèvre, Adrien Widart, sri-odoo, Philémon van Helden, Nasreddin Boulif (bon), Nathan Marotte (nama), IEL, fja-odoo, Djamel (otd), Parth Choksi, Yenthe666, jbm-odoo, qmo-odoo, mcm-odoo, laa, ryv-odoo, jpr-odoo, Patrick Hoste, Juhil Somaiya, Julien Banken, Florent Lejoly, Pierrot (prro)
WEBSITE
WEBSITEhttps://www.odoo.com/page/slides
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:44
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - website
    - web
    - base
    - web_editor
    - http_routing
    - portal
    - mail
    - base_setup
    - bus
    - web_tour
    - auth_signup
    - social_media
    - website_mail
    - website_profile
    - website_partner
    - gamification
    - web_kanban_gauge
    - website_rating
    - rating
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Create Online Courses
=====================

Featuring

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

Code Analysis

Views touched (80)
XML IDNameModelTypeStatus
achievement_card Achivement Card ir.ui.view qweb New
assets_backend Slides Backend Assets ir.ui.view qweb Inherits web.assets_backend
assets_editor_inherit_website_slides website_slides Assets Editor ir.ui.view qweb Inherits website.assets_editor
assets_frontend Slides Frontend Assets ir.ui.view qweb Inherits website.assets_frontend
assets_tests Slides Tests Assets ir.ui.view qweb Inherits web.assets_tests
course_card Course Card 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_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_slide Slide template for a training channel ir.ui.view qweb New
courses_all Odoo All Courses ir.ui.view qweb New
courses_footer courses_footer ir.ui.view qweb New
courses_home Odoo Courses Homepage 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
lesson_card Lesson Card ir.ui.view qweb New
lesson_content_quiz Lesson: Quiz specific content ir.ui.view qweb New
private_profile private_profile ir.ui.view qweb Inherits website_profile.private_profile
rating_rating_view_graph_slide_channel rating.rating.view.graph.slides rating.rating graph New
rating_rating_view_kanban_slide_channel rating.rating.view.kanban.slides rating.rating kanban 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 xpath Inherits rating.rating_rating_view_search
res_config_settings_view_form res.config.settings.view.form.inherit.website.slides res.config.settings xpath Inherits website.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.slides res.partner xpath 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_partner_view_search slide.channel.partner.search slide.channel.partner search New
slide_channel_partner_view_tree slide.channel.partner.tree slide.channel.partner tree 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.tree slide.channel.tag.group tree 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.tree slide.channel.tag tree 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_search slide.channel.view.search slide.channel search New
slide_channel_view_tree slide.channel.view.tree slide.channel tree New
slide_channel_view_tree_report slide.channel.view.tree.report slide.channel tree New
slide_content_detailed Slide: Detailed Content ir.ui.view qweb New
slide_edit_options Edit Slide Options ir.ui.view qweb Inherits website.user_navbar
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_icon slide_icon 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.tree slide.question tree New
slide_question_view_tree_report slide.question.view.tree.report slide.question tree 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_social_email Share by Email ir.ui.view qweb New
slide_social_embed Share on Your Website ir.ui.view qweb New
slide_social_media Share on Social Networks 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
slides_share Slides Media Share 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_navbar_inherit_website_slides user_navbar_inherit_website_slides ir.ui.view qweb Inherits website.user_navbar
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 field Inherits view_slide_slide_form
view_slide_slide_search slide.slide.filter slide.slide search New
view_slide_slide_tree slide.slide.tree slide.slide tree New
view_slide_tag_form slide.tag.form slide.tag form New
view_slide_tag_tree slide.tag.tree slide.tag tree New
website_slides.slide_embed_assets Website slides embed assets ir.ui.view qweb New
Models touched (19)

New fields (1)
  • category Selection
    selection_add=[('slides', 'Website / Slides')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • binary_content(self, xmlid=None, model='ir.attachment', id=None, field='datas', unique=False, filename=None, filename_field='name', download=False, mimetype=None, default_mimetype='application/octet-stream', access_token=None)

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 (3)
  • slide_channel_company_count Integer
    compute='_compute_slide_channel_company_count' args: 'Company Course Count'
  • slide_channel_count Integer
    compute='_compute_slide_channel_count' args: 'Course Count'
  • slide_channel_ids Many2many → slide.channel
    string='eLearning Courses' args: 'slide.channel', 'slide_channel_partner', 'partner_id', 'channel_id'
Public methods (1)
  • action_view_courses(self)

New fields (0)

No new fields.

Public methods (3)
  • create(self, values)
    @api.model
    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 (3)
  • is_correct Boolean
    args: 'Is correct answer'
  • question_id Many2one → slide.question
    ondelete='cascade' required=True string='Question' args: 'slide.question'
  • text_value Char
    required=True translate=True args: 'Answer'
Public methods (0)

No public methods.

New fields (52)
  • access_token Char
    copy=False default=_default_access_token args: 'Security Token'
  • active Boolean
    default=True
  • allow_comment Boolean
    default=False help='If checked it allows members to either:\n * like content and post comments on documentation course;\n * post comment and review on training course;' 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_ids One2many → slide.channel.partner
    depends=['partner_ids'] groups='website.group_website_publisher' string='Members Information' args: 'slide.channel.partner', 'channel_id'
  • channel_type Selection
    default='documentation' required=True string='Course type' args: [('documentation', 'Documentation'), ('training', 'Training')]
  • color Integer
    default=0 help='Used to decorate kanban view' args: 'Color Index'
  • completed Boolean
    compute='_compute_user_statistics' compute_sudo=False args: 'Done'
  • completion Integer
    compute='_compute_user_statistics' compute_sudo=False args: 'Completion'
  • description Text
    translate=True args: 'Short Description'
  • description_html Html
    sanitize_attributes=False translate=tools.html_translate args: 'Description'
  • enroll Selection
    default='public' help='Condition to enroll: everyone, on invite, on payment (sale bridge).' required=True string='Enroll Policy' args: [('public', 'Public'), ('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=False help='Message explaining the enroll process' sanitize_attributes=False translate=tools.html_translate args: 'Enroll Message'
  • is_member Boolean
    compute='_compute_is_member' string='Is Member'
  • karma_gen_channel_finish Integer
    default=10 string='Course finished'
  • karma_gen_channel_rank Integer
    default=5 string='Course ranked'
  • karma_gen_slide_vote Integer
    default=1 string='Lesson voted'
  • 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_count Integer
    compute='_compute_members_count' args: 'Attendees count'
  • members_done_count Integer
    compute='_compute_members_done_count' args: 'Attendees Done Count'
  • name Char
    required=True translate=True args: 'Name'
  • nbr_document Integer
    compute='_compute_slides_statistics' store=True args: 'Documents'
  • nbr_infographic Integer
    compute='_compute_slides_statistics' store=True args: 'Infographics'
  • nbr_presentation Integer
    compute='_compute_slides_statistics' store=True args: 'Presentations'
  • nbr_quiz Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Quizs'
  • nbr_video Integer
    compute='_compute_slides_statistics' store=True args: 'Videos'
  • nbr_webpage Integer
    compute='_compute_slides_statistics' store=True args: 'Webpages'
  • partner_ids Many2many → res.partner
    context={'active_test': False} copy=False depends=['channel_partner_ids'] help='All members of the channel.' string='Members' args: 'res.partner', 'slide_channel_partner', 'channel_id', 'partner_id'
  • promote_strategy Selection
    default='latest' required=True string='Featured Content' args: [('latest', 'Latest Published'), ('most_voted', 'Most Voted'), ('most_viewed', 'Most Viewed')]
  • publish_template_id Many2one → mail.template
    default=<expr> help='Email template to send slide publication through email' string='New Content Email' args: 'mail.template'
  • rating_avg_stars Float
    compute='_compute_rating_stats' digits=(16, 1) args: 'Rating Average (Stars)'
  • sequence Integer
    default=10 help='Display order'
  • share_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='Slides' args: 'slide.slide'
  • slide_ids One2many → slide.slide
    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.group_website_publisher' 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: 'Content'
  • 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
    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='Applied directly as ACLs. Allow to hide channels and their content for non members.' required=True string='Visibility' args: [('public', 'Public'), ('members', 'Members Only')]
Public methods (11)
  • action_add_member(self, **member_values)
    Adds the logged in user in the channel members. (see '_action_add_members' for more info) Returns True if added successfully, False otherwise.
  • action_channel_invite(self)
  • action_redirect_to_done_members(self)
  • action_redirect_to_members(self, state=None)
  • action_redirect_to_running_members(self)
  • action_view_ratings(self)
  • action_view_slides(self)
  • create(self, vals)
    @api.model
  • get_backend_menu_id(self)
  • message_post(self, *, parent_id=False, subtype=None, **kwargs)
    @api.returns('mail.message', <expr>)
    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.
  • write(self, vals)

New fields (9)
  • attachment_ids Many2many → ir.attachment
    string='Attachments' args: 'ir.attachment'
  • author_id Many2one → res.partner
    default=_default_author_id ondelete='set null' args: 'res.partner', 'Author'
  • body Html
    default='' sanitize_style=True args: 'Contents'
  • channel_id Many2one → slide.channel
    required=True string='Slide channel' args: 'slide.channel'
  • channel_url Char
    readonly=True related='channel_id.website_url'
  • email_from Char
    default=_default_email_from args: 'From'
  • partner_ids Many2many → res.partner
    string='Recipients' args: 'res.partner'
  • subject Char
    args: 'Subject'
  • template_id Many2one → mail.template
    domain="[('model', '=', 'slide.channel.partner')]" args: 'mail.template', 'Use template'
Public methods (2)
  • action_invite(self)
    Process the wizard content and proceed with sending the related email(s), rendering any template patterns on the fly if needed
  • create(self, values)
    @api.model

New fields (5)
  • channel_id Many2one → slide.channel
    index=True ondelete='cascade' required=True args: 'slide.channel'
  • completed Boolean
    help='Channel validated, even if slides / lessons are added once done.' args: 'Is Completed'
  • completion Integer
    args: '# Completed Slides'
  • 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 (5)
  • channel_ids Many2many → slide.channel
    string='Channels' args: 'slide.channel', 'slide_channel_tag_rel', 'tag_id', 'channel_id'
  • group_id Many2one → slide.channel.tag.group
    index=True 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: '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 (3)
  • count_views Integer
    default=1 args: '# Views'
  • slide_id Many2one → slide.slide
    index=True required=True string='Presentation' args: 'slide.slide'
  • url Char
    required=True args: 'Third Party Website URL'
Public methods (0)

No public methods.

New fields (7)
  • answer_ids One2many → slide.answer
    string='Answer' args: 'slide.answer', 'question_id'
  • attempts_avg Float
    compute='_compute_statistics' digits=(6, 2) groups='website.group_website_publisher'
  • attempts_count Integer
    compute='_compute_statistics' groups='website.group_website_publisher'
  • done_count Integer
    compute='_compute_statistics' groups='website.group_website_publisher'
  • question Char
    required=True translate=True args: 'Question Name'
  • sequence Integer
    default=10 args: 'Sequence'
  • slide_id Many2one → slide.slide
    required=True string='Content' args: 'slide.slide'
Public methods (0)

No public methods.

New fields (48)
  • active Boolean
    default=True
  • category_id Many2one → slide.slide
    compute='_compute_category_id' store=True string='Section' args: 'slide.slide'
  • channel_allow_comment Boolean
    related='channel_id.allow_comment' string='Allows comment'
  • channel_id Many2one → slide.channel
    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
    digits=(10, 4) help='The estimated completion time for this slide' args: 'Duration'
  • datas Binary
    attachment=True args: 'Content'
  • date_published Datetime
    readonly=True tracking=True args: 'Publish Date'
  • description Text
    translate=True args: 'Description'
  • dislikes Integer
    compute='_compute_like_info' compute_sudo=False store=True args: 'Dislikes'
  • document_id Char
    help='Youtube or Google Document ID' args: 'Document ID'
  • embed_code Text
    compute='_compute_embed_code' readonly=True args: 'Embed Code'
  • embedcount_ids One2many → slide.embed
    string='Embed Count' args: 'slide.embed', 'slide_id'
  • html_content Html
    help="Custom HTML content for slides of type 'Web Page'." sanitize_attributes=False sanitize_form=False translate=True args: 'HTML Content'
  • is_category Boolean
    default=False args: 'Is a category'
  • 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'
  • likes Integer
    compute='_compute_like_info' compute_sudo=False store=True args: 'Likes'
  • link_ids One2many → slide.slide.link
    string='External URL for this slide' args: 'slide.slide.link', 'slide_id'
  • mime_type Char
    args: 'Mime-type'
  • name Char
    required=True translate=True args: 'Title'
  • 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 Infographics'
  • nbr_presentation Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Presentations'
  • 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'
  • nbr_webpage Integer
    compute='_compute_slides_statistics' store=True args: 'Number of Webpages'
  • partner_ids Many2many → res.partner
    copy=False groups='website.group_website_publisher' string='Subscribers' args: 'res.partner', 'slide_slide_partner', 'slide_id', 'partner_id'
  • public_views Integer
    copy=False args: '# of Public Views'
  • question_ids One2many → slide.question
    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: 'First attempt reward'
  • quiz_fourth_attempt_reward Integer
    default=2 args: 'Reward for every attempt after the third try'
  • quiz_second_attempt_reward Integer
    default=7 args: 'Second attempt reward'
  • quiz_third_attempt_reward Integer
    default=5 args: 'Third attempt reward'
  • sequence Integer
    default=0 args: 'Sequence'
  • slide_ids One2many → slide.slide
    string='Slides' args: 'slide.slide', 'category_id'
  • slide_partner_ids One2many → slide.slide.partner
    copy=False groups='website.group_website_publisher' string='Subscribers information' args: 'slide.slide.partner', 'slide_id'
  • slide_type Selection
    default='document' help='The document type will be set automatically based on the document URL and properties (e.g. height and width for presentation and document).' required=True string='Type' args: [('infographic', 'Infographic'), ('webpage', 'Web Page'), ('presentation', 'Presentation'), ('document', 'Document'), ('video', 'Video'), ('quiz', 'Quiz')]
  • slide_views Integer
    compute='_compute_slide_views' store=True args: '# of Website Views'
  • 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: 'Views'
  • url Char
    help='Youtube or Google Document URL' args: 'Document URL'
  • 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'
  • website_id Many2one
    readonly=True related='channel_id.website_id'
Public methods (11)
  • action_dislike(self)
  • action_like(self)
  • action_set_completed(self)
  • action_set_viewed(self, quiz_attempts_inc=False)
  • copy(self, default=None)
    @api.returns('self', <expr>)
    Sets the sequence to zero so that it always lands at the beginning of the newly selected course as an uncategorized slide
  • create(self, values)
    @api.model
  • get_access_action(self, access_uid=None)
    Instead of the classic form view, redirect to website if it is published.
  • get_backend_menu_id(self)
  • message_post(self, *, message_type='notification', **kwargs)
    @api.returns('mail.message', <expr>)
  • unlink(self)
  • write(self, values)

New fields (3)
  • link Char
    required=True args: 'Link'
  • name Char
    required=True args: 'Title'
  • slide_id Many2one → slide.slide
    ondelete='cascade' required=True args: 'slide.slide'
Public methods (0)

No public methods.

New fields (6)
  • 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_id Many2one → slide.slide
    index=True ondelete='cascade' required=True args: 'slide.slide'
  • vote Integer
    default=0 args: 'Vote'
Public methods (2)
  • create(self, values)
  • write(self, values)

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
    args: 'Google Doc Key'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/website_slides
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Christophe Simonis, Jeremy Kersten, GitHub, Yannick Tivisse, Alexandre Kühn, qsm-odoo, Romain Derie, Jairo Llopis, Alexandre Kühn, Adrian Torres, Julien Castiaux, Aurélien Warnon, Xavier-Do, jvm-odoo, Sébastien Theys, fw-bot, Quentin Smetz (qsm)
WEBSITE
WEBSITEhttps://www.odoo.com/page/slides
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:02
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - website
    - web
    - base
    - web_editor
    - http_routing
    - portal
    - mail
    - base_setup
    - bus
    - web_tour
    - social_media
    - website_mail
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Share and Publish Videos, Presentations and Documents'
======================================================

 * Website Application
 * Channel Management
 * Filters and Tagging
 * Statistics of Presentation
 * Channel Subscription
 * Supported document types : PDF, images, YouTube videos and Google Drive documents)

Code Analysis

Views touched (32)
XML IDNameModelTypeStatus
assets_editor_inherit_website_slides website_slides Assets Editor ir.ui.view qweb Inherits website.assets_editor
assets_frontend Slide ir.ui.view qweb Inherits website.assets_frontend
channel_not_found Private Presentation ir.ui.view qweb New
channels Channels 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
home Odoo Slides ir.ui.view qweb New
opt_subscription_on_channels Subscription ir.ui.view qweb Inherits website_slides.channels
related_slides Related Slide ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.website.slides res.config.settings div Inherits website.res_config_settings_view_form
slide_channel_view_search slide.channel.search slide.channel search New
slide_detail_view Slide Detailed View ir.ui.view qweb New
slide_edit_options Edit Slide Options ir.ui.view qweb Inherits website.user_navbar
slide_social_email Share by Email ir.ui.view qweb New
slide_social_embed Share on Your Website ir.ui.view qweb New
slide_social_media Share on Social Networks ir.ui.view qweb New
slides_channel_header Slides Channel Header ir.ui.view qweb New
slides_grid_view Slides (Grid View) ir.ui.view qweb New
slides_search Searching Slides ir.ui.view qweb New
slides_share Slides Media Share ir.ui.view qweb New
user_navbar_inherit_website_slides user_navbar_inherit_website_slides ir.ui.view qweb Inherits website.user_navbar
view_slide_channel_form slide.channel.form slide.channel form New
view_slide_channel_tree slide.channel.tree slide.channel tree New
view_slide_slide_form slide.slide.form slide.slide form New
view_slide_slide_graph slide.slide.graph slide.slide graph New
view_slide_slide_search slide.slide.filter slide.slide search New
view_slide_slide_tree slide.slide.tree slide.slide tree New
view_slide_tag_form slide.tag.form slide.tag form New
view_slide_tag_tree slide.tag.tree slide.tag tree New
view_slides_category_form slide.category.form slide.category form New
view_slides_category_tree slide.category.tree slide.category tree New
website_slides.slide_embed_assets Website slides embed assets ir.ui.view qweb New
Models touched (7)

New fields (1)
  • website_slide_google_app_key Char
    readonly=False related='website_id.website_slide_google_app_key'
Public methods (0)

No public methods.

New fields (9)
  • channel_id Many2one → slide.channel
    ondelete='cascade' required=True string='Channel' args: 'slide.channel'
  • name Char
    required=True translate=True args: 'Name'
  • nbr_documents Integer
    compute='_count_presentations' store=True args: 'Number of Documents'
  • nbr_infographics Integer
    compute='_count_presentations' store=True args: 'Number of Infographics'
  • nbr_presentations Integer
    compute='_count_presentations' store=True args: 'Number of Presentations'
  • nbr_videos Integer
    compute='_count_presentations' store=True args: 'Number of Videos'
  • sequence Integer
    default=10 help='Display order'
  • slide_ids One2many → slide.slide
    string='Slides' args: 'slide.slide', 'category_id'
  • total Integer
    compute='_count_presentations' store=True
Public methods (0)

No public methods.

New fields (23)
  • access_error_msg Html
    default=<expr> help='Message to display when not accessible due to access rights' sanitize_attributes=False translate=html_translate args: 'Error Message'
  • active Boolean
    default=True
  • can_see Boolean
    compute='_compute_access' search='_search_can_see' args: 'Can See'
  • can_see_full Boolean
    compute='_compute_access' args: 'Full Access'
  • can_upload Boolean
    compute='_compute_access' args: 'Can Upload'
  • category_ids One2many → slide.category
    string='Categories' args: 'slide.category', 'channel_id'
  • custom_slide_id Many2one → slide.slide
    string='Slide to Promote' args: 'slide.slide'
  • description Html
    sanitize_attributes=False translate=html_translate args: 'Description'
  • group_ids Many2many → res.groups
    help='Groups allowed to see presentations in this channel' string='Channel Groups' args: 'res.groups', 'rel_channel_groups', 'channel_id', 'group_id'
  • name Char
    required=True translate=True args: 'Name'
  • nbr_documents Integer
    compute='_count_presentations' store=True args: 'Number of Documents'
  • nbr_infographics Integer
    compute='_count_presentations' store=True args: 'Number of Infographics'
  • nbr_presentations Integer
    compute='_count_presentations' store=True args: 'Number of Presentations'
  • nbr_videos Integer
    compute='_count_presentations' store=True args: 'Number of Videos'
  • promote_strategy Selection
    default='most_voted' required=True string='Featuring Policy' args: [('none', 'No Featured Presentation'), ('latest', 'Latest Published'), ('most_voted', 'Most Voted'), ('most_viewed', 'Most Viewed'), ('custom', 'Featured Presentation')]
  • promoted_slide_id Many2one → slide.slide
    compute='_compute_promoted_slide_id' store=True string='Featured Slide' args: 'slide.slide'
  • publish_template_id Many2one → mail.template
    default=<expr> help='Email template to send slide publication through email' string='Published Template' args: 'mail.template'
  • sequence Integer
    default=10 help='Display order'
  • share_template_id Many2one → mail.template
    default=<expr> help='Email template used when sharing a slide' string='Shared Template' args: 'mail.template'
  • slide_ids One2many → slide.slide
    string='Slides' args: 'slide.slide', 'channel_id'
  • total Integer
    compute='_count_presentations' store=True
  • upload_group_ids Many2many → res.groups
    help='Groups allowed to upload presentations in this channel. If void, every user can upload.' string='Upload Groups' args: 'res.groups', 'rel_upload_groups', 'channel_id', 'group_id'
  • visibility Selection
    default='public' required=True args: [('public', 'Public'), ('private', 'Private'), ('partial', 'Show channel but restrict presentations')]
Public methods (5)
  • change_visibility(self)
    @api.onchange('visibility')
  • get_base_url(self)
    @api.multi
  • list_all(self)
  • message_post(self, parent_id=False, subtype=None, **kwargs)
    @api.multi@api.returns('mail.message', <expr>)
    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.
  • write(self, vals)
    @api.multi

New fields (3)
  • count_views Integer
    default=1 args: '# Views'
  • slide_id Many2one → slide.slide
    index=True required=True string='Presentation' args: 'slide.slide'
  • url Char
    required=True args: 'Third Party Website URL'
Public methods (1)
  • add_embed_url(self, slide_id, url)

New fields (25)
  • active Boolean
    default=True
  • category_id Many2one → slide.category
    domain="[('channel_id', '=', channel_id)]" string='Category' args: 'slide.category'
  • channel_id Many2one → slide.channel
    required=True string='Channel' args: 'slide.channel'
  • datas Binary
    attachment=True args: 'Content'
  • date_published Datetime
    args: 'Publish Date'
  • description Text
    translate=True args: 'Description'
  • dislikes Integer
    args: 'Dislikes'
  • document_id Char
    help='Youtube or Google Document ID' args: 'Document ID'
  • download_security Selection
    default='user' required=True string='Download Security' args: [('none', 'No One'), ('user', 'Authenticated Users Only'), ('public', 'Everyone')]
  • embed_code Text
    compute='_get_embed_code' readonly=True args: 'Embed Code'
  • embed_views Integer
    args: '# of Embedded Views'
  • embedcount_ids One2many → slide.embed
    string='Embed Count' args: 'slide.embed', 'slide_id'
  • image Binary
    attachment=True args: 'Image'
  • image_medium Binary
    attachment=True compute='_get_image' store=True args: 'Medium'
  • image_thumb Binary
    attachment=True compute='_get_image' store=True args: 'Thumbnail'
  • index_content Text
    args: 'Transcript'
  • likes Integer
    args: 'Likes'
  • mime_type Char
    args: 'Mime-type'
  • name Char
    required=True translate=True args: 'Title'
  • slide_type Selection
    default='document' help='The document type will be set automatically based on the document URL and properties (e.g. height and width for presentation and document).' required=True string='Type' args: [('infographic', 'Infographic'), ('presentation', 'Presentation'), ('document', 'Document'), ('video', 'Video')]
  • slide_views Integer
    args: '# of Website Views'
  • tag_ids Many2many → slide.tag
    string='Tags' args: 'slide.tag', 'rel_slide_tag', 'slide_id', 'tag_id'
  • total_views Integer
    compute='_compute_total' default='0' store=True args: 'Total # Views'
  • url Char
    help='Youtube or Google Document URL' args: 'Document URL'
  • website_id Many2one
    readonly=True related='channel_id.website_id'
Public methods (8)
  • check_field_access_rights(self, operation, fields)
    @api.model
    As per channel access configuration (visibility) - public ==> no restriction on slides access - private ==> restrict all slides of channel based on access group defined on channel group_ids field - partial ==> show channel, but presentations based on groups means any user can see channel but not slide's content. For private: implement using record rule For partial: user can see channel, but channel gridview have slide detail so we have to implement partial field access mechanism for public user so he can have access of promotional field (name, view_count) of slides, but not all fields like data (actual pdf content) all fields should be accessible only for user group defined on channel group_ids
  • create(self, values)
    @api.model
  • get_access_action(self, access_uid=None)
    @api.multi
    Instead of the classic form view, redirect to website if it is published.
  • get_most_viewed_slides(self, limit=20)
  • get_related_slides(self, limit=20)
  • on_change_url(self)
    @api.onchange('url')
  • send_share_email(self, email)
    @api.one
  • write(self, values)
    @api.multi

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
    args: 'Google Doc Key'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/11.0/website_slides
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Nicolas Lempereur, Jérome Maes, Aaron Bohy, Jeremy Kersten, GitHub, Lucas Perais (lpe), Yannick Tivisse, qsm-odoo, Odoo Online
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:44
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - website
    - web
    - base
    - web_editor
    - web_planner
    - http_routing
    - portal
    - mail
    - base_setup
    - bus
    - web_tour
    - website_mail
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Share and Publish Videos, Presentations and Documents'
======================================================

 * Website Application
 * Channel Management
 * Filters and Tagging
 * Statistics of Presentation
 * Channel Subscription
 * Supported document types : PDF, images, YouTube videos and Google Drive documents)

Code Analysis

Views touched (31)
XML IDNameModelTypeStatus
assets_frontend Slide ir.ui.view qweb Inherits website.assets_frontend
channel_not_found Private Presentation ir.ui.view qweb New
channels Channels 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
home Odoo Slides ir.ui.view qweb New
opt_subscription_on_channels Subscription ir.ui.view qweb Inherits website_slides.channels
related_slides Related Slide ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.website.slides res.config.settings div Inherits website.res_config_settings_view_form
slide_channel_view_search slide.channel.search slide.channel search New
slide_detail_view Slide Detailed View ir.ui.view qweb New
slide_edit_options Edit Slide Options ir.ui.view qweb Inherits website.user_navbar
slide_footer Footer Slides Link ir.ui.view qweb Inherits website.footer_default
slide_social_email Share by Email ir.ui.view qweb New
slide_social_embed Share on Your Website ir.ui.view qweb New
slide_social_media Share on Social Networks ir.ui.view qweb New
slides_channel_header Slides Channel Header ir.ui.view qweb New
slides_grid_view Slides (Grid View) ir.ui.view qweb New
slides_search Searching Slides ir.ui.view qweb New
slides_share Slides Media Share ir.ui.view qweb New
view_slide_channel_form slide.channel.form slide.channel form New
view_slide_channel_tree slide.channel.tree slide.channel tree New
view_slide_slide_form slide.slide.form slide.slide form New
view_slide_slide_graph slide.slide.graph slide.slide graph New
view_slide_slide_search slide.slide.filter slide.slide search New
view_slide_slide_tree slide.slide.tree slide.slide tree New
view_slide_tag_form slide.tag.form slide.tag form New
view_slide_tag_tree slide.tag.tree slide.tag tree New
view_slides_category_form slide.category.form slide.category form New
view_slides_category_tree slide.category.tree slide.category tree New
website_slides.slide_embed_assets Website slides embed assets ir.ui.view qweb New
Models touched (6)

New fields (1)
  • website_slide_google_app_key Char
    string='Google Doc Key'
Public methods (2)
  • get_values(self)
    @api.model
  • set_values(self)
    @api.multi

New fields (9)
  • channel_id Many2one → slide.channel
    ondelete='cascade' required=True string='Channel' args: 'slide.channel'
  • name Char
    required=True translate=True args: 'Name'
  • nbr_documents Integer
    compute='_count_presentations' store=True args: 'Number of Documents'
  • nbr_infographics Integer
    compute='_count_presentations' store=True args: 'Number of Infographics'
  • nbr_presentations Integer
    compute='_count_presentations' store=True args: 'Number of Presentations'
  • nbr_videos Integer
    compute='_count_presentations' store=True args: 'Number of Videos'
  • sequence Integer
    default=10 help='Display order'
  • slide_ids One2many → slide.slide
    string='Slides' args: 'slide.slide', 'category_id'
  • total Integer
    compute='_count_presentations' store=True
Public methods (0)

No public methods.

New fields (23)
  • access_error_msg Html
    default=<expr> help='Message to display when not accessible due to access rights' sanitize_attributes=False translate=html_translate args: 'Error Message'
  • active Boolean
    default=True
  • can_see Boolean
    compute='_compute_access' search='_search_can_see' args: 'Can See'
  • can_see_full Boolean
    compute='_compute_access' args: 'Full Access'
  • can_upload Boolean
    compute='_compute_access' args: 'Can Upload'
  • category_ids One2many → slide.category
    string='Categories' args: 'slide.category', 'channel_id'
  • custom_slide_id Many2one → slide.slide
    string='Slide to Promote' args: 'slide.slide'
  • description Html
    sanitize_attributes=False translate=html_translate args: 'Description'
  • group_ids Many2many → res.groups
    help='Groups allowed to see presentations in this channel' string='Channel Groups' args: 'res.groups', 'rel_channel_groups', 'channel_id', 'group_id'
  • name Char
    required=True translate=True args: 'Name'
  • nbr_documents Integer
    compute='_count_presentations' store=True args: 'Number of Documents'
  • nbr_infographics Integer
    compute='_count_presentations' store=True args: 'Number of Infographics'
  • nbr_presentations Integer
    compute='_count_presentations' store=True args: 'Number of Presentations'
  • nbr_videos Integer
    compute='_count_presentations' store=True args: 'Number of Videos'
  • promote_strategy Selection
    default='most_voted' required=True string='Featuring Policy' args: [('none', 'No Featured Presentation'), ('latest', 'Latest Published'), ('most_voted', 'Most Voted'), ('most_viewed', 'Most Viewed'), ('custom', 'Featured Presentation')]
  • promoted_slide_id Many2one → slide.slide
    compute='_compute_promoted_slide_id' store=True string='Featured Slide' args: 'slide.slide'
  • publish_template_id Many2one → mail.template
    default=<expr> help='Email template to send slide publication through email' string='Published Template' args: 'mail.template'
  • sequence Integer
    default=10 help='Display order'
  • share_template_id Many2one → mail.template
    default=<expr> help='Email template used when sharing a slide' string='Shared Template' args: 'mail.template'
  • slide_ids One2many → slide.slide
    string='Slides' args: 'slide.slide', 'channel_id'
  • total Integer
    compute='_count_presentations' store=True
  • upload_group_ids Many2many → res.groups
    help='Groups allowed to upload presentations in this channel. If void, every user can upload.' string='Upload Groups' args: 'res.groups', 'rel_upload_groups', 'channel_id', 'group_id'
  • visibility Selection
    default='public' required=True args: [('public', 'Public'), ('private', 'Private'), ('partial', 'Show channel but restrict presentations')]
Public methods (3)
  • change_visibility(self)
    @api.onchange('visibility')
  • message_post(self, parent_id=False, subtype=None, **kwargs)
    @api.multi@api.returns('self', <expr>)
    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.
  • write(self, vals)
    @api.multi

New fields (3)
  • count_views Integer
    default=1 args: '# Views'
  • slide_id Many2one → slide.slide
    index=True required=True string='Presentation' args: 'slide.slide'
  • url Char
    required=True args: 'Third Party Website URL'
Public methods (1)
  • add_embed_url(self, slide_id, url)

New fields (24)
  • active Boolean
    default=True
  • category_id Many2one → slide.category
    domain="[('channel_id', '=', channel_id)]" string='Category' args: 'slide.category'
  • channel_id Many2one → slide.channel
    required=True string='Channel' args: 'slide.channel'
  • datas Binary
    attachment=True args: 'Content'
  • date_published Datetime
    args: 'Publish Date'
  • description Text
    translate=True args: 'Description'
  • dislikes Integer
    args: 'Dislikes'
  • document_id Char
    help='Youtube or Google Document ID' args: 'Document ID'
  • download_security Selection
    default='user' required=True string='Download Security' args: [('none', 'No One'), ('user', 'Authenticated Users Only'), ('public', 'Everyone')]
  • embed_code Text
    compute='_get_embed_code' readonly=True args: 'Embed Code'
  • embed_views Integer
    args: '# of Embedded Views'
  • embedcount_ids One2many → slide.embed
    string='Embed Count' args: 'slide.embed', 'slide_id'
  • image Binary
    attachment=True args: 'Image'
  • image_medium Binary
    attachment=True compute='_get_image' store=True args: 'Medium'
  • image_thumb Binary
    attachment=True compute='_get_image' store=True args: 'Thumbnail'
  • index_content Text
    args: 'Transcript'
  • likes Integer
    args: 'Likes'
  • mime_type Char
    args: 'Mime-type'
  • name Char
    required=True translate=True args: 'Title'
  • slide_type Selection
    default='document' help='The document type will be set automatically based on the document URL and properties (e.g. height and width for presentation and document).' required=True string='Type' args: [('infographic', 'Infographic'), ('presentation', 'Presentation'), ('document', 'Document'), ('video', 'Video')]
  • slide_views Integer
    args: '# of Website Views'
  • tag_ids Many2many → slide.tag
    string='Tags' args: 'slide.tag', 'rel_slide_tag', 'slide_id', 'tag_id'
  • total_views Integer
    compute='_compute_total' default='0' store=True args: 'Total # Views'
  • url Char
    help='Youtube or Google Document URL' args: 'Document URL'
Public methods (8)
  • check_field_access_rights(self, operation, fields)
    @api.model
    As per channel access configuration (visibility) - public ==> no restriction on slides access - private ==> restrict all slides of channel based on access group defined on channel group_ids field - partial ==> show channel, but presentations based on groups means any user can see channel but not slide's content. For private: implement using record rule For partial: user can see channel, but channel gridview have slide detail so we have to implement partial field access mechanism for public user so he can have access of promotional field (name, view_count) of slides, but not all fields like data (actual pdf content) all fields should be accessible only for user group defined on channel group_ids
  • create(self, values)
    @api.model
  • get_access_action(self, access_uid=None)
    @api.multi
    Instead of the classic form view, redirect to website if it is published.
  • get_most_viewed_slides(self, limit=20)
  • get_related_slides(self, limit=20)
  • on_change_url(self)
    @api.onchange('url')
  • send_share_email(self, email)
    @api.one
  • write(self, values)
    @api.multi

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

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/10.0/website_slides
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Fabien Meghazi, Christophe Simonis, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Lucas Perais (lpe), Yannick Tivisse, qsm-odoo, Denis Vermylen (dve), Jairo Llopis, Aurélien Warnon
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:50:49
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - website
    - web
    - base
    - web_editor
    - web_planner
    - website_mail
    - mail
    - base_setup
    - web_kanban
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Share and Publish Videos, Presentations and Documents'
======================================================

 * Website Application
 * Channel Management
 * Filters and Tagging
 * Statistics of Presentation
 * Channel Subscription
 * Supported document types : PDF, images, YouTube videos and Google Drive documents)

Code Analysis

Views touched (30)
XML IDNameModelTypeStatus
assets_frontend Slide ir.ui.view qweb Inherits website.assets_frontend
channel_not_found Private Presentation ir.ui.view qweb New
channels Channels 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
home Odoo Slides ir.ui.view qweb New
opt_subscription_on_channels Subscription ir.ui.view qweb Inherits website_slides.channels
related_slides Related Slide ir.ui.view qweb New
slide_channel_view_search slide.channel.search slide.channel search New
slide_detail_view Slide Detailed View ir.ui.view qweb New
slide_footer Footer Slides Link ir.ui.view qweb Inherits website.footer_default
slide_social_email Share by Email ir.ui.view qweb New
slide_social_embed Share on Your Website ir.ui.view qweb New
slide_social_media Share on Social Networks ir.ui.view qweb New
slides_channel_header Slides Channel Header ir.ui.view qweb New
slides_grid_view Slides (Grid View) ir.ui.view qweb New
slides_search Searching Slides ir.ui.view qweb New
slides_share Slides Media Share ir.ui.view qweb New
view_slide_channel_form slide.channel.form slide.channel form New
view_slide_channel_tree slide.channel.tree slide.channel tree New
view_slide_slide_form slide.slide.form slide.slide form New
view_slide_slide_graph slide.slide.graph slide.slide graph New
view_slide_slide_search slide.slide.filter slide.slide search New
view_slide_slide_tree slide.slide.tree slide.slide tree New
view_slide_tag_form slide.tag.form slide.tag form New
view_slide_tag_tree slide.tag.tree slide.tag tree New
view_slides_category_form slide.category.form slide.category form New
view_slides_category_tree slide.category.tree slide.category tree New
view_website_config_settings Website livechat settings website.config.settings xpath Inherits website.view_website_config_settings
website_slides.slide_embed_assets Website slides embed assets ir.ui.view qweb New
Models touched (6)

New fields (9)
  • channel_id Many2one → slide.channel
    ondelete='cascade' required=True string='Channel' args: 'slide.channel'
  • name Char
    required=True translate=True args: 'Name'
  • nbr_documents Integer
    compute='_count_presentations' store=True args: 'Number of Documents'
  • nbr_infographics Integer
    compute='_count_presentations' store=True args: 'Number of Infographics'
  • nbr_presentations Integer
    compute='_count_presentations' store=True args: 'Number of Presentations'
  • nbr_videos Integer
    compute='_count_presentations' store=True args: 'Number of Videos'
  • sequence Integer
    default=10 help='Display order'
  • slide_ids One2many → slide.slide
    string='Slides' args: 'slide.slide', 'category_id'
  • total Integer
    compute='_count_presentations' store=True
Public methods (0)

No public methods.

New fields (23)
  • access_error_msg Html
    default='<p>This channel is private and its content is restricted to some users.</p>' help='Message to display when not accessible due to access rights' sanitize_attributes=False translate=html_translate args: 'Error Message'
  • active Boolean
    default=True
  • can_see Boolean
    compute='_compute_access' search='_search_can_see' args: 'Can See'
  • can_see_full Boolean
    compute='_compute_access' args: 'Full Access'
  • can_upload Boolean
    compute='_compute_access' args: 'Can Upload'
  • category_ids One2many → slide.category
    string='Categories' args: 'slide.category', 'channel_id'
  • custom_slide_id Many2one → slide.slide
    string='Slide to Promote' args: 'slide.slide'
  • description Html
    sanitize_attributes=False translate=html_translate args: 'Description'
  • group_ids Many2many → res.groups
    help='Groups allowed to see presentations in this channel' string='Channel Groups' args: 'res.groups', 'rel_channel_groups', 'channel_id', 'group_id'
  • name Char
    required=True translate=True args: 'Name'
  • nbr_documents Integer
    compute='_count_presentations' store=True args: 'Number of Documents'
  • nbr_infographics Integer
    compute='_count_presentations' store=True args: 'Number of Infographics'
  • nbr_presentations Integer
    compute='_count_presentations' store=True args: 'Number of Presentations'
  • nbr_videos Integer
    compute='_count_presentations' store=True args: 'Number of Videos'
  • promote_strategy Selection
    default='most_voted' required=True string='Featuring Policy' args: [('none', 'No Featured Presentation'), ('latest', 'Latest Published'), ('most_voted', 'Most Voted'), ('most_viewed', 'Most Viewed'), ('custom', 'Featured Presentation')]
  • promoted_slide_id Many2one → slide.slide
    compute='_compute_promoted_slide_id' store=True string='Featured Slide' args: 'slide.slide'
  • publish_template_id Many2one → mail.template
    default=<expr> help='Email template to send slide publication through email' string='Published Template' args: 'mail.template'
  • sequence Integer
    default=10 help='Display order'
  • share_template_id Many2one → mail.template
    default=<expr> help='Email template used when sharing a slide' string='Shared Template' args: 'mail.template'
  • slide_ids One2many → slide.slide
    string='Slides' args: 'slide.slide', 'channel_id'
  • total Integer
    compute='_count_presentations' store=True
  • upload_group_ids Many2many → res.groups
    help='Groups allowed to upload presentations in this channel. If void, every user can upload.' string='Upload Groups' args: 'res.groups', 'rel_upload_groups', 'channel_id', 'group_id'
  • visibility Selection
    default='public' required=True args: [('public', 'Public'), ('private', 'Private'), ('partial', 'Show channel but restrict presentations')]
Public methods (3)
  • change_visibility(self)
    @api.onchange('visibility')
  • message_post(self, parent_id=False, subtype=None, **kwargs)
    @api.multi@api.returns('self', <expr>)
    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.
  • write(self, vals)
    @api.multi

New fields (3)
  • count_views Integer
    default=1 args: '# Views'
  • slide_id Many2one → slide.slide
    index=True required=True string='Presentation' args: 'slide.slide'
  • url Char
    required=True args: 'Third Party Website URL'
Public methods (1)
  • add_embed_url(self, slide_id, url)

New fields (25)
  • active Boolean
    default=True
  • category_id Many2one → slide.category
    domain="[('channel_id', '=', channel_id)]" string='Category' args: 'slide.category'
  • channel_id Many2one → slide.channel
    required=True string='Channel' args: 'slide.channel'
  • datas Binary
    attachment=True args: 'Content'
  • date_published Datetime
    args: 'Publish Date'
  • description Text
    translate=True args: 'Description'
  • dislikes Integer
    args: 'Dislikes'
  • document_id Char
    help='Youtube or Google Document ID' args: 'Document ID'
  • download_security Selection
    default='user' required=True string='Download Security' args: [('none', 'No One'), ('user', 'Authentified Users Only'), ('public', 'Everyone')]
  • embed_code Text
    compute='_get_embed_code' readonly=True args: 'Embed Code'
  • embed_views Integer
    args: '# of Embedded Views'
  • embedcount_ids One2many → slide.embed
    string='Embed Count' args: 'slide.embed', 'slide_id'
  • image Binary
    attachment=True args: 'Image'
  • image_medium Binary
    attachment=True compute='_get_image' store=True args: 'Medium'
  • image_thumb Binary
    attachment=True compute='_get_image' store=True args: 'Thumbnail'
  • index_content Text
    args: 'Transcript'
  • likes Integer
    args: 'Likes'
  • mime_type Char
    args: 'Mime-type'
  • name Char
    required=True translate=True args: 'Title'
  • slide_type Selection
    default='document' help='The document type will be set automatically based on the document URL and properties (e.g. height and width for presentation and document).' required=True string='Type' args: [('infographic', 'Infographic'), ('presentation', 'Presentation'), ('document', 'Document'), ('video', 'Video')]
  • slide_views Integer
    args: '# of Website Views'
  • tag_ids Many2many → slide.tag
    string='Tags' args: 'slide.tag', 'rel_slide_tag', 'slide_id', 'tag_id'
  • total_views Integer
    compute='_compute_total' default='0' store=True args: 'Total # Views'
  • url Char
    help='Youtube or Google Document URL' args: 'Document URL'
  • website_message_ids One2many → mail.message
    domain=<expr> help='Website communication history' string='Website Messages' args: 'mail.message', 'res_id'
Public methods (8)
  • check_field_access_rights(self, operation, fields)
    @api.model
    As per channel access configuration (visibility) - public ==> no restriction on slides access - private ==> restrict all slides of channel based on access group defined on channel group_ids field - partial ==> show channel, but presentations based on groups means any user can see channel but not slide's content. For private: implement using record rule For partial: user can see channel, but channel gridview have slide detail so we have to implement partial field access mechanism for public user so he can have access of promotional field (name, view_count) of slides, but not all fields like data (actual pdf content) all fields should be accessible only for user group defined on channel group_ids
  • create(self, values)
    @api.model
  • get_access_action(self)
    @api.multi
    Instead of the classic form view, redirect to website if it is published.
  • get_most_viewed_slides(self, limit=20)
  • get_related_slides(self, limit=20)
  • on_change_url(self)
    @api.onchange('url')
  • send_share_email(self, email)
    @api.one
  • write(self, values)
    @api.multi

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
    string='Google Doc Key'
Public methods (2)
  • get_default_website_slide_google_app_key(self, fields)
    @api.model
  • set_website_slide_google_app_key(self)
    @api.multi
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/9.0/website_slides
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, David Monjoie, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Julien Legros, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Yannick Tivisse, qsm-odoo, odoo-tac, Christophe Monniez
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:48:31
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - website
    - web
    - base
    - web_editor
    - web_planner
    - website_mail
    - mail
    - base_setup
    - web_kanban
    - bus
    - marketing
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Share and Publish Videos, Presentations and Documents'
======================================================

 * Website Application
 * Channel Management
 * Filters and Tagging
 * Statistics of Presentation
 * Channel Subscription
 * Supported document types : PDF, images, YouTube videos and Google Drive documents)

Code Analysis

Views touched (29)
XML IDNameModelTypeStatus
assets_frontend Slide ir.ui.view qweb Inherits website.assets_frontend
channel_not_found Private Presentation ir.ui.view qweb New
channels Channels 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
home Odoo Slides ir.ui.view qweb New
opt_subscription_on_channels Subscription ir.ui.view qweb Inherits website_slides.channels
related_slides Related Slide ir.ui.view qweb New
slide_detail_view Slide Detailed View ir.ui.view qweb New
slide_footer Footer Slides Link ir.ui.view qweb Inherits website.footer_default
slide_social_email Share by Email ir.ui.view qweb New
slide_social_embed Share on Your Website ir.ui.view qweb New
slide_social_media Share on Social Networks ir.ui.view qweb New
slides_channel_header Slides Channel Header ir.ui.view qweb New
slides_grid_view Slides (Grid View) ir.ui.view qweb New
slides_search Searching Slides ir.ui.view qweb New
slides_share Slides Media Share ir.ui.view qweb New
view_slide_channel_form slide.channel.form slide.channel form New
view_slide_channel_tree slide.channel.tree slide.channel tree New
view_slide_slide_form slide.slide.form slide.slide form New
view_slide_slide_graph slide.slide.graph slide.slide graph New
view_slide_slide_search slide.slide.filter slide.slide search New
view_slide_slide_tree slide.slide.tree slide.slide tree New
view_slide_tag_form slide.tag.form slide.tag form New
view_slide_tag_tree slide.tag.tree slide.tag tree New
view_slides_category_form slide.category.form slide.category form New
view_slides_category_tree slide.category.tree slide.category tree New
view_website_config_settings Website livechat settings website.config.settings xpath Inherits website.view_website_config_settings
website_slides.slide_embed_assets Website slides embed assets ir.ui.view qweb New
Models touched (6)

New fields (9)
  • channel_id Many2one → slide.channel
    ondelete='cascade' required=True string='Channel' args: 'slide.channel'
  • name Char
    required=True translate=True args: 'Name'
  • nbr_documents Integer
    compute='_count_presentations' store=True args: 'Number of Documents'
  • nbr_infographics Integer
    compute='_count_presentations' store=True args: 'Number of Infographics'
  • nbr_presentations Integer
    compute='_count_presentations' store=True args: 'Number of Presentations'
  • nbr_videos Integer
    compute='_count_presentations' store=True args: 'Number of Videos'
  • sequence Integer
    default=10 help='Display order'
  • slide_ids One2many → slide.slide
    string='Slides' args: 'slide.slide', 'category_id'
  • total Integer
    compute='_count_presentations' store=True
Public methods (0)

No public methods.

New fields (22)
  • access_error_msg Html
    default='<p>This channel is private and its content is restricted to some users.</p>' help='Message to display when not accessible due to access rights' translate=True args: 'Error Message'
  • can_see Boolean
    compute='_compute_access' search='_search_can_see' args: 'Can See'
  • can_see_full Boolean
    compute='_compute_access' args: 'Full Access'
  • can_upload Boolean
    compute='_compute_access' args: 'Can Upload'
  • category_ids One2many → slide.category
    string='Categories' args: 'slide.category', 'channel_id'
  • custom_slide_id Many2one → slide.slide
    string='Slide to Promote' args: 'slide.slide'
  • description Html
    translate=True args: 'Description'
  • group_ids Many2many → res.groups
    help='Groups allowed to see presentations in this channel' string='Channel Groups' args: 'res.groups', 'rel_channel_groups', 'channel_id', 'group_id'
  • name Char
    required=True translate=True args: 'Name'
  • nbr_documents Integer
    compute='_count_presentations' store=True args: 'Number of Documents'
  • nbr_infographics Integer
    compute='_count_presentations' store=True args: 'Number of Infographics'
  • nbr_presentations Integer
    compute='_count_presentations' store=True args: 'Number of Presentations'
  • nbr_videos Integer
    compute='_count_presentations' store=True args: 'Number of Videos'
  • promote_strategy Selection
    default='most_voted' required=True string='Featuring Policy' args: [('none', 'No Featured Presentation'), ('latest', 'Latest Published'), ('most_voted', 'Most Voted'), ('most_viewed', 'Most Viewed'), ('custom', 'Featured Presentation')]
  • promoted_slide_id Many2one → slide.slide
    compute='_compute_promoted_slide_id' store=True string='Featured Slide' args: 'slide.slide'
  • publish_template_id Many2one → mail.template
    default=<expr> help='Email template to send slide publication through email' string='Published Template' args: 'mail.template'
  • sequence Integer
    default=10 help='Display order'
  • share_template_id Many2one → mail.template
    default=<expr> help='Email template used when sharing a slide' string='Shared Template' args: 'mail.template'
  • slide_ids One2many → slide.slide
    string='Slides' args: 'slide.slide', 'channel_id'
  • total Integer
    compute='_count_presentations' store=True
  • upload_group_ids Many2many → res.groups
    help='Groups allowed to upload presentations in this channel. If void, every user can upload.' string='Upload Groups' args: 'res.groups', 'rel_upload_groups', 'channel_id', 'group_id'
  • visibility Selection
    default='public' required=True args: [('public', 'Public'), ('private', 'Private'), ('partial', 'Show channel but restrict presentations')]
Public methods (1)
  • change_visibility(self)
    @api.onchange('visibility')

New fields (3)
  • count_views Integer
    default=1 args: '# Views'
  • slide_id Many2one → slide.slide
    index=True required=True string='Presentation' args: 'slide.slide'
  • url Char
    required=True args: 'Third Party Website URL'
Public methods (1)
  • add_embed_url(self, slide_id, url)

New fields (24)
  • category_id Many2one → slide.category
    domain="[('channel_id', '=', channel_id)]" string='Category' args: 'slide.category'
  • channel_id Many2one → slide.channel
    required=True string='Channel' args: 'slide.channel'
  • datas Binary
    args: 'Content'
  • date_published Datetime
    args: 'Publish Date'
  • description Text
    translate=True args: 'Description'
  • dislikes Integer
    args: 'Dislikes'
  • document_id Char
    help='Youtube or Google Document ID' args: 'Document ID'
  • download_security Selection
    default='user' required=True string='Download Security' args: [('none', 'No One'), ('user', 'Authentified Users Only'), ('public', 'Everyone')]
  • embed_code Text
    compute='_get_embed_code' readonly=True args: 'Embed Code'
  • embed_views Integer
    args: '# of Embedded Views'
  • embedcount_ids One2many → slide.embed
    string='Embed Count' args: 'slide.embed', 'slide_id'
  • image Binary
    attachment=True args: 'Image'
  • image_medium Binary
    attachment=True compute='_get_image' store=True args: 'Medium'
  • image_thumb Binary
    attachment=True compute='_get_image' store=True args: 'Thumbnail'
  • index_content Text
    args: 'Transcript'
  • likes Integer
    args: 'Likes'
  • mime_type Char
    args: 'Mime-type'
  • name Char
    required=True translate=True args: 'Title'
  • slide_type Selection
    default='document' help='Document type will be set automatically depending on file type, height and width.' required=True string='Type' args: [('infographic', 'Infographic'), ('presentation', 'Presentation'), ('document', 'Document'), ('video', 'Video')]
  • slide_views Integer
    args: '# of Website Views'
  • tag_ids Many2many → slide.tag
    string='Tags' args: 'slide.tag', 'rel_slide_tag', 'slide_id', 'tag_id'
  • total_views Integer
    compute='_compute_total' default='0' store=True args: 'Total # Views'
  • url Char
    help='Youtube or Google Document URL' args: 'Document URL'
  • website_message_ids One2many → mail.message
    domain=<expr> help='Website communication history' string='Website Messages' args: 'mail.message', 'res_id'
Public methods (7)
  • check_field_access_rights(self, operation, fields)
    @api.model
    As per channel access configuration (visibility) - public ==> no restriction on slides access - private ==> restrict all slides of channel based on access group defined on channel group_ids field - partial ==> show channel, but presentations based on groups means any user can see channel but not slide's content. For private: implement using record rule For partial: user can see channel, but channel gridview have slide detail so we have to implement partial field access mechanism for public user so he can have access of promotional field (name, view_count) of slides, but not all fields like data (actual pdf content) all fields should be accessible only for user group defined on channel group_ids
  • create(self, values)
    @api.model
  • get_most_viewed_slides(self, limit=20)
  • get_related_slides(self, limit=20)
  • on_change_url(self)
    @api.onchange('url')
  • send_share_email(self, email)
    @api.one
  • write(self, values)
    @api.multi

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

No public methods.

New fields (1)
  • website_slide_google_app_key Char
    string='Google Doc Key'
Public methods (2)
  • get_default_website_slide_google_app_key(self, fields)
    @api.model
  • set_website_slide_google_app_key(self)
    @api.multi