diff --git a/addons/website_slides/models/slide_slide_resource.py b/addons/website_slides/models/slide_slide_resource.py index 13eed97618b..7cd7dbe97ab 100644 --- a/addons/website_slides/models/slide_slide_resource.py +++ b/addons/website_slides/models/slide_slide_resource.py @@ -1,8 +1,11 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from werkzeug.urls import url_encode + from odoo import api, fields, models, _ from odoo.exceptions import ValidationError +from odoo.tools.mimetypes import get_extension class SlideResource(models.Model): @@ -48,3 +51,12 @@ class SlideResource(models.Model): for record in self: if record.resource_type != 'file' and record.data: raise ValidationError(_("Resource %(resource_name)s is a link and should not contain a data file", resource_name=record.name)) + + def _get_download_url(self): + self.ensure_one() + extension_file_name = get_extension(self.file_name) if self.file_name else '' + file_name = self.name if self.name.endswith(extension_file_name) else self.name + extension_file_name + return f'/web/content/slide.slide.resource/{self.id}/data?' + url_encode({ + 'download': 'true', + 'filename': file_name + }) diff --git a/addons/website_slides/tests/test_slide_resource.py b/addons/website_slides/tests/test_slide_resource.py index a10298dd737..ff50501ff54 100644 --- a/addons/website_slides/tests/test_slide_resource.py +++ b/addons/website_slides/tests/test_slide_resource.py @@ -2,14 +2,16 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from psycopg2 import IntegrityError +from werkzeug.urls import url_quote from odoo.addons.website_slides.tests import common from odoo.exceptions import ValidationError +from odoo.tests import HttpCase from odoo.tests.common import users from odoo.tools import mute_logger -class TestResources(common.SlidesCase): +class TestResources(common.SlidesCase, HttpCase): @users('user_officer') @mute_logger('odoo') @@ -53,3 +55,34 @@ class TestResources(common.SlidesCase): 'resource_type': 'url', 'slide_id': self.slide.id, }) + + @users('user_officer') + def test_download_file_name_extension(self): + """ Test the resource download file name extension. """ + resource_name = 'Test Resource with special character éè!?&"' + resource = self.env["slide.slide.resource"].create({ + 'name': resource_name, + 'file_name': 'test.png', + 'resource_type': 'file', + # A file for which _odoo_guess_mimetype and python_magic can detect the mime type: a png file + 'data': 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAACXBIWXMAAC4jAA' + 'AuIwF4pT92AAAAD0lEQVQIHQEEAPv/AIdaewLIAV0IjhGPAAAAAElFTkSuQmCC', + 'slide_id': self.slide.id, + }) + self.authenticate(self.env.user.login, self.env.user.login) + + for name, file_name, expected_download_name in ( + # The extension is determined from the file name extension + (resource_name, 'test.xlsx', f'{resource_name}.xlsx'), + (f'{resource_name}.xlsx', 'test.xlsx', f'{resource_name}.xlsx'), + (f'{resource_name}.txt', 'test.xlsx', f'{resource_name}.txt.xlsx'), + # .unknown_long_ext is considered as invalid so no extension is appended to the name + (f'{resource_name}.txt', 'test.unknown_long_ext', f'{resource_name}.txt'), + # No valid extension, the extension is detected at download time from the file content + (resource_name, 'test.unknown_long_ext', f'{resource_name}.png'), + (resource_name, 'test', f'{resource_name}.png'), + ): + resource.write({'name': name, 'file_name': file_name}) + with self.subTest(name=name, file_name=file_name, expected_download_name=expected_download_name): + self.assertIn(f"filename*=UTF-8''{url_quote(expected_download_name)}", + self.url_open(resource._get_download_url()).headers['Content-Disposition']) diff --git a/addons/website_slides/views/website_slides_templates_lesson.xml b/addons/website_slides/views/website_slides_templates_lesson.xml index f6bf4f2893b..d337c0db439 100644 --- a/addons/website_slides/views/website_slides_templates_lesson.xml +++ b/addons/website_slides/views/website_slides_templates_lesson.xml @@ -182,7 +182,7 @@
  • - +
  • @@ -439,7 +439,7 @@
    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 63341c1d1c9..d35745495bd 100644 --- a/addons/website_slides/views/website_slides_templates_lesson_fullscreen.xml +++ b/addons/website_slides/views/website_slides_templates_lesson_fullscreen.xml @@ -151,7 +151,7 @@
  • - +