diff --git a/addons/website_sale_slides/i18n/website_sale_slides.pot b/addons/website_sale_slides/i18n/website_sale_slides.pot index 9dbb6846c68399075bcf201c486056d0a480d56d..aee7da74039e59f7ac3e830d82ecba0576d5c639 100644 --- a/addons/website_sale_slides/i18n/website_sale_slides.pot +++ b/addons/website_sale_slides/i18n/website_sale_slides.pot @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~15.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-19 13:58+0000\n" -"PO-Revision-Date: 2022-04-19 13:58+0000\n" +"POT-Creation-Date: 2022-05-20 12:45+0000\n" +"PO-Revision-Date: 2022-05-20 12:45+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -272,5 +272,5 @@ msgstr "" #. module: website_sale_slides #: model_terms:ir.ui.view,arch_db:website_sale_slides.course_buy_course_link -msgid "to download resources" +msgid "to access resources" msgstr "" diff --git a/addons/website_sale_slides/views/website_slides_templates.xml b/addons/website_sale_slides/views/website_slides_templates.xml index 4e43c50ea7319e04550a753424cae8dfe66de6d8..553846536b690281a273ada6483e475e21a92c44 100644 --- a/addons/website_sale_slides/views/website_slides_templates.xml +++ b/addons/website_sale_slides/views/website_slides_templates.xml @@ -14,7 +14,7 @@ </template> <template name="Buy Course To Download Resource" id="slide_aside_training_category_buy_course" inherit_id="website_slides.slide_aside_training_category"> - <xpath expr="//div[hasclass('o_wslides_js_course_join')]" position="inside"> + <xpath expr="//div[hasclass('o_wslides_js_course_join') and hasclass('o_wslides_no_access')]" position="inside"> <li t-elif="aside_slide.channel_id.enroll == 'payment'" class="text-decoration-none small"> <i class="fa fa-download mr-1"/> <t t-call="website_sale_slides.course_buy_course_link"> @@ -25,7 +25,7 @@ </template> <template name="Buy Course To Download Resource Slide Detail" id="slide_content_detailed_buy_course" inherit_id="website_slides.slide_content_detailed"> - <xpath expr="//div[hasclass('o_wslides_js_course_join')]" position="inside"> + <xpath expr="//div[hasclass('o_wslides_js_course_join') and hasclass('o_wslides_no_access')]" position="inside"> <span t-elif="slide.channel_id.enroll == 'payment'" class="text-muted mr-auto border-left pl-3"> <t t-call="website_sale_slides.course_buy_course_link"/> </span> @@ -59,7 +59,7 @@ </template> <template name="Buy Course To Download Resource Fullscreen" id="slide_fullscreen_sidebar_category_buy_course" inherit_id="website_slides.slide_fullscreen_sidebar_category"> - <xpath expr="//div[hasclass('o_wslides_js_course_join')]" position="inside"> + <xpath expr="//div[hasclass('o_wslides_js_course_join') and hasclass('o_wslides_no_access')]" position="inside"> <li t-elif="slide.channel_id.enroll == 'payment'" class="o_wslides_fs_slide_link mb-1"> <i class="fa fa-download mr-1"/> <t t-call="website_sale_slides.course_buy_course_link"/> @@ -80,7 +80,7 @@ <!-- TOOLS --> <template name="Buy Course Link" id="course_buy_course_link"> <a class="post_link" t-att-href="'/shop/cart/update?product_id=%s' % slide.channel_id.product_id.id"> - Buy Course</a> to download resources + Buy Course</a> to access resources </template> <template name="Buy Course Button" id="course_buy_course_button"> diff --git a/addons/website_slides/i18n/website_slides.pot b/addons/website_slides/i18n/website_slides.pot index 9f66da3fabddd5cf385687f81b306a9da2d2da1d..79457a38d20e629eb7794057591a700eec7d0eee 100644 --- a/addons/website_slides/i18n/website_slides.pot +++ b/addons/website_slides/i18n/website_slides.pot @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~15.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-19 13:57+0000\n" -"PO-Revision-Date: 2022-04-19 13:57+0000\n" +"POT-Creation-Date: 2022-05-20 12:38+0000\n" +"PO-Revision-Date: 2022-05-20 12:38+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -628,6 +628,14 @@ msgstr "" msgid "<span class=\"text-500 mx-2\">•</span>" msgstr "" +#. module: website_slides +#: model_terms:ir.ui.view,arch_db:website_slides.slide_content_detailed +msgid "" +"<span class=\"text-muted font-weight-bold mr-3\">\n" +" Additional Resources\n" +" </span>" +msgstr "" + #. module: website_slides #: model_terms:ir.ui.view,arch_db:website_slides.slide_content_detailed msgid "<span class=\"text-muted font-weight-bold mr-3\">External sources</span>" @@ -5650,7 +5658,7 @@ msgstr "" #. module: website_slides #: model_terms:ir.ui.view,arch_db:website_slides.join_course_link -msgid "to download resources" +msgid "to access resources" msgstr "" #. module: website_slides diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py index f661ce6aff524a3320ff3d84b058daa7382eef15..e000d0ec8db4312ebdb9fed20bff6f321d4ad8b6 100644 --- a/addons/website_slides/models/slide_slide.py +++ b/addons/website_slides/models/slide_slide.py @@ -300,6 +300,13 @@ class Slide(models.Model): for slide in self: slide.questions_count = len(slide.question_ids) + def _has_additional_resources(self, resource_type=None): + """Sudo required for public user to know if the course has additional + resources that they will be able to access once a member.""" + self.ensure_one() + domain = [('resource_type', '=', resource_type)] if resource_type else [] + return bool(self.sudo().slide_resource_ids.filtered_domain(domain)) + @api.depends('website_message_ids.res_id', 'website_message_ids.model', 'website_message_ids.message_type') def _compute_comments_count(self): for slide in self: diff --git a/addons/website_slides/security/ir.model.access.csv b/addons/website_slides/security/ir.model.access.csv index 0336e1bf8b204ff2d3a81ca63ed5667ce37fae01..589abdf738e5762cf7e5b13a6e74c06a7f708b55 100644 --- a/addons/website_slides/security/ir.model.access.csv +++ b/addons/website_slides/security/ir.model.access.csv @@ -21,7 +21,9 @@ access_slide_channel_partners_all,slide.channel.users.all,model_slide_channel_pa access_slide_channel_partners_system,slide.channel.users.system,model_slide_channel_partner,website_slides.group_website_slides_officer,1,1,1,1 access_slide_embed_all,slide.embed.all,model_slide_embed,,1,0,0,0 access_slide_embed_user,slide.embed.user,model_slide_embed,base.group_user,1,1,1,1 -access_slide_slide_resource_all,slide.slide.resource.all,model_slide_slide_resource,,1,0,0,0 +access_slide_slide_resource_all,slide.slide.resource.all,model_slide_slide_resource,,0,0,0,0 access_slide_slide_resource_public,slide.slide.resource.public,model_slide_slide_resource,base.group_public,0,0,0,0 +access_slide_slide_resource_portal,slide.slide.resource.portal,model_slide_slide_resource,base.group_portal,1,0,0,0 +access_slide_slide_resource_internal,slide.slide.resource.internal,model_slide_slide_resource,base.group_user,1,0,0,0 access_slide_slide_resource_publisher,slide.slide.resource.publisher,model_slide_slide_resource,website_slides.group_website_slides_officer,1,1,1,1 access_slide_channel_invite,access.slide.channel.invite,model_slide_channel_invite,base.group_user,1,1,1,0 diff --git a/addons/website_slides/security/website_slides_security.xml b/addons/website_slides/security/website_slides_security.xml index 5964c06984f74863b0c26e693f99618640ee6f63..cd789eb8bffd40445cdddcbbf1a24c4afcf0593e 100644 --- a/addons/website_slides/security/website_slides_security.xml +++ b/addons/website_slides/security/website_slides_security.xml @@ -189,7 +189,7 @@ <!--SLIDE RESOURCE--> <record id="rule_slide_slide_resource_downloadable" model="ir.rule"> - <field name="name">Resource: restricted to channel members and channel responsible</field> + <field name="name">Resource: read restricted to channel members and channel responsible</field> <field name="model_id" ref="model_slide_slide_resource"/> <field name="domain_force">[('slide_id.channel_id.partner_ids', '=', user.partner_id.id)]</field> <field name="groups" eval="[(4, ref('base.group_portal')), (4, ref('base.group_user'))]"/> @@ -199,6 +199,28 @@ <field name="perm_unlink" eval="False"/> </record> + <record id="rule_slide_slide_resource_officer_read" model="ir.rule"> + <field name="name">Resource: officer: read all</field> + <field name="model_id" ref="model_slide_slide_resource"/> + <field name="domain_force">[(1, '=', 1)]</field> + <field name="groups" eval="[(4, ref('group_website_slides_officer'))]"/> + <field name="perm_read" eval="True"/> + <field name="perm_write" eval="False"/> + <field name="perm_create" eval="False"/> + <field name="perm_unlink" eval="False"/> + </record> + + <record id="rule_slide_slide_resource_officer_crud" model="ir.rule"> + <field name="name">Resource: officer: crud own only</field> + <field name="model_id" ref="model_slide_slide_resource"/> + <field name="domain_force">[('slide_id.channel_id.user_id', '=', user.id)]</field> + <field name="groups" eval="[(4, ref('group_website_slides_officer'))]"/> + <field name="perm_read" eval="True"/> + <field name="perm_write" eval="True"/> + <field name="perm_create" eval="True"/> + <field name="perm_unlink" eval="True"/> + </record> + <record id="rule_slide_slide_resource_downloadable_manager" model="ir.rule"> <field name="name">Resource: manager: crud all</field> <field name="model_id" ref="model_slide_slide_resource"/> diff --git a/addons/website_slides/tests/test_security.py b/addons/website_slides/tests/test_security.py index 78fad40b5058727d69d327198384e4ea1529ec70..71aef50291f22d2cfa4ea951f145640c80bf3859 100644 --- a/addons/website_slides/tests/test_security.py +++ b/addons/website_slides/tests/test_security.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +import base64 +from odoo.addons.mail.tests.common import mail_new_test_user from odoo.addons.website_slides.tests import common from odoo.exceptions import AccessError from odoo.tests import tagged @@ -297,3 +299,69 @@ class TestAccessFeatures(common.SlidesCase): channel_superuser.invalidate_cache(['can_upload', 'can_publish']) self.assertTrue(channel_superuser.can_upload) self.assertTrue(channel_superuser.can_publish) + + @mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_rule', 'odoo.addons.base.models.ir_model') + def test_resource_access(self): + resource_values = { + 'name': 'Image', + 'slide_id': self.slide_3.id, + 'resource_type': 'file', + 'data': base64.b64encode(b'Some content') + } + resource1, resource2 = self.env['slide.slide.resource'].with_user(self.user_officer).create( + [resource_values for _ in range(2)]) + resource3 = self.env['slide.slide.resource'].with_user(self.user_officer).create([ + {'name': 'Link', + 'slide_id': self.slide_3.id, + 'resource_type': 'url', + 'link': 'https://www.odoo.com'} + ]) + # No public access to resources + with self.assertRaises(AccessError): + resource1.with_user(self.user_public).read(['name']) + resource3.with_user(self.user_public).read(['name']) + + with self.assertRaises(AccessError): + resource1.with_user(self.user_public).write({'name': 'other name'}) + resource3.with_user(self.user_public).write({'name': 'other name'}) + + # public access to knowing if there are resources, also by type + self.assertTrue(self.slide_3.with_user(self.user_public)._has_additional_resources()) + self.assertTrue(self.slide_3.with_user(self.user_public)._has_additional_resources('file')) + self.assertTrue(self.slide_3.with_user(self.user_public)._has_additional_resources('url')) + + # No random portal access + with self.assertRaises(AccessError): + resource1.with_user(self.user_portal).read(['name']) + + # Members can only read + self.env['slide.channel.partner'].create({ + 'channel_id': self.channel.id, + 'partner_id': self.user_portal.partner_id.id, + }) + resource1.with_user(self.user_portal).read(['name']) + with self.assertRaises(AccessError): + resource1.with_user(self.user_portal).write({'name': 'other name'}) + + # Other officers can only read + user_officer_other = mail_new_test_user( + self.env, name='Ornella Officer', login='user_officer_2', email='officer2@example.com', + groups='base.group_user,website_slides.group_website_slides_officer' + ) + resource1.with_user(user_officer_other).read(['name']) + with self.assertRaises(AccessError): + resource1.with_user(user_officer_other).write({'name': 'Another name'}) + + with self.assertRaises(AccessError): + self.env['slide.slide.resource'].with_user(user_officer_other).create(resource_values) + with self.assertRaises(AccessError): + resource1.with_user(user_officer_other).unlink() + + # Responsible officer can do anything on their own channels + resource1.with_user(self.user_officer).write({'name': 'other name'}) + resource1.with_user(self.user_officer).unlink() + + # Managers can do anything on all channels + resource2.with_user(self.user_manager).write({'name': 'Another name'}) + resource2.with_user(self.user_manager).unlink() + self.env['slide.slide.resource'].with_user(self.user_manager).create(resource_values) diff --git a/addons/website_slides/views/website_slides_templates_lesson.xml b/addons/website_slides/views/website_slides_templates_lesson.xml index f5e7b1134b6572a22c1fdad9a10f2906d93fd2c5..a77aeb1c045dd9699835025bc6bb15ac96fc6ccf 100644 --- a/addons/website_slides/views/website_slides_templates_lesson.xml +++ b/addons/website_slides/views/website_slides_templates_lesson.xml @@ -145,10 +145,11 @@ </t> </a> <ul class="collapse show p-0 m-0 list-unstyled" t-att-id="('collapse-%s') % (category.id if category else 0)" > + <t t-set="is_member" t-value="slide.channel_id.is_member"/> + <t t-set="can_access_channel" t-value="is_member or slide.channel_id.can_publish"/> <t t-foreach="category_slide_ids" t-as="aside_slide"> <t t-set="slide_completed" t-value="channel_progress[aside_slide.id].get('completed')"/> - <t t-set="is_member" t-value="slide.channel_id.is_member"/> - <t t-set="can_access" t-value="aside_slide.is_preview or is_member or slide.channel_id.can_publish"/> + <t t-set="can_access" t-value="aside_slide.is_preview or can_access_channel"/> <li class="p-0 pb-1"> <div t-att-class="'o_wslides_lesson_aside_list_link d-flex align-items-center p-1 %s%s' % (('bg-100 active' if aside_slide == slide else ''), 'text-muted' if not can_access else '')" t-att-data-id="slide.id" @@ -172,27 +173,25 @@ </div> </a> </div> - <ul t-if="aside_slide.slide_resource_ids or aside_slide.question_ids" class="list-group px-2 mb-1 list-unstyled"> - <t t-foreach="aside_slide.slide_resource_ids" t-as="resource" t-if="resource.resource_type == 'url'"> - <li class="pl-4"> - <a t-if="can_access" t-att-href="resource.link" target="new" class="text-decoration-none small"> - <i class="fa fa-link mr-1"/><span t-field="resource.name"/> - </a> - <span t-else="" class="text-decoration-none text-muted small"> - <i class="fa fa-link mr-1"/><span t-field="resource.name"/> - </span> - </li> - </t> - <t t-set="resource_file_ids" t-value="aside_slide.slide_resource_ids.filtered(lambda res: res.resource_type == 'file')"/> - <div class="o_wslides_js_course_join pl-4" t-if="resource_file_ids"> - <t t-if="is_member or aside_slide.channel_id.can_publish"> - <li t-foreach="resource_file_ids" t-as="resource"> + <ul t-if="aside_slide._has_additional_resources() or aside_slide.question_ids" class="list-group px-2 mb-1 list-unstyled"> + <t t-if="can_access_channel"> + <t t-foreach="aside_slide.slide_resource_ids" t-as="resource" t-if="resource.resource_type == 'url'"> + <li class="pl-4"> + <a t-if="can_access" t-att-href="resource.link" target="new" class="text-decoration-none small"> + <i class="fa fa-link mr-1"/><span t-field="resource.name"/> + </a> + </li> + </t> + <div class="o_wslides_js_course_join pl-4" t-if="aside_slide._has_additional_resources()"> + <li t-foreach="aside_slide.slide_resource_ids" t-as="resource" t-if="resource.resource_type == 'file'"> <a t-attf-href="/web/content/slide.slide.resource/#{resource.id}/data?download=true" class="text-decoration-none small"> <i class="fa fa-download mr-1"/><span t-field="resource.name"/> </a> </li> - </t> - <li t-elif="aside_slide.channel_id.enroll == 'public'" class="text-decoration-none small"> + </div> + </t> + <div t-else="" class="o_wslides_js_course_join o_wslides_no_access"> + <li t-if="aside_slide.channel_id.enroll == 'public'" class="text-decoration-none small"> <i class="fa fa-download mr-1"/> <t t-call="website_slides.join_course_link"/> </li> @@ -430,31 +429,43 @@ </div> </div> <div class="row mt-3 mb-3"> - <t t-set="links" t-value="slide.slide_resource_ids.filtered(lambda res: res.resource_type == 'url')"/> - <t t-set="files" t-value="slide.slide_resource_ids.filtered(lambda res: res.resource_type == 'file' and res.data)"/> - <div class="col-12 col-md d-flex align-items-start mb-4 mb-md-0" t-if="links"> - <span class="text-muted font-weight-bold mr-3">External sources</span> - <div class="text-muted mr-auto border-left pl-3"> - <t t-foreach="links" t-as="link"> - <a t-att-href="link.link" t-esc="link.name"/><br /> - </t> - </div> - </div> - <group> - <div class="col-12 col-md d-flex align-items-start mb-4 mb-md-0 o_wslides_js_course_join" t-if="files"> - <span t-if="slide.channel_id.is_member or slide.channel_id.can_publish or slide.is_preview or slide.channel_id.enroll in ['private', 'payment']" class="text-muted font-weight-bold mr-3"> + <t t-if="slide._has_additional_resources()"> + <t t-set="can_access_channel" t-value="slide.channel_id.is_member or slide.channel_id.can_publish"/> + <t t-if="can_access_channel"> + <t t-set="links" t-value="slide.slide_resource_ids.filtered(lambda res: res.resource_type == 'url')"/> + <div class="col-12 col-md d-flex align-items-start mb-4 mb-md-0" t-if="links"> + <span class="text-muted font-weight-bold mr-3">External sources</span> + <div class="text-muted mr-auto border-left pl-3"> + <t t-foreach="links" t-as="link"> + <a t-att-href="link.link" t-esc="link.name"/><br /> + </t> + </div> + </div> + <group> + <t t-set="files" t-value="slide.slide_resource_ids.filtered(lambda res: res.resource_type == 'file' and res.data)"/> + <div class="col-12 col-md d-flex align-items-start mb-4 mb-md-0 o_wslides_js_course_join" t-if="files"> + <span class="text-muted font-weight-bold mr-3"> + Additional Resources + </span> + <div class="text-muted mr-auto border-left pl-3"> + <t t-foreach="slide.slide_resource_ids" t-as="resource" t-if="resource.resource_type == 'file' and resource.data"> + <a t-attf-href="/web/content/slide.slide.resource/#{resource.id}/data?download=true" t-esc="resource.name"/><br /> + </t> + </div> + </div> + </group> + </t> + <t t-else=""> + <span t-if="slide.is_preview or slide.channel_id.enroll in ['private', 'payment']" class="text-muted font-weight-bold mr-3"> Additional Resources </span> - <div t-if="slide.channel_id.is_member or slide.channel_id.can_publish" class="text-muted mr-auto border-left pl-3"> - <t t-foreach="files" t-as="resource"> - <a t-attf-href="/web/content/slide.slide.resource/#{resource.id}/data?download=true" t-esc="resource.name"/><br /> - </t> - </div> - <div t-elif="slide.channel_id.enroll == 'public'" class="text-muted mr-auto border-left pl-3"> - <t t-call="website_slides.join_course_link"/> + <div class="o_wslides_js_course_join o_wslides_no_access"> + <div t-if="slide.channel_id.enroll == 'public'" class="text-muted mr-auto border-left pl-3"> + <t t-call="website_slides.join_course_link"/> + </div> </div> - </div> - </group> + </t> + </t> </div> </template> diff --git a/addons/website_slides/views/website_slides_templates_lesson_fullscreen.xml b/addons/website_slides/views/website_slides_templates_lesson_fullscreen.xml index fb9bd32d5ea91c160619da95e494b12d778e0ad0..9b9b6eb4f757cc1300488c17d439bee827f5f757 100644 --- a/addons/website_slides/views/website_slides_templates_lesson_fullscreen.xml +++ b/addons/website_slides/views/website_slides_templates_lesson_fullscreen.xml @@ -101,10 +101,11 @@ <b t-field="category.name"/> </a> <ul class="o_wslides_fs_sidebar_section_slides collapse show position-relative px-0 pb-1 my-0 mx-n3" t-att-id="('collapse-%s') % (category.id if category else 0)"> + <t t-set="is_member" t-value="current_slide.channel_id.is_member"/> + <t t-set="can_access_channel" t-value="is_member or current_slide.channel_id.can_publish"/> <t t-foreach="slides" t-as="slide"> <t t-set="slide_completed" t-value="channel_progress[slide.id].get('completed')"/> - <t t-set="is_member" t-value="current_slide.channel_id.is_member"/> - <t t-set="can_access" t-value="slide.is_preview or is_member or current_slide.channel_id.can_publish"/> + <t t-set="can_access" t-value="can_access_channel or slide.is_preview"/> <li t-attf-class="o_wslides_fs_sidebar_list_item d-flex align-items-center py-1 #{'active' if slide.id == current_slide.id else ''}" t-att-data-id="slide.id" t-att-data-can-access="can_access" @@ -137,26 +138,25 @@ <div class="o_wslides_fs_slide_name text-600" t-esc="slide.name"/> </div> </span> - <ul class="list-unstyled w-100 pt-2 small" t-if="slide.slide_resource_ids or (slide.question_ids and not slide.slide_category =='quiz')" > - <t t-set="links" t-value="slide.slide_resource_ids.filtered(lambda res: res.resource_type == 'url')"/> - <li t-if="links" t-foreach="links" t-as="link" class="pl-0 mb-1"> - <a t-if="can_access" class="o_wslides_fs_slide_link" t-att-href="link.link" target="_blank"> - <i class="fa fa-link mr-2"/><span t-esc="link.name"/> - </a> - <span t-else="" class="o_wslides_fs_slide_link text-600"> - <i class="fa fa-link mr-2"/><span t-esc="link.name"/> - </span> - </li> - <t t-set="resources" t-value="slide.slide_resource_ids.filtered(lambda res: res.resource_type == 'file')"/> - <div class="o_wslides_js_course_join pl-0" t-if="resources"> - <t t-if="is_member or slide.channel_id.can_publish"> + <ul class="list-unstyled w-100 pt-2 small" t-if="slide._has_additional_resources() or (slide.question_ids and not slide.slide_category =='quiz')" > + <t t-if="can_access_channel"> + <t t-set="links" t-value="slide.slide_resource_ids.filtered(lambda res: res.resource_type == 'url')"/> + <li t-foreach="links" t-as="link" class="pl-0 mb-1"> + <a t-if="can_access" class="o_wslides_fs_slide_link" t-att-href="link.link" target="_blank"> + <i class="fa fa-link mr-2"/><span t-esc="link.name"/> + </a> + </li> + <div class="o_wslides_js_course_join pl-0" t-if="slide._has_additional_resources('file')"> + <t t-set="resources" t-value="slide.slide_resource_ids.filtered(lambda res: res.resource_type == 'file')"/> <li t-foreach="resources" t-as="resource" class="mb-1"> <a class="o_wslides_fs_slide_link" t-attf-href="/web/content/slide.slide.resource/#{resource.id}/data?download=true"> <i class="fa fa-download mr-2"/><span t-esc="resource.name"/> </a> </li> - </t> - <li t-elif="slide.channel_id.enroll == 'public'" class="o_wslides_fs_slide_link mb-1"> + </div> + </t> + <div t-else="" class="o_wslides_js_course_join o_wslides_no_access pl-0"> + <li t-if="slide.channel_id.enroll == 'public'" class="o_wslides_fs_slide_link mb-1"> <i class="fa fa-download mr-1"/> <t t-call="website_slides.join_course_link"/> </li> diff --git a/addons/website_slides/views/website_slides_templates_utils.xml b/addons/website_slides/views/website_slides_templates_utils.xml index c2045eb8bf73cf5c545fee3e380e7401d6572cd5..5bbba227fbd202c8bb7717cdcefac3740cb2048d 100644 --- a/addons/website_slides/views/website_slides_templates_utils.xml +++ b/addons/website_slides/views/website_slides_templates_utils.xml @@ -92,7 +92,7 @@ <template id="join_course_link" name="Join Course Link"> <a class="o_wslides_js_course_join_link" href="#" t-att-data-channel-enroll="slide.channel_id.enroll" t-att-data-channel-id="slide.channel_id.id"> - Join Course</a> to download resources + Join Course</a> to access resources </template> <!-- Python equivalent of the JS template "website.slides.sidebar.done.button" -->