TIP: You can type at any time to perform a new search.
eLearning
website_slides · odoo/odoo
- Repository
- odoo/odoo · module folder
- Module version
- 2.7
- Category
- Website/eLearning
- Folder size
- 19.85 MB
- License
- LGPL-3
- Application
- Yes
- Auto-installable
- No
- Website
- https://www.odoo.com/app/elearning
- Last tracking update
- 2026-08-15 22:44:20
- Authors
- Odoo S.A.
- Maintainers
- Odoo S.A.
- Committers
- Xavier Morel, Raphael Collet, Thibault Delavallée, Odoo Translation Bot, Denis Ledoux, Nicolas Martinelli, Aaron Bohy, Géry Debongnie, qsm-odoo, Christophe Monniez, Alexandre Kühn, Julien Castiaux, Aurélien Warnon, Xavier-Do, Romeo Fragomeli, Victor Feyens, Sébastien Theys, Julien Mougenot, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, abd-msyukyu-odoo, William Braeckman, Romain Estievenart, Benjamin Vray, Didier (did), Florian Charlier, Patrick Hoste, Nicolas Bayet, luvi, Hubert Van De Walle, Valentin Chevalier, Renaud Thiry, tsm-odoo, Louis Wicket (wil), Thomas Lefebvre (thle), Victor Piryns (pivi), amdi-odoo, Pierre-Yves Dufays, Maruan Aguerdouh (magm), Dylan Kiss (dyki), Antoine (ande), FrancoisGe, Mayurrajsinh Rathod, divy-odoo, Astik Singh, Maryam Kia, Mehdi Outagant (MOU), Serge Bayet (seba), reka-odoo, Bastien Fafchamps (bafa), adsh-odoo, Alex Kühn, Lopes Marc (loma), aath-odoo, Chrysanthe (chgo), mano-odoo, Biraj Khatiwada, yagp-odoo, Manushi Shah, Pierre Pulinckx (PIPU), panv-odoo, sben-odoo, Pierre Pulinckx, Bastien PIERRE, Michaël Mattiello, pish-odoo, Thomas Josse (THJO), Krzysztof Magusiak (krma), pajo, defl, Giorgio Tocco (gito), Julien Launois (jula), Augustin (duau), Davide Bonetto, Alessandro Lupo, Ayush Modi, assh-odoo, Kevin Gerard (kege), Mohamed Barakat, saurabh, Julien (jdeh), ibo-odoo, chpa-odoo, panj-odoo
- Odoo dependencies
- Python dependencies
- geoip2
- System dependencies
- None
- Required by
- hr_skills_slides, mass_mailing_slides, test_discuss_full, test_website_modules, website_sale_slides, website_slides_forum, website_slides_survey
- Description
Create Online Courses ===================== Featuring * Integrated course and lesson management * Fullscreen navigation * Support Youtube videos, Google documents, PDF, images, articles * Test knowledge with quizzes * Filter and Tag * Statistics
Code Analysis ⓘ
Views touched (106)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
achievement_card |
Achivement Card | ir.ui.view | qweb | New |
course_card |
Course Card | ir.ui.view | qweb | New |
course_card_information |
Course Information | ir.ui.view | qweb | New |
course_card_information_badge |
New Content Badge | ir.ui.view | qweb | Inherits website_slides.course_card_information |
course_join |
course_join | ir.ui.view | qweb | New |
course_main |
Course Main | ir.ui.view | qweb | New |
course_nav |
Course Navigation Header | ir.ui.view | qweb | New |
course_promoted_slide |
Documentation Course content: promoted slide | ir.ui.view | qweb | New |
course_sidebar |
Course Sidebar (infos, CTA) | ir.ui.view | qweb | New |
course_slides_cards |
Documentation Course content: cards / categories | ir.ui.view | qweb | New |
course_slides_list |
Training Course content: list | ir.ui.view | qweb | New |
course_slides_list_placeholder |
Course Placeholder Content | ir.ui.view | qweb | New |
course_slides_list_sample |
Course Sample Content | ir.ui.view | qweb | New |
course_slides_list_slide |
Slide template for a training channel | ir.ui.view | qweb | New |
courses_footer |
courses_footer | ir.ui.view | qweb | New |
courses_home |
Odoo Courses Homepage | ir.ui.view | qweb | New |
courses_home_side_bar |
courses_home_side_bar | ir.ui.view | qweb | New |
courses_my |
courses_my | ir.ui.view | qweb | New |
courses_search_bar |
courses_search_bar | ir.ui.view | qweb | New |
courses_search_results |
courses_search_results | ir.ui.view | qweb | New |
courses_search_tags |
courses_search_tags | ir.ui.view | qweb | New |
display_course |
display_course | ir.ui.view | qweb | New |
embed_slide |
Embedded Slide Page | ir.ui.view | qweb | New |
embed_slide_forbidden |
Forbidden Embedded Slide | ir.ui.view | qweb | New |
gamification_karma_tracking_view_search |
gamification.karma.tracking.view.search.inherit.website.slides | gamification.karma.tracking | search | Inherits gamification.gamification_karma_tracking_view_search |
join_course_link |
Join Course Link | ir.ui.view | qweb | New |
lesson_card |
Lesson Card | ir.ui.view | qweb | New |
lesson_content_quiz |
Lesson: Quiz specific content | ir.ui.view | qweb | New |
lesson_content_quiz_add_buttons |
Lesson: Quiz Add Buttons template | ir.ui.view | qweb | New |
lesson_content_quiz_question |
Lesson: Quiz question template | ir.ui.view | qweb | New |
mail_activity_view_form |
mail.activity.view.form.inherit.slides | mail.activity | form | Inherits mail.mail_activity_view_form |
mail_notification_channel_invite |
mail_notification_channel_invite | ir.ui.view | qweb | New |
profile_access_denied |
profile_access_denied | ir.ui.view | qweb | Inherits website_profile.profile_access_denied |
rating_rating_view_form_slides |
rating.rating.view.form.slides | rating.rating | form | New |
rating_rating_view_graph_slide_channel |
rating.rating.view.graph.slides | rating.rating | graph | New |
rating_rating_view_pivot_slide_channel |
rating.rating.view.pivot.slides | rating.rating | pivot | New |
rating_rating_view_search_slide_channel |
rating.rating.view.search.slides | rating.rating | search | Inherits rating.rating_rating_view_search |
rating_rating_view_tree_slide_channel |
rating.rating.view.list.slides | rating.rating | list | New |
res_config_settings_view_form |
res.config.settings.view.form.inherit.website.slides | res.config.settings | form | Inherits website.res_config_settings_view_form |
res_partner_view_form |
res.partner.view.form.inherit.slides | res.partner | form | Inherits base.view_partner_form |
slide_aside_card |
Related Slide | ir.ui.view | qweb | New |
slide_aside_documentation |
Slide: Sidebar in Documentation | ir.ui.view | qweb | New |
slide_aside_training |
Slide: Sidebar in Training | ir.ui.view | qweb | New |
slide_aside_training_category |
Category item for the slide detailed view list | ir.ui.view | qweb | New |
slide_channel_invite_view_form |
slide.channel.invite.view.form | slide.channel.invite | form | New |
slide_channel_pages_kanban_view |
Course Pages Kanban | slide.channel | kanban | Inherits slide_channel_view_kanban |
slide_channel_pages_tree_view |
Course Pages List | slide.channel | list | Inherits slide_channel_view_tree |
slide_channel_partner_view_graph |
slide.channel.partner.view.graph | slide.channel.partner | graph | New |
slide_channel_partner_view_kanban |
slide.channel.partner.view.kanban | slide.channel.partner | kanban | New |
slide_channel_partner_view_pivot |
slide.channel.partner.view.pivot | slide.channel.partner | pivot | New |
slide_channel_partner_view_search |
slide.channel.partner.search | slide.channel.partner | search | New |
slide_channel_partner_view_tree |
slide.channel.partner.list | slide.channel.partner | list | New |
slide_channel_tag_group_view_form |
slide.channel.tag.group.view.form | slide.channel.tag.group | form | New |
slide_channel_tag_group_view_search |
slide.channel.tag.group.view.search | slide.channel.tag.group | search | New |
slide_channel_tag_group_view_tree |
slide.channel.tag.group.view.list | slide.channel.tag.group | list | New |
slide_channel_tag_view_form |
slide.channel.tag.view.form | slide.channel.tag | form | New |
slide_channel_tag_view_search |
slide.channel.tag.view.search | slide.channel.tag | search | New |
slide_channel_tag_view_tree |
slide.channel.tag.view.list | slide.channel.tag | list | New |
slide_channel_view_form_add |
slide.channel.view.form.add | slide.channel | form | New |
slide_channel_view_graph |
slide.channel.view.graph | slide.channel | graph | New |
slide_channel_view_kanban |
slide.channel.view.kanban | slide.channel | kanban | New |
slide_channel_view_pivot |
slide.channel.view.pivot | slide.channel | pivot | New |
slide_channel_view_search |
slide.channel.view.search | slide.channel | search | New |
slide_channel_view_tree |
slide.channel.view.list | slide.channel | list | New |
slide_channel_view_tree_report |
slide.channel.view.list.report | slide.channel | list | New |
slide_content_detailed |
Slide: Detailed Content | ir.ui.view | qweb | New |
slide_embed_view_search |
slide.embed.view.search | slide.embed | search | New |
slide_embed_view_tree |
slide.embed.view.list | slide.embed | list | New |
slide_fullscreen |
Fullscreen | ir.ui.view | qweb | New |
slide_fullscreen_sidebar_category |
Slides category template for fullscreen view side bar | ir.ui.view | qweb | New |
slide_main |
Slide Detailed View | ir.ui.view | qweb | New |
slide_question_view_form |
slide.question.view.form | slide.question | form | New |
slide_question_view_search |
slide.question.view.search | slide.question | search | New |
slide_question_view_tree |
slide.question.view.list | slide.question | list | New |
slide_question_view_tree_report |
slide.question.view.list.report | slide.question | list | New |
slide_share_link |
slide_share_link | ir.ui.view | qweb | New |
slide_share_modal |
slide_share_modal | ir.ui.view | qweb | New |
slide_share_modal_body |
slide_share_modal_body | ir.ui.view | qweb | New |
slide_share_modal_header |
slide_share_modal_header | ir.ui.view | qweb | New |
slide_share_social |
Slides Media Share | ir.ui.view | qweb | New |
slide_sidebar_done_button |
Sidebar Done Button | ir.ui.view | qweb | New |
slide_slide_partner_view_form |
slide.slide.partner.view.form | slide.slide.partner | form | New |
slide_slide_partner_view_search |
slide.slide.partner.view.search | slide.slide.partner | search | New |
slide_slide_partner_view_tree |
slide.slide.partner.view.list | slide.slide.partner | list | New |
slide_slide_view_graph |
slide.slide.view.graph | slide.slide | graph | New |
slide_slide_view_kanban |
slide.slide.view.kanban | slide.slide | kanban | New |
slide_slide_view_pivot |
slide.slide.view.pivot | slide.slide | pivot | New |
slide_slide_view_tree_report |
slide.slide.view.list.report | slide.slide | list | New |
slide_social_email |
Share by Email | ir.ui.view | qweb | New |
slide_social_embed |
Share on Your Website | ir.ui.view | qweb | New |
slides_home_achievements_small |
Users | ir.ui.view | qweb | New |
slides_home_user_achievements_small |
User Achievements | ir.ui.view | qweb | New |
slides_home_user_profile_small |
User Profile | ir.ui.view | qweb | New |
slides_home_users_small |
Users | ir.ui.view | qweb | New |
slides_misc_user_image |
User Avatar | ir.ui.view | qweb | New |
toggle_latest_achievements |
Display Achievements | ir.ui.view | qweb | Inherits website_slides.slides_home_achievements_small |
toggle_leaderboard |
Display Leaderboard | ir.ui.view | qweb | Inherits website_slides.slides_home_users_small |
user_profile_content |
user_profile_content | ir.ui.view | qweb | Inherits website_profile.user_profile_content |
user_quickkarma_card |
User QuickKarma Card | ir.ui.view | qweb | New |
view_slide_channel_form |
slide.channel.view.form | slide.channel | form | New |
view_slide_slide_form |
slide.slide.form | slide.slide | form | New |
view_slide_slide_form_wo_channel_id |
slide.slide.form.wo.channel_id | slide.slide | form | Inherits view_slide_slide_form |
view_slide_slide_search |
slide.slide.filter | slide.slide | search | New |
view_slide_slide_tree |
slide.slide.list | slide.slide | list | New |
view_slide_tag_form |
slide.tag.form | slide.tag | form | New |
view_slide_tag_tree |
slide.tag.list | slide.tag | list | New |
HTTP endpoints (39)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/slides/<int:channel_id>, /slides/<int:channel_id>/category/<int:category_id>, /slides/<int:channel_id>/category/<int:category_id>/page/<int:page>, /slides/<model("slide.channel"):channel>, /slides/<model("slide.channel"):channel>/page/<int:page>, /slides/<model("slide.channel"):channel>/tag/<model("slide.tag"):tag>, /slides/<model("slide.channel"):channel>/tag/<model("slide.tag"):tag>/page/<int:page>, /slides/<model("slide.channel"):channel>/category/<model("slide.slide"):category>, /slides/<model("slide.channel"):channel>/category/<model("slide.slide"):category>/page/<int:page> |
WebsiteSlides.channel |
public | http | ALL | sudo website |
/slides/add_slide |
WebsiteSlides.create_slide |
user | jsonrpc | POST | sudo website |
/slides/slide/get_html_content |
WebsiteSlides.get_html_content |
public | jsonrpc | ALL | website |
/slides/prepare_preview |
WebsiteSlides.prepare_preview |
user | jsonrpc | POST | website |
/slides/slide/archive |
WebsiteSlides.slide_archive |
user | jsonrpc | ALL | sudo website |
/slides/category/add |
WebsiteSlides.slide_category_add |
user | http | POST | website |
/slides/category/search_read |
WebsiteSlides.slide_category_search_read |
user | jsonrpc | POST | website |
/slides/<int:channel_id>/identify |
WebsiteSlides.slide_channel_identify_from_invite |
public | http | ALL | website |
/slides/<int:channel_id>/invite |
WebsiteSlides.slide_channel_invite |
public | http | ALL | website |
/slides/channel/join |
WebsiteSlides.slide_channel_join |
public | jsonrpc | ALL | sudo website |
/slides/channel/leave |
WebsiteSlides.slide_channel_leave |
user | jsonrpc | ALL | website |
/slides/channel/send_share_email |
WebsiteSlides.slide_channel_send_share_email |
user | jsonrpc | ALL | website |
/slides/channel/subscribe |
WebsiteSlides.slide_channel_subscribe |
user | jsonrpc | ALL | website |
/slides/channel/tag/add |
WebsiteSlides.slide_channel_tag_add |
user | jsonrpc | POST | website |
/slide_channel_tag/add |
WebsiteSlides.slide_channel_tag_create_or_get |
user | jsonrpc | POST | website |
/slides/channel/tag/group/search_read |
WebsiteSlides.slide_channel_tag_group_search_read |
user | jsonrpc | POST | website |
/slides/channel/tag/search_read |
WebsiteSlides.slide_channel_tag_search_read |
user | jsonrpc | POST | website |
/slides/channel/unsubscribe |
WebsiteSlides.slide_channel_unsubscribe |
user | jsonrpc | ALL | website |
/slides/slide/<int:slide_id>/get_image |
WebsiteSlides.slide_get_image |
public | http | ALL | website |
/slides/slide/<model("slide.slide"):slide>/pdf_content |
WebsiteSlides.slide_get_pdf_content |
public | http | ALL | website |
/slides/slide/like |
WebsiteSlides.slide_like |
public | jsonrpc | ALL | sudo website |
/slides/slide/toggle_is_preview |
WebsiteSlides.slide_preview |
user | jsonrpc | ALL | website |
/slides/slide/quiz/get |
WebsiteSlides.slide_quiz_get |
public | jsonrpc | ALL | website |
/slides/slide/quiz/question_add_or_update |
WebsiteSlides.slide_quiz_question_add_or_update |
user | jsonrpc | POST | website |
/slides/slide/quiz/reset |
WebsiteSlides.slide_quiz_reset |
user | jsonrpc | ALL | website |
/slides/slide/quiz/save_to_session |
WebsiteSlides.slide_quiz_save_to_session |
public | jsonrpc | ALL | website |
/slides/slide/quiz/submit |
WebsiteSlides.slide_quiz_submit |
public | jsonrpc | ALL | sudo website |
/slides/slide/send_share_email |
WebsiteSlides.slide_send_share_email |
user | jsonrpc | ALL | website |
/slides/slide/set_completed |
WebsiteSlides.slide_set_completed |
public | jsonrpc | ALL | website |
/slides/slide/<model("slide.slide"):slide>/set_completed |
WebsiteSlides.slide_set_completed_and_redirect |
user | http | ALL | website |
/slides/slide/set_uncompleted |
WebsiteSlides.slide_set_uncompleted |
public | jsonrpc | ALL | website |
/slides/slide/<model("slide.slide"):slide>/set_uncompleted |
WebsiteSlides.slide_set_uncompleted_and_redirect |
user | http | ALL | website |
/slides/slide/<int:slide_id>/share |
WebsiteSlides.slide_shared_view |
public | http | ALL | website |
/slides/tag/search_read |
WebsiteSlides.slide_tag_search_read |
user | jsonrpc | POST | website |
/slides/slide/<model("slide.slide"):slide> |
WebsiteSlides.slide_view |
public | http | ALL | sudo website |
/slides, /slides/page/<int:page>, /slides/tag/<string:slug_tags>, /slides/tag/<string:slug_tags>/page/<int:page> |
WebsiteSlides.slides_channel |
public | http | ALL | website |
/slides/embed/<int:slide_id> |
WebsiteSlides.slides_embed |
public | http | ALL | website |
/slides/embed_external/<int:slide_id> |
WebsiteSlides.slides_embed_external |
public | http | ALL | website |
/slides/all, /slides/all/tag/<string:slug_tags> |
WebsiteSlidesLegacy.slides_channel_all |
public | http | ALL | website |
Models touched (22)
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (1)
-
challenge_categorySelectionondelete={'slides': 'set default'}selection_add=[('slides', 'Website / Slides')]
No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (1)
-
request_partner_idMany2one → res.partnerondelete='cascade'string='Requesting Partner' args: 'res.partner'
No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (5)
-
module_mass_mailing_slidesBooleanstring='Mailing' -
module_website_sale_slidesBooleanstring='Sell on eCommerce' -
module_website_slides_forumBooleanstring='Forum' -
module_website_slides_surveyBooleanstring='Certifications' -
website_slide_google_app_keyCharreadonly=Falserelated='website_id.website_slide_google_app_key'
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_countIntegercompute='_compute_slide_channel_company_count'groups='website_slides.group_website_slides_officer' args: 'Company Course Count' -
slide_channel_completed_idsOne2many → slide.channelcompute='_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_countIntegercompute='_compute_slide_channel_values'groups='website_slides.group_website_slides_officer' args: 'Course Count' -
slide_channel_idsMany2many → slide.channelcompute='_compute_slide_channel_values'groups='website_slides.group_website_slides_officer'search='_search_slide_channel_ids'string='eLearning Courses' args: 'slide.channel'
-
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_multiTrigger 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)
-
commentTexthelp='This comment will be displayed to the user if they select this answer'translate=True args: 'Comment' -
is_correctBooleanargs: 'Is correct answer' -
question_idMany2one → slide.questionindex=Trueondelete='cascade'required=Truestring='Question' args: 'slide.question' -
sequenceIntegerargs: 'Sequence' -
text_valueCharrequired=Truetranslate=True args: 'Answer'
No public methods.
New fields (66)
-
access_tokenCharcopy=Falsedefault=_default_access_token args: 'Security Token' -
activeBooleandefault=Truetracking=100 -
allow_commentBooleancompute='_compute_allow_comment'help='Allow Attendees to like and comment your content and to submit reviews on your course.'precompute=Truereadonly=Falsestore=True args: 'Allow rating on Course' -
can_commentBooleancompute='_compute_action_rights'compute_sudo=False args: 'Can Comment' -
can_reviewBooleancompute='_compute_action_rights'compute_sudo=False args: 'Can Review' -
can_uploadBooleancompute='_compute_can_upload'compute_sudo=False args: 'Can Upload' -
can_voteBooleancompute='_compute_action_rights'compute_sudo=False args: 'Can Vote' -
channel_partner_all_idsOne2many → slide.channel.partnergroups='website_slides.group_website_slides_officer'string='All Attendees Information' args: 'slide.channel.partner', 'channel_id' -
channel_partner_idsOne2many → slide.channel.partnerdomain=[('member_status', '!=', 'invited')]groups='website_slides.group_website_slides_officer'string='Enrolled Attendees Information' args: 'slide.channel.partner', 'channel_id' -
channel_typeSelectiondefault='training'help='Defines the course type (e.g., "Training" for interactive learning, or "Documentation" for resources and guides).'required=Truestring='Course type' args: [('training', 'Training'), ('documentation', 'Documentation')] -
colorIntegerdefault=0help='Used to decorate kanban view' args: 'Color Index' -
completedBooleancompute='_compute_user_statistics'compute_sudo=False args: 'Done' -
completed_template_idMany2one → mail.templatedefault=<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' -
completionIntegercompute='_compute_user_statistics'compute_sudo=False args: 'Completion' -
descriptionHtmlhelp='The description that is displayed on top of the course page, just below the title'sanitize_attributes=Falsesanitize_form=Falsetranslate=True args: 'Description' -
description_htmlHtmlsanitize_attributes=Falsesanitize_form=Falsetranslate=tools.html_translate args: 'Detailed Description' -
description_shortHtmlhelp='The description that is displayed on the course card'sanitize_attributes=Falsesanitize_form=Falsetranslate=True args: 'Short Description' -
enrollSelectioncompute='_compute_enroll'copy=Falsedefault='public'help='Defines how people can enroll to your Course.'readonly=Falserequired=Truestore=Truestring='Enroll Policy' args: [('public', 'Open'), ('invite', 'On Invitation')] -
enroll_group_idsMany2many → res.groupshelp='Members of those groups are automatically added as members of the channel.'string='Auto Enroll Groups' args: 'res.groups' -
enroll_msgHtmldefault=_get_default_enroll_msghelp='Message explaining the enroll process'sanitize_attributes=Falsetranslate=tools.html_translate args: 'Enroll Message' -
has_requested_accessBooleancompute='_compute_has_requested_access'compute_sudo=Falsestring='Access Requested' -
is_memberBooleancompute='_compute_membership_values'help='Is the attendee actively enrolled.'search='_search_is_member'string='Is Enrolled Attendee' -
is_member_invitedBooleancompute='_compute_membership_values'help='Is the invitation for this attendee pending.'search='_search_is_member_invited'string='Is Invited Attendee' -
is_visibleBooleancompute='_compute_is_visible'search='_search_is_visible'string='Is Visible On Website' -
karma_gen_channel_finishIntegerdefault=10string='Course finished' -
karma_gen_channel_rankIntegerdefault=5string='Course ranked' -
karma_reviewIntegerdefault=10help='Karma needed to add a review on the course' args: 'Add Review' -
karma_slide_commentIntegerdefault=3help='Karma needed to add a comment on a slide of this course' args: 'Add Comment' -
karma_slide_voteIntegerdefault=3help='Karma needed to like/dislike a slide of this course.' args: 'Vote' -
members_all_countIntegercompute='_compute_members_counts' args: '# Enrolled or Invited Attendees' -
members_completed_countIntegercompute='_compute_members_counts' args: '# Completed Attendees' -
members_countIntegercompute='_compute_members_counts' args: '# Enrolled Attendees' -
members_engaged_countIntegercompute='_compute_members_counts'help="Active attendees include both 'joined' and 'ongoing' attendees." args: '# Active Attendees' -
members_invited_countIntegercompute='_compute_members_counts' args: '# Invited Attendees' -
nameCharrequired=Truetranslate=True args: 'Name' -
nbr_articleIntegercompute='_compute_slides_statistics'store=True args: 'Articles' -
nbr_documentIntegercompute='_compute_slides_statistics'store=True args: 'Documents' -
nbr_infographicIntegercompute='_compute_slides_statistics'store=True args: 'Infographics' -
nbr_quizIntegercompute='_compute_slides_statistics'store=True args: 'Number of Quizs' -
nbr_videoIntegercompute='_compute_slides_statistics'store=True args: 'Videos' -
partner_has_new_contentBooleancompute='_compute_partner_has_new_content'compute_sudo=False -
partner_idsMany2many → res.partnercompute='_compute_partners'help='Enrolled partners in the course'search='_search_partner_ids'string='Attendees' args: 'res.partner' -
prerequisite_channel_idsMany2many → slide.channeldomain="[('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_idsMany2many → slide.channelhelp='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_completedBooleancompute='_compute_prerequisite_user_has_completed' args: 'Has Completed Prerequisite' -
promote_strategySelectioncopy=Falsedefault='latest'help='Defines the content that will be promoted on the course home page'required=Falsestring='Featured Content' args: [('latest', 'Latest Created'), ('most_voted', 'Most Voted'), ('most_viewed', 'Most Viewed'), ('specific', 'Select Manually'), ('none', 'None')] -
promoted_slide_idMany2one → slide.slidecopy=Falsestring='Promoted Slide' args: 'slide.slide' -
publish_template_idMany2one → mail.templatedefault=<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_starsFloatcompute='_compute_rating_stats'compute_sudo=Truedigits=(16, 1) args: 'Rating Average (Stars)' -
sequenceIntegerdefault=10 -
share_channel_template_idMany2one → mail.templatedefault=<expr>help='Email template used when sharing a channel'string='Channel Share Template' args: 'mail.template' -
share_slide_template_idMany2one → mail.templatedefault=<expr>help='Email template used when sharing a slide'string='Share Template' args: 'mail.template' -
slide_category_idsOne2many → slide.slidecompute='_compute_category_and_slide_ids'string='Categories' args: 'slide.slide' -
slide_content_idsOne2many → slide.slidecompute='_compute_category_and_slide_ids'string='Content' args: 'slide.slide' -
slide_idsOne2many → slide.slidecopy=Truestring='Slides and categories' args: 'slide.slide', 'channel_id' -
slide_last_updateDatecompute='_compute_slide_last_update'store=True args: 'Last Update' -
slide_partner_idsOne2many → slide.slide.partnercopy=Falsegroups='website_slides.group_website_slides_officer'string='Slide User Data' args: 'slide.slide.partner', 'channel_id' -
tag_idsMany2many → slide.channel.taghelp='Used to categorize and filter displayed channels/courses'string='Tags' args: 'slide.channel.tag', 'slide_channel_tag_rel', 'channel_id', 'tag_id' -
total_slidesIntegercompute='_compute_slides_statistics'store=True args: 'Number of Contents' -
total_timeFloatcompute='_compute_slides_statistics'digits=(10, 2)store=True args: 'Duration' -
total_viewsIntegercompute='_compute_slides_statistics'store=True args: 'Visits' -
total_votesIntegercompute='_compute_slides_statistics'store=True args: 'Votes' -
upload_group_idsMany2many → res.groupsgroups='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_idMany2one → res.usersdefault=<expr>string='Responsible' args: 'res.users' -
visibilitySelectiondefault='public'help='Defines who can access your courses and their content.'required=Truestring='Show Course To' args: [('public', 'Everyone'), ('connected', 'Signed In'), ('members', 'Course Attendees'), ('link', 'Anyone with the link')] -
website_default_background_image_urlCharcompute='_compute_website_default_background_image_url' args: 'Background image URL'
-
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_idsMany2many → ir.attachmentbypass_search_access=Truestring='Attachments' args: 'ir.attachment' -
channel_idMany2one → slide.channelrequired=Truestring='Course' args: 'slide.channel' -
channel_invite_urlCharcompute='_compute_channel_invite_url' args: 'Course Link' -
channel_publishedBooleanrelated='channel_id.is_published' -
channel_visibilitySelectionrelated='channel_id.visibility' -
enroll_modeBooleanhelp='Whether invited partners will be added as enrolled. Otherwise, they will be added as invited.'readonly=True args: 'Enroll partners' -
partner_idsMany2many → res.partnerstring='Recipients' args: 'res.partner' -
send_emailBooleancompute='_compute_send_email'readonly=Falsestore=True args: 'Send Email'
-
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)
-
activeBooleandefault=Truestring='Active' -
channel_enrollSelectionrelated='channel_id.enroll' -
channel_idMany2one → slide.channelindex=Trueondelete='cascade'required=Truestring='Course' args: 'slide.channel' -
channel_typeSelectionrelated='channel_id.channel_type' -
channel_user_idMany2one → res.usersrelated='channel_id.user_id'string='Responsible' args: 'res.users' -
channel_visibilitySelectionrelated='channel_id.visibility' -
channel_website_idMany2one → websiterelated='channel_id.website_id'string='Website' args: 'website' -
completed_slides_countIntegerdefault=0 args: '# Completed Contents' -
completionIntegeraggregator='avg'default=0 args: '% Completed Contents' -
invitation_linkCharcompute='_compute_invitation_link' args: 'Invitation Link' -
last_invitation_dateDatetimeargs: 'Last Invitation Date' -
member_statusSelectiondefault='joined'readonly=Truerequired=Truestring='Attendee Status' args: [('invited', 'Invite Sent'), ('joined', 'Joined'), ('ongoing', 'Ongoing'), ('completed', 'Finished')] -
next_slide_idMany2one → slide.slidecompute='_compute_next_slide_id'string='Next Lesson' args: 'slide.slide' -
partner_emailCharreadonly=Truerelated='partner_id.email' -
partner_idMany2one → res.partnerindex=Trueondelete='cascade'required=True args: 'res.partner'
-
unlink(self)Override unlink method : Remove attendee from a channel, then also remove slide.slide.partner related to.
New fields (6)
-
channel_idsMany2many → slide.channelstring='Channels' args: 'slide.channel', 'slide_channel_tag_rel', 'tag_id', 'channel_id' -
colorIntegerdefault=<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_idMany2one → slide.channel.tag.groupindex=Trueondelete='cascade'required=Truestring='Group' args: 'slide.channel.tag.group' -
group_sequenceIntegerindex=Truereadonly=Truerelated='group_id.sequence'store=True args: 'Group sequence' -
nameCharrequired=Truetranslate=True args: 'Name' -
sequenceIntegerdefault=10index=Truerequired=True args: 'Sequence'
No public methods.
New fields (3)
-
nameCharrequired=Truetranslate=True args: 'Group Name' -
sequenceIntegerdefault=10index=Truerequired=True args: 'Sequence' -
tag_idsOne2many → slide.channel.tagstring='Tags' args: 'slide.channel.tag', 'group_id'
No public methods.
New fields (4)
-
count_viewsIntegerdefault=1 args: '# Views' -
slide_idMany2one → slide.slideindex=Trueondelete='cascade'required=Truestring='Presentation' args: 'slide.slide' -
urlCharargs: 'Third Party Website URL' -
website_nameCharcompute='_compute_website_name' args: 'Website'
No public methods.
New fields (8)
-
answer_idsOne2many → slide.answercopy=Truestring='Answer' args: 'slide.answer', 'question_id' -
answers_validation_errorCharcompute='_compute_answers_validation_error' args: 'Error on Answers' -
attempts_avgFloatcompute='_compute_statistics'digits=(6, 2)groups='website_slides.group_website_slides_officer' -
attempts_countIntegercompute='_compute_statistics'groups='website_slides.group_website_slides_officer' -
done_countIntegercompute='_compute_statistics'groups='website_slides.group_website_slides_officer' -
questionCharrequired=Truetranslate=True args: 'Question Name' -
sequenceIntegerargs: 'Sequence' -
slide_idMany2one → slide.slideindex=Trueondelete='cascade'required=Truestring='Content' args: 'slide.slide'
No public methods.
New fields (69)
-
activeBooleandefault=Truetracking=100 -
binary_contentBinaryattachment=True args: 'File' -
can_self_mark_completedBooleancompute='_compute_mark_complete_actions'help='The slide can be marked as completed even without opening it' args: 'Can Mark Completed' -
can_self_mark_uncompletedBooleancompute='_compute_mark_complete_actions'help='The slide can be marked as not completed and the progression' args: 'Can Mark Uncompleted' -
category_idMany2one → slide.slidecompute='_compute_category_id'index='btree_not_null'store=Truestring='Section' args: 'slide.slide' -
channel_allow_commentBooleanrelated='channel_id.allow_comment'string='Allows comment' -
channel_idMany2one → slide.channelindex=Trueondelete='cascade'required=Truestring='Course' args: 'slide.channel' -
channel_typeSelectionrelated='channel_id.channel_type'string='Channel type' -
comments_countIntegercompute='_compute_comments_count' args: 'Number of comments' -
completion_timeFloatcompute='_compute_category_completion_time'digits=(10, 4)readonly=Falserecursive=Truestore=True args: 'Duration' -
date_publishedDatetimecopy=Falsereadonly=Truetracking=False args: 'Publish Date' -
descriptionHtmlsanitize_attributes=Falsesanitize_overridable=Truetranslate=True args: 'Description' -
dislikesIntegercompute='_compute_like_info'compute_sudo=Falsestore=True args: 'Dislikes' -
document_binary_contentBinaryreadonly=Falserelated='binary_content' args: 'PDF Content' -
document_google_urlCharhelp='Link of the document (we currently only support Google Drive as source)'readonly=Falserelated='url' args: 'Document Link' -
embed_codeHtmlcompute='_compute_embed_code'readonly=Truesanitize=False args: 'Embed Code' -
embed_code_externalHtmlcompute='_compute_embed_code'help="Same as 'Embed Code' but used to embed the content on an external website."readonly=Truesanitize=False args: 'External Embed Code' -
embed_countIntegercompute='_compute_embed_counts' args: '# of Embeds' -
embed_idsOne2many → slide.embedstring='External Slide Embeds' args: 'slide.embed', 'slide_id' -
google_drive_idCharcompute='_compute_google_drive_id' args: 'Google Drive ID of the external URL' -
html_contentHtmlhelp="Custom HTML content for slides of category 'Article'."sanitize_attributes=Falsesanitize_form=Falsesanitize_overridable=Truetranslate=True args: 'HTML Content' -
image_1920Imagecompute='_compute_image_1920'readonly=Falsestore=True -
image_binary_contentBinaryreadonly=Falserelated='binary_content' args: 'Image Content' -
image_google_urlCharhelp='Link of the image (we currently only support Google Drive as source)'readonly=Falserelated='url' args: 'Image Link' -
is_categoryBooleandefault=False args: 'Is a category' -
is_new_slideBooleancompute='_compute_is_new_slide' args: 'Is New Slide' -
is_previewBooleandefault=Falsehelp="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_publishedBooleantracking=1 -
likesIntegercompute='_compute_like_info'compute_sudo=Falsestore=True args: 'Likes' -
nameCharrequired=Truetranslate=True args: 'Title' -
nbr_articleIntegercompute='_compute_slides_statistics'store=True args: 'Number of Articles' -
nbr_documentIntegercompute='_compute_slides_statistics'store=True args: 'Number of Documents' -
nbr_infographicIntegercompute='_compute_slides_statistics'store=True args: 'Number of Images' -
nbr_quizIntegercompute='_compute_slides_statistics'store=True args: 'Number of Quizs' -
nbr_videoIntegercompute='_compute_slides_statistics'store=True args: 'Number of Videos' -
partner_idsMany2many → res.partnercopy=Falsegroups='website_slides.group_website_slides_officer'string='Subscribers' args: 'res.partner', 'slide_slide_partner', 'slide_id', 'partner_id' -
public_viewsIntegercopy=Falsedefault=0readonly=True args: '# of Public Views' -
question_idsOne2many → slide.questioncopy=Truestring='Questions' args: 'slide.question', 'slide_id' -
questions_countIntegercompute='_compute_questions_count'string='Numbers of Questions' -
quiz_first_attempt_rewardIntegerdefault=10 args: 'Reward: first attempt' -
quiz_fourth_attempt_rewardIntegerdefault=2 args: 'Reward: every attempt after the third try' -
quiz_second_attempt_rewardIntegerdefault=7 args: 'Reward: second attempt' -
quiz_third_attempt_rewardIntegerdefault=5 args: 'Reward: third attempt' -
sequenceIntegerdefault=0 args: 'Sequence' -
slide_categorySelectiondefault='document'required=Truestring='Category' args: [('infographic', 'Image'), ('article', 'Article'), ('document', 'Document'), ('video', 'Video'), ('quiz', 'Quiz')] -
slide_icon_classCharcompute='_compute_slide_icon_class' args: 'Slide Icon fa-class' -
slide_idsOne2many → slide.slidestring='Content' args: 'slide.slide', 'category_id' -
slide_partner_idsOne2many → slide.slide.partnercopy=Falsegroups='website_slides.group_website_slides_officer'string='Subscribers information' args: 'slide.slide.partner', 'slide_id' -
slide_resource_downloadableBooleandefault=Falsehelp='Allow the user to download the content of the slide.' args: 'Allow Download' -
slide_resource_idsOne2many → slide.slide.resourcecopy=Truestring='Additional Resource for this slide' args: 'slide.slide.resource', 'slide_id' -
slide_typeSelectioncompute='_compute_slide_type'help='Subtype of the slide category, allows more precision on the actual file type / source type.'readonly=Falsestore=Truestring='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_viewsIntegercompute='_compute_slide_views'store=True args: '# of Website Views' -
source_typeSelectiondefault='local_file'required=True args: [('local_file', 'Upload from Device'), ('external', 'Retrieve from Google Drive')] -
tag_idsMany2many → slide.tagstring='Tags' args: 'slide.tag', 'rel_slide_tag', 'slide_id', 'tag_id' -
total_slidesIntegercompute='_compute_slides_statistics'store=True -
total_viewsIntegercompute='_compute_total'default='0'store=True args: '# Total Views' -
urlCharhelp='URL of the Google Drive file or URL of the YouTube video' args: 'External URL' -
user_has_completedBooleancompute='_compute_user_membership_id'compute_sudo=False args: 'Is Member' -
user_has_completed_categoryBooleancompute='_compute_category_completed' args: 'Is Category Completed' -
user_idMany2one → res.usersdefault=<expr>string='Uploaded by' args: 'res.users' -
user_membership_idMany2one → slide.slide.partnercompute='_compute_user_membership_id'compute_sudo=Falsehelp='Subscriber information for the current logged in user'string='Subscriber information' args: 'slide.slide.partner' -
user_voteIntegercompute='_compute_user_membership_id'compute_sudo=False args: 'User vote' -
video_source_typeSelectioncompute='_compute_video_source_type'string='Video Source' args: [('youtube', 'YouTube'), ('google_drive', 'Google Drive'), ('vimeo', 'Vimeo')] -
video_urlCharhelp='Link of the video (we support YouTube, Google Drive and Vimeo as sources)'readonly=Falserelated='url' args: 'Video Link' -
vimeo_idCharcompute='_compute_vimeo_id' args: 'Video Vimeo ID' -
website_idMany2onereadonly=Truerelated='channel_id.website_id' -
website_publishedBooleantracking=False -
website_share_urlCharcompute='_compute_website_share_url' args: 'Share URL' -
youtube_idCharcompute='_compute_youtube_id' args: 'Video YouTube ID'
-
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_idMany2one → slide.channelindex=Trueondelete='cascade'related='slide_id.channel_id'store=Truestring='Channel' args: 'slide.channel' -
completedBooleanargs: 'Completed' -
partner_idMany2one → res.partnerindex=Trueondelete='cascade'required=True args: 'res.partner' -
quiz_attempts_countIntegerdefault=0 args: 'Quiz attempts count' -
slide_categorySelectionrelated='slide_id.slide_category' -
slide_idMany2one → slide.slideindex=Trueondelete='cascade'required=Truestring='Content' args: 'slide.slide' -
voteIntegerdefault=0 args: 'Vote'
-
create(self, vals_list)@api.model_create_multi -
write(self, vals)
New fields (8)
-
dataBinarycompute='_compute_reset_resources'readonly=Falsestore=True args: 'Resource' -
download_urlCharcompute='_compute_download_url' args: 'Download URL' -
file_nameCharstore=True -
linkCharcompute='_compute_reset_resources'readonly=Falsestore=True args: 'Link' -
nameCharcompute='_compute_name'readonly=Falsestore=True args: 'Name' -
resource_typeSelectionrequired=True args: [('file', 'File'), ('url', 'Link')] -
sequenceIntegerstring='Sequence' -
slide_idMany2one → slide.slideindex=Trueondelete='cascade'required=True args: 'slide.slide'
No public methods.
New fields (1)
-
nameCharrequired=Truetranslate=True args: 'Name'
No public methods.
New fields (1)
-
website_slide_google_app_keyChargroups='base.group_system' args: 'Google Doc Key'
-
get_suggested_controllers(self)
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…