[IMP] website_slides: add computed field for slide download URL

We have introduced a method that compute the download URL of a slide in the fix
odoo/odoo#113749 which we convert here into a computed field to simplify the
code.

Task-3196081

closes odoo/odoo#115267

Signed-off-by: Stéphane Debauche (std) <std@odoo.com>
This commit is contained in:
Pierre-Yves Dufays
2023-03-17 09:32:43 +01:00
parent b13489ec99
commit 986cba50c4
4 changed files with 18 additions and 13 deletions
@@ -18,6 +18,7 @@ class SlideResource(models.Model):
data = fields.Binary('Resource', compute='_compute_reset_resources', store=True, readonly=False)
file_name = fields.Char(store=True)
link = fields.Char('Link', compute='_compute_reset_resources', store=True, readonly=False)
download_url = fields.Char('Download URL', compute='_compute_download_url')
_sql_constraints = [
('check_url', "CHECK (resource_type != 'url' OR link IS NOT NULL)", 'A resource of type url must contain a link.'),
@@ -46,17 +47,21 @@ class SlideResource(models.Model):
new_name = self.link
resource.name = new_name
@api.depends('name', 'file_name')
def _compute_download_url(self):
for resource in self:
extension = get_extension(resource.file_name) if resource.file_name else ''
if not resource.name:
resource.download_url = False
continue
file_name = resource.name if resource.name.endswith(extension) else resource.name + extension
resource.download_url = f'/web/content/slide.slide.resource/{resource.id}/data?' + url_encode({
'download': 'true',
'filename': file_name,
})
@api.constrains('data')
def _check_link_type(self):
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
})
@@ -85,4 +85,4 @@ class TestResources(common.SlidesCase, HttpCase):
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'])
self.url_open(resource.download_url).headers['Content-Disposition'])
@@ -182,7 +182,7 @@
</t>
<div class="o_wslides_js_course_join ps-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-att-href="resource._get_download_url()" class="text-decoration-none small">
<a t-att-href="resource.download_url" class="text-decoration-none small">
<i class="fa fa-download me-1"/><span t-field="resource.name"/>
</a>
</li>
@@ -439,7 +439,7 @@
</span>
<div class="text-muted me-auto border-start ps-3">
<t t-foreach="slide.slide_resource_ids" t-as="resource" t-if="resource.resource_type == 'file' and resource.data">
<a t-att-href="resource._get_download_url()" t-esc="resource.name"/><br />
<a t-att-href="resource.download_url" t-esc="resource.name"/><br />
</t>
</div>
</div>
@@ -151,7 +151,7 @@
<div class="o_wslides_js_course_join ps-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-att-href="resource._get_download_url()">
<a class="o_wslides_fs_slide_link" t-att-href="resource.download_url">
<i class="fa fa-download me-2"/><span t-esc="resource.name"/>
</a>
</li>