TIP: You can type at any time to perform a new search.
Slides
website_slides · OCA/website
Security findings
Migration considerations
- Imports from the old `openerp.addons.web` namespace: renamed to `odoo` since Odoo 10.0. migration-openerp-import · source
- Imports from the old `openerp.exceptions` namespace: renamed to `odoo` since Odoo 10.0. migration-openerp-import · source
- Imports from the old `openerp.http` namespace: renamed to `odoo` since Odoo 10.0. migration-openerp-import · source
- Imports from the old `openerp.tools.translate` namespace: renamed to `odoo` since Odoo 10.0. migration-openerp-import · source
- Imports from the old `openerp.osv` namespace: renamed to `odoo` since Odoo 10.0. migration-openerp-import · source
- Imports from the old `openerp` namespace: renamed to `odoo` since Odoo 10.0. migration-openerp-import · source
- Imports from the old `openerp.exceptions` namespace: renamed to `odoo` since Odoo 10.0. migration-openerp-import · source
- Imports from the old `openerp.addons.website.models.website` namespace: renamed to `odoo` since Odoo 10.0. migration-openerp-import · source
- Imports from the old `openerp` namespace: renamed to `odoo` since Odoo 10.0. migration-openerp-import · source
- For a target of Odoo 10.0+: use the `__manifest__.py` manifest name instead of `__openerp__.py`. The filename alone does not establish module age or compatibility. migration-openerp-manifest · source
WebsitePublishedMixin— Class 'WebsitePublishedMixin' still inherits from the old-style `osv.AbstractModel` API: rewrite it against `models.Model`/`models.TransientModel`/`models.AbstractModel` - the old `osv`/`orm` API was removed entirely in modern Odoo. migration-old-api-base · sourceWebsitePublishedMixin— Class 'WebsitePublishedMixin' declares `_columns` as a plain dict: old-style field/default declarations, replace with `fields.X(...)` class attributes and `default=`. migration-old-style-fields · sourceview_slide_channel_form— For a target of Odoo 17.0+: view 'view_slide_channel_form' uses `attrs=`/`states=`, which are no longer supported. Convert modifiers to direct Python boolean expressions in `invisible`/`readonly`/`required`; preserve the original AND/OR logic. migration-view-attrs-states · sourceview_slide_slide_form— For a target of Odoo 17.0+: view 'view_slide_slide_form' uses `attrs=`/`states=`, which are no longer supported. Convert modifiers to direct Python boolean expressions in `invisible`/`readonly`/`required`; preserve the original AND/OR logic. migration-view-attrs-states · sourceslide_detail_view— Template 'slide_detail_view' uses `t-raw`, deprecated since Odoo 15.0. Prefer `t-out` for escaped output. For intentional HTML, verify sanitization at its source before marking it safe; Markup alone does not sanitize untrusted content. migration-template-t-raw · sourceview_slide_channel_tree— View 'view_slide_channel_tree' is defined with a `<tree>` root tag: renamed to `<list>` in Odoo 18.0. migration-view-tree-tag · sourceview_slide_slide_tree— View 'view_slide_slide_tree' is defined with a `<tree>` root tag: renamed to `<list>` in Odoo 18.0. migration-view-tree-tag · sourceview_slide_tag_tree— View 'view_slide_tag_tree' is defined with a `<tree>` root tag: renamed to `<list>` in Odoo 18.0. migration-view-tree-tag · sourceview_slides_category_tree— View 'view_slides_category_tree' is defined with a `<tree>` root tag: renamed to `<list>` in Odoo 18.0. migration-view-tree-tag · source
Migration review checklist, not a compatibility verdict. No target version is selected: apply version-specific advice only when migrating to that version or later.
- Repository
- OCA/website · module folder · Try on Runboat
- Module version
- 2.0.1
- Category
- Website
- Folder size
- 9.08 MB
- License
- LGPL-3
- Application
- Yes
- Auto-installable
- No
- Website
- https://github.com/OCA/website
- Last tracking update
- 2026-08-07 07:03:10
- Authors
- Odoo SA, Odoo Community Association (OCA), Incaser Informatica - Sergio Teruel
- Maintainers
- Odoo SA, Odoo Community Association (OCA), Incaser Informatica - Sergio Teruel
- Committers
- Holger Brunn, Pedro M. Baeza, GitHub, Jairo Llopis, Stéphane Bidoul (ACSONE), Weblate, OCA Transbot, oca-travis, sergio-incaser, Andhitia Rama
Code Analysis
Views touched (30)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
pdf_js_lib |
PDF JS Library | ir.ui.view | qweb | New |
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 | Inherits website.view_website_config_settings | |
website_slides.slide_embed_assets |
Website slides embed assets | ir.ui.view | qweb | New |
HTTP endpoints (14)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/slides/<model("slide.channel", "[('can_see', '=', True)]"):channel>, /slides/<model("slide.channel", "[('can_see', '=', True)]"):channel>/page/<int:page>, /slides/<model("slide.channel", "[('can_see', '=', True)]"):channel>/<string:slide_type>, /slides/<model("slide.channel", "[('can_see', '=', True)]"):channel>/<string:slide_type>/page/<int:page>, /slides/<model("slide.channel", "[('can_see', '=', True)]"):channel>/tag/<model("slide.tag"):tag>, /slides/<model("slide.channel", "[('can_see', '=', True)]"):channel>/tag/<model("slide.tag"):tag>/page/<int:page>, /slides/<model("slide.channel", "[('can_see', '=', True)]"):channel>/category/<model("slide.category"):category>, /slides/<model("slide.channel", "[('can_see', '=', True)]"):channel>/category/<model("slide.category"):category>/page/<int:page>, /slides/<model("slide.channel", "[('can_see', '=', True)]"):channel>/category/<model("slide.category"):category>/<string:slide_type>, /slides/<model("slide.channel", "[('can_see', '=', True)]"):channel>/category/<model("slide.category"):category>/<string:slide_type>/page/<int:page> |
WebsiteSlides.channel |
public | http | ALL | website |
/slides/add_slide |
WebsiteSlides.create_slide |
user | json | POST | website |
/slides/dialog_preview |
WebsiteSlides.dialog_preview |
user | json | POST | website |
/slides/slide/<model("slide.slide", "[('channel_id.can_see', '=', True)]"):slide>/comment |
WebsiteSlides.slide_comment |
public | http | POST | sudo website |
/slides/slide/dislike |
WebsiteSlides.slide_dislike |
user | json | ALL | website |
/slides/slide/<model("slide.slide", "[('channel_id.can_see', '=', True), ('download_security', '=', 'public')]"):slide>/download |
WebsiteSlides.slide_download |
public | http | ALL | website |
/slides/slide/overlay |
WebsiteSlides.slide_get_next_slides |
public | json | ALL | website |
/slides/slide/<model("slide.slide", "[('channel_id.can_see', '=', True), ('datas', '!=', False), ('slide_type', '=', 'presentation')]"):slide>/pdf_content |
WebsiteSlides.slide_get_pdf_content |
public | http | ALL | website |
/slides/slide/like |
WebsiteSlides.slide_like |
user | json | ALL | website |
/slides/slide/send_share_email |
WebsiteSlides.slide_send_share_email |
user | json | ALL | website |
/slides/slide/<model("slide.slide"):slide>/promote |
WebsiteSlides.slide_set_promoted |
user | http | ALL | website |
/slides/slide/<model("slide.slide", "[('channel_id.can_see', '=', True)]"):slide> |
WebsiteSlides.slide_view |
public | http | ALL | website |
/slides/embed/<int:slide_id> |
WebsiteSlides.slides_embed |
public | http | ALL | sudo website |
/slides |
WebsiteSlides.slides_index |
public | http | ALL | website |
Models touched (7)
New fields (9)
-
channel_idMany2one → slide.channelondelete='cascade'required=Truestring='Channel' args: 'slide.channel' -
nameCharrequired=Truetranslate=True args: 'Name' -
nbr_documentsIntegercompute='_count_presentations'store=True args: 'Number of Documents' -
nbr_infographicsIntegercompute='_count_presentations'store=True args: 'Number of Infographics' -
nbr_presentationsIntegercompute='_count_presentations'store=True args: 'Number of Presentations' -
nbr_videosIntegercompute='_count_presentations'store=True args: 'Number of Videos' -
sequenceIntegerdefault=10help='Display order' -
slide_idsOne2many → slide.slidestring='Slides' args: 'slide.slide', 'category_id' -
totalIntegercompute='_count_presentations'store=True
No public methods.
New fields (22)
-
access_error_msgHtmldefault='<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_seeBooleancompute='_compute_access'search='_search_can_see' args: 'Can See' -
can_see_fullBooleancompute='_compute_access' args: 'Full Access' -
can_uploadBooleancompute='_compute_access' args: 'Can Upload' -
category_idsOne2many → slide.categorystring='Categories' args: 'slide.category', 'channel_id' -
custom_slide_idMany2one → slide.slidestring='Slide to Promote' args: 'slide.slide' -
descriptionHtmltranslate=True args: 'Description' -
group_idsMany2many → res.groupshelp='Groups allowed to see presentations in this channel'string='Channel Groups' args: 'res.groups', 'rel_channel_groups', 'channel_id', 'group_id' -
nameCharrequired=Truetranslate=True args: 'Name' -
nbr_documentsIntegercompute='_count_presentations'store=True args: 'Number of Documents' -
nbr_infographicsIntegercompute='_count_presentations'store=True args: 'Number of Infographics' -
nbr_presentationsIntegercompute='_count_presentations'store=True args: 'Number of Presentations' -
nbr_videosIntegercompute='_count_presentations'store=True args: 'Number of Videos' -
promote_strategySelectiondefault='most_voted'required=Truestring='Featuring Policy' args: [('none', 'No Featured Presentation'), ('latest', 'Latest Published'), ('most_voted', 'Most Voted'), ('most_viewed', 'Most Viewed'), ('custom', 'Featured Presentation')] -
promoted_slide_idMany2one → slide.slidecompute='_compute_promoted_slide_id'store=Truestring='Featured Slide' args: 'slide.slide' -
publish_template_idMany2one → email.templatedefault=<expr>help='Email template to send slide publication through email'string='Published Template' args: 'email.template' -
sequenceIntegerdefault=10help='Display order' -
share_template_idMany2one → email.templatedefault=<expr>help='Email template used when sharing a slide'string='Shared Template' args: 'email.template' -
slide_idsOne2many → slide.slidestring='Slides' args: 'slide.slide', 'channel_id' -
totalIntegercompute='_count_presentations'store=True -
upload_group_idsMany2many → res.groupshelp='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' -
visibilitySelectiondefault='public'required=True args: [('public', 'Public'), ('private', 'Private'), ('partial', 'Show channel but restrict presentations')]
-
change_visibility(self)@api.onchange('visibility')
New fields (3)
-
count_viewsIntegerdefault=1 args: '# Views' -
slide_idMany2one → slide.slideindex=Truerequired=Truestring='Presentation' args: 'slide.slide' -
urlCharrequired=True args: 'Third Party Website URL'
-
add_embed_url(self, slide_id, url)
New fields (24)
-
category_idMany2one → slide.categorydomain="[('channel_id', '=', channel_id)]"string='Category' args: 'slide.category' -
channel_idMany2one → slide.channelrequired=Truestring='Channel' args: 'slide.channel' -
datasBinaryargs: 'Content' -
date_publishedDatetimeargs: 'Publish Date' -
descriptionTexttranslate=True args: 'Description' -
dislikesIntegerargs: 'Dislikes' -
document_idCharhelp='Youtube or Google Document ID' args: 'Document ID' -
download_securitySelectiondefault='user'required=Truestring='Download Security' args: [('none', 'No One'), ('user', 'Authentified Users Only'), ('public', 'Everyone')] -
embed_codeTextcompute='_get_embed_code'readonly=True args: 'Embed Code' -
embed_viewsIntegerargs: '# of Embedded Views' -
embedcount_idsOne2many → slide.embedstring='Embed Count' args: 'slide.embed', 'slide_id' -
imageBinaryattachment=True args: 'Image' -
image_mediumBinaryattachment=Truecompute='_get_image'store=True args: 'Medium' -
image_thumbBinaryattachment=Truecompute='_get_image'store=True args: 'Thumbnail' -
index_contentTextargs: 'Transcript' -
likesIntegerargs: 'Likes' -
mime_typeCharargs: 'Mime-type' -
nameCharrequired=Truetranslate=True args: 'Title' -
slide_typeSelectiondefault='document'help='Document type will be set automatically depending on file type, height and width.'required=Truestring='Type' args: [('infographic', 'Infographic'), ('presentation', 'Presentation'), ('document', 'Document'), ('video', 'Video')] -
slide_viewsIntegerargs: '# of Website Views' -
tag_idsMany2many → slide.tagstring='Tags' args: 'slide.tag', 'rel_slide_tag', 'slide_id', 'tag_id' -
total_viewsIntegercompute='_compute_total'default='0'store=True args: 'Total # Views' -
urlCharhelp='Youtube or Google Document URL' args: 'Document URL' -
website_message_idsOne2many → mail.messagedomain=<expr>help='Website communication history'string='Website Messages' args: 'mail.message', 'res_id'
-
check_field_access_rights(self, operation, fields)@api.modelAs 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)
-
nameCharrequired=True args: 'Name'
No public methods.
New fields (1)
-
website_slide_google_app_keyCharstring='Google Doc Key'
-
get_default_website_slide_google_app_key(self, fields)@api.model -
set_website_slide_google_app_key(self)@api.multi
New fields (0)
No new fields.
Public methods (1)-
open_website_url(self, cr, uid, ids, context=None)