[IMP] Website_slide: use built_in methods for placeholder images

Before this commit placeholder images were generated in multiple
different ways in website_slide. This commit makes use of
_get_placeholder_filename function and standardizes the way
these placeholder images are generated for website_slide.

Task-2908029

closes odoo/odoo#100587

Related: odoo/upgrade#4050
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
Andro Gvivradze
2023-01-16 10:31:55 +01:00
committed by Thibault Delavallée
parent f7a3657a0b
commit dab3becf38
8 changed files with 30 additions and 38 deletions
+10 -14
View File
@@ -296,7 +296,7 @@ class Channel(models.Model):
upload_group_ids = fields.Many2many(
'res.groups', 'rel_upload_groups', 'channel_id', 'group_id', string='Upload Groups',
help="Group of users allowed to publish contents on a documentation course.")
website_background_image_url = fields.Char('Background image URL', compute='_compute_website_background_image_url')
website_default_background_image_url = fields.Char('Background image URL', compute='_compute_website_default_background_image_url')
# not stored access fields, depending on each user
completed = fields.Boolean('Done', compute='_compute_user_statistics', compute_sudo=False)
completion = fields.Integer('Completion', compute='_compute_user_statistics', compute_sudo=False)
@@ -448,12 +448,6 @@ class Channel(models.Model):
else:
record.can_publish = self.env.user.has_group('website_slides.group_website_slides_manager')
def _get_placeholder_filename(self, field):
image_fields = ['image_%s' % size for size in [1920, 1024, 512, 256, 128]]
if field in image_fields:
return 'website_slides/static/src/img/channel-%s-default.jpg' % ('training' if self.channel_type == 'training' else 'documentation')
return super()._get_placeholder_filename(field)
@api.model
def _get_can_publish_error_message(self):
return _("Publishing is restricted to the responsible of training courses or members of the publisher group for documentation courses")
@@ -477,14 +471,10 @@ class Channel(models.Model):
new_slides = new_published_slides.filtered(lambda slide: slide.channel_id == channel)
channel.partner_has_new_content = any(slide not in slide_partner_completed for slide in new_slides)
@api.depends('image_1920', 'channel_type')
def _compute_website_background_image_url(self):
@api.depends('channel_type')
def _compute_website_default_background_image_url(self):
for channel in self:
channel.website_background_image_url = (
channel.website_id.image_url(channel, 'image_256') if channel.image_1920
else '/website_slides/static/src/img/channel-%s-default.jpg'
% ('training' if channel.channel_type == 'training' else 'documentation')
)
channel.website_default_background_image_url = f'website_slides/static/src/img/channel-{channel.channel_type}-default.jpg'
@api.depends('name', 'website_id.domain')
def _compute_website_url(self):
@@ -993,3 +983,9 @@ class Channel(models.Model):
'mapping': mapping,
'icon': 'fa-graduation-cap',
}
def _get_placeholder_filename(self, field):
image_fields = ['image_%s' % size for size in [1920, 1024, 512, 256, 128]]
if field in image_fields:
return self.website_default_background_image_url
return super()._get_placeholder_filename(field)
@@ -250,6 +250,9 @@ class Slide(models.Model):
for slide in self:
slide.is_new_slide = slide.date_published > fields.Datetime.now() - relativedelta(days=7) if slide.is_published else False
def _get_placeholder_filename(self, field):
return self.channel_id._get_placeholder_filename(field)
@api.depends('channel_id.slide_ids.is_category', 'channel_id.slide_ids.sequence')
def _compute_category_id(self):
""" Will take all the slides of the channel for which the index is higher
@@ -245,6 +245,7 @@ $line-height-truncate: 1.25em;
.o_wprofile_progress_circle {
margin-left: auto;
margin-right: auto;
max-width: 200px;
}
}
@@ -499,6 +500,7 @@ $line-height-truncate: 1.25em;
background-position: center;
padding-bottom: 35%;
}
}
.o_wslides_lesson_card {
.o_wslides_background_image img {
@@ -506,6 +508,7 @@ $line-height-truncate: 1.25em;
width: 100%;
object-fit: cover;
}
}
}
@@ -6,4 +6,9 @@
background-size: cover;
background-position: center;
}
.o_wslides_course_card_image{
width: 100px;
height: 100px;
object-fit: cover;
}
}
@@ -122,7 +122,7 @@
<!-- ==== Header Left ==== -->
<div class="col-12 col-md-4 col-lg-3 position-relative">
<div class="d-flex align-items-end justify-content-around h-100">
<div t-field="channel.image_1920" t-options='{"widget": "image", "class": "o_wslides_course_pict d-inline-block mb-2 mt-3 my-md-0"}' class="h-100"/>
<div t-field="channel.image_1920" t-options="{'widget': 'image', 'class' : 'o_wslides_course_pict d-inline-block mb-2 mt-3 my-md-0', 'preview_image': 'image_1024'}" class="h-100"/>
</div>
</div>
@@ -538,18 +538,11 @@
<div class="o_wslides_promoted_slide">
<div t-if="not search and not search_slide_category and slide_promoted" class="container py-1 mb-2">
<div class="card flex-column flex-lg-row">
<t t-set="image_url" t-value="website.image_url(slide_promoted, 'image_512')"/>
<a t-if="slide_promoted.is_preview or channel.is_member or is_slides_publisher"
t-attf-href="/slides/slide/#{slug(slide_promoted)}#{query_string}" class="w-100 w-lg-50 flex-shrink-0 rounded">
<div t-if="slide_promoted.image_1920" t-field="slide_promoted.image_1920"
t-options="{'widget': 'image', 'style': 'height:100%', 'preview_image': 'image_512'}" class="h-100"/>
<div t-else="" t-attf-style="background-image:url(#{image_url});" class="o_wslides_background_image h-lg-100"/>
<a t-if="slide_promoted.is_preview or channel.is_member or is_slides_publisher" t-attf-href="/slides/slide/#{slug(slide_promoted)}#{query_string}" class="w-100 w-lg-50 flex-shrink-0 rounded">
<div t-field="slide_promoted.image_1920" t-options="{'widget': 'image', 'style': 'height:100%', 'preview_image': 'image_512'}" class="h-100"/>
</a>
<div t-else="" class="w-100 w-lg-50 flex-shrink-0 rounded">
<div t-if="slide_promoted.image_1920" t-field="slide_promoted.image_1920"
t-options="{'widget': 'image', 'style': 'height:100%', 'preview_image': 'image_512'}" class="h-100"/>
<div t-else="" t-attf-style="background-image:url(#{image_url});" class="o_wslides_background_image h-lg-100"/>
<div t-field="slide_promoted.channel_id.image_1920" t-options="{'widget': 'image', 'style': 'height:100%', 'preview_image': 'image_512'}" class="h-100"/>
</div>
<div class="card-body">
@@ -747,14 +740,10 @@
<t t-if="slide.is_new_slide and not channel_progress[slide.id].get('completed')" t-call="website_slides.course_card_information"/>
<t t-set="can_access" t-value="slide.is_preview or channel.is_member or channel.can_publish"/>
<a t-if="can_access" t-attf-href="/slides/slide/#{slug(slide)}#{query_string}" t-title="slide.name" style="height:150px">
<div t-if="slide.image_1920" t-field="slide.image_1920" t-options="{'widget': 'image', 'preview_image': 'image_512'}"
class="o_wslides_background_image h-100"/>
<div t-else="" class="o_wslides_background_image">
<img t-att-src="channel.website_background_image_url" class="img img-fluid"/>
</div>
<div t-field="slide.image_1920" t-options="{'widget': 'image', 'preview_image': 'image_512'}" class="o_wslides_background_image h-100"/>
</a>
<div t-else="" class="o_wslides_background_image" style="height:150px">
<img t-att-src="channel.website_background_image_url" class="img img-fluid"/>
<div t-field="slide.channel_id.image_1920" t-options="{'widget': 'image', 'preview_image': 'image_512'}" class="o_wslides_background_image h-100"/>
</div>
<i t-if="channel_progress[slide.id].get('completed')" class="position-absolute py-1 px-2 h5 fa fa-check-circle text-primary" style="right:0; top:0;"/>
@@ -332,12 +332,9 @@
<div t-attf-class="card w-100 o_wslides_course_card mb-4 #{'o_wslides_course_unpublished' if not channel.is_published else ''}" t-cache="channel if is_public_user else None">
<t t-set="channel_frontend_tags" t-value="channel.tag_ids.filtered(lambda tag: tag.color)"/>
<a t-attf-href="/slides/#{slug(channel)}" t-title="channel.name" style="height:120px">
<div t-if="channel.image_1920" t-field="channel.image_1920" t-options="{'widget': 'image', 'preview_image': 'image_512'}" class="o_wslides_background_image h-100 ">
<div t-field="channel.image_1920" t-options="{'widget': 'image', 'preview_image': 'image_512'}" class="o_wslides_background_image h-100">
<t t-if="channel.partner_has_new_content" t-call="website_slides.course_card_information"/>
</div>
<div t-else="" class="o_wslides_background_image">
<img t-att-src="channel.website_background_image_url" class=" img img-fluid"/>
</div>
</a>
<div class="card-body d-flex flex-column p-3">
<a class="card-title h5 mb-2 o_wslides_desc_truncate_2" t-attf-href="/slides/#{slug(channel)}" t-field="channel.name"/>
@@ -99,8 +99,7 @@
<!-- Slide sub-template: display an item in a list of related slides (Related, Most Viewed, ...) -->
<template id="slide_aside_card" name="Related Slide">
<a class="list-group-item list-group-item-action d-flex align-items-start px-2" t-att-href="'/slides/slide/%s' % (slug(aside_slide))">
<t t-set="slide_image" t-value="website.image_url(aside_slide, 'image_256') if can_access_channel or aside_slide.is_preview else slide.channel_id.website_background_image_url"/>
<div class="me-1 border o_wslides_background_image_aside_card" t-attf-style="background-image: url(#{slide_image});"/>
<div class="me-1 border o_wslides_background_image_aside_card" t-attf-style="background-image: url(#{website.image_url(aside_slide, 'image_256')});"/>
<div class="overflow-hidden d-flex flex-column justify-content-start">
<h6 t-esc="aside_slide.name" class="o_wslides_desc_truncate_2 mb-1" style="line-height: 1.15"/>
<small class="text-600">
@@ -39,7 +39,7 @@
<div class="card mb-2">
<div class="card-body o_wprofile_slides_course_card_body p-0 d-flex"
t-attf-onclick="location.href='/slides/#{slug(course.channel_id)}';">
<div class="o_wslides_background_image ps-5 pe-4 rounded-start" t-attf-style="background-image: url(#{course.channel_id.website_background_image_url});"/>
<div t-field="course.channel_id.image_1920" t-options="{'widget': 'image', 'class':'o_wslides_course_card_image', 'preview_image': 'image_512'}" class="rounded-start"/>
<div class="p-2 w-100">
<h5 class="mt-0 mb-1" t-field="course.channel_id.name"/>