[REF] website_slides: light cleaning
Purpose of this commit is to prepare future code addition by making some noise in a separate commit. In this commit we move compute methods below fields definition because currently it is a complete mess and finding a given field gives a headache. Commit linked to task ID 1933820 and PR #30830.
This commit is contained in:
@@ -23,6 +23,15 @@ class WebsiteSlides(http.Controller):
|
||||
'vote': 'likes desc',
|
||||
}
|
||||
|
||||
def sitemap_slide(env, rule, qs):
|
||||
Channel = env['slide.channel']
|
||||
dom = sitemap_qs2dom(qs=qs, route='/slides/', field=Channel._rec_name)
|
||||
dom += env['website'].get_current_website().website_domain()
|
||||
for channel in Channel.search(dom):
|
||||
loc = '/slides/%s' % slug(channel)
|
||||
if not qs or qs.lower() in loc:
|
||||
yield {'loc': loc}
|
||||
|
||||
def _set_viewed_slide(self, slide, view_mode):
|
||||
slide_key = '%s_%s' % (view_mode, request.session.sid)
|
||||
viewed_slides = request.session.setdefault(slide_key, list())
|
||||
@@ -69,15 +78,6 @@ class WebsiteSlides(http.Controller):
|
||||
'is_public_user': request.website.is_public_user(),
|
||||
})
|
||||
|
||||
def sitemap_slide(env, rule, qs):
|
||||
Channel = env['slide.channel']
|
||||
dom = sitemap_qs2dom(qs=qs, route='/slides/', field=Channel._rec_name)
|
||||
dom += env['website'].get_current_website().website_domain()
|
||||
for channel in Channel.search(dom):
|
||||
loc = '/slides/%s' % slug(channel)
|
||||
if not qs or qs.lower() in loc:
|
||||
yield {'loc': loc}
|
||||
|
||||
@http.route([
|
||||
'''/slides/<model("slide.channel"):channel>''',
|
||||
'''/slides/<model("slide.channel"):channel>/page/<int:page>''',
|
||||
|
||||
@@ -20,11 +20,13 @@ class Channel(models.Model):
|
||||
'latest': 'date_published desc',
|
||||
}
|
||||
|
||||
# description
|
||||
name = fields.Char('Name', translate=True, required=True)
|
||||
active = fields.Boolean(default=True)
|
||||
description = fields.Html('Description', translate=html_translate, sanitize_attributes=False)
|
||||
sequence = fields.Integer(default=10, help='Display order')
|
||||
category_ids = fields.One2many('slide.category', 'channel_id', string="Categories")
|
||||
# slides: promote, statistics
|
||||
slide_ids = fields.One2many('slide.slide', 'channel_id', string="Slides")
|
||||
promote_strategy = fields.Selection([
|
||||
('none', 'No Featured Presentation'),
|
||||
@@ -35,43 +37,12 @@ class Channel(models.Model):
|
||||
string="Featuring Policy", default='most_voted', required=True)
|
||||
custom_slide_id = fields.Many2one('slide.slide', string='Slide to Promote')
|
||||
promoted_slide_id = fields.Many2one('slide.slide', string='Featured Slide', compute='_compute_promoted_slide_id', store=True)
|
||||
|
||||
@api.depends('custom_slide_id', 'promote_strategy', 'slide_ids.likes',
|
||||
'slide_ids.total_views', "slide_ids.date_published")
|
||||
def _compute_promoted_slide_id(self):
|
||||
for record in self:
|
||||
if record.promote_strategy == 'none':
|
||||
record.promoted_slide_id = False
|
||||
elif record.promote_strategy == 'custom':
|
||||
record.promoted_slide_id = record.custom_slide_id
|
||||
elif record.promote_strategy:
|
||||
slides = self.env['slide.slide'].search(
|
||||
[('website_published', '=', True), ('channel_id', '=', record.id)],
|
||||
limit=1, order=self._order_by_strategy[record.promote_strategy])
|
||||
record.promoted_slide_id = slides and slides[0] or False
|
||||
|
||||
nbr_presentations = fields.Integer('Number of Presentations', compute='_count_presentations', store=True)
|
||||
nbr_documents = fields.Integer('Number of Documents', compute='_count_presentations', store=True)
|
||||
nbr_videos = fields.Integer('Number of Videos', compute='_count_presentations', store=True)
|
||||
nbr_infographics = fields.Integer('Number of Infographics', compute='_count_presentations', store=True)
|
||||
total = fields.Integer(compute='_count_presentations', store=True)
|
||||
|
||||
@api.depends('slide_ids.slide_type', 'slide_ids.website_published')
|
||||
def _count_presentations(self):
|
||||
result = dict.fromkeys(self.ids, dict())
|
||||
res = self.env['slide.slide'].read_group(
|
||||
[('website_published', '=', True), ('channel_id', 'in', self.ids)],
|
||||
['channel_id', 'slide_type'], ['channel_id', 'slide_type'],
|
||||
lazy=False)
|
||||
for res_group in res:
|
||||
result[res_group['channel_id'][0]][res_group['slide_type']] = result[res_group['channel_id'][0]].get(res_group['slide_type'], 0) + res_group['__count']
|
||||
for record in self:
|
||||
record.nbr_presentations = result[record.id].get('presentation', 0)
|
||||
record.nbr_documents = result[record.id].get('document', 0)
|
||||
record.nbr_videos = result[record.id].get('video', 0)
|
||||
record.nbr_infographics = result[record.id].get('infographic', 0)
|
||||
record.total = record.nbr_presentations + record.nbr_documents + record.nbr_videos + record.nbr_infographics
|
||||
|
||||
# configuration
|
||||
publish_template_id = fields.Many2one(
|
||||
'mail.template', string='Published Template',
|
||||
help="Email template to send slide publication through email",
|
||||
@@ -100,6 +71,37 @@ class Channel(models.Model):
|
||||
can_see_full = fields.Boolean('Full Access', compute='_compute_access')
|
||||
can_upload = fields.Boolean('Can Upload', compute='_compute_access')
|
||||
|
||||
@api.depends('custom_slide_id', 'promote_strategy', 'slide_ids.likes',
|
||||
'slide_ids.total_views', "slide_ids.date_published")
|
||||
def _compute_promoted_slide_id(self):
|
||||
for record in self:
|
||||
if record.promote_strategy == 'none':
|
||||
record.promoted_slide_id = False
|
||||
elif record.promote_strategy == 'custom':
|
||||
record.promoted_slide_id = record.custom_slide_id
|
||||
elif record.promote_strategy:
|
||||
slides = self.env['slide.slide'].search(
|
||||
[('website_published', '=', True), ('channel_id', '=', record.id)],
|
||||
limit=1, order=self._order_by_strategy[record.promote_strategy])
|
||||
record.promoted_slide_id = slides and slides[0] or False
|
||||
|
||||
@api.depends('slide_ids.slide_type', 'slide_ids.website_published')
|
||||
def _count_presentations(self):
|
||||
result = dict.fromkeys(self.ids, dict())
|
||||
res = self.env['slide.slide'].read_group(
|
||||
[('website_published', '=', True), ('channel_id', 'in', self.ids)],
|
||||
['channel_id', 'slide_type'],
|
||||
groupby=['channel_id', 'slide_type'],
|
||||
lazy=False)
|
||||
for res_group in res:
|
||||
result[res_group['channel_id'][0]][res_group['slide_type']] = result[res_group['channel_id'][0]].get(res_group['slide_type'], 0) + res_group['__count']
|
||||
for record in self:
|
||||
record.nbr_presentations = result[record.id].get('presentation', 0)
|
||||
record.nbr_documents = result[record.id].get('document', 0)
|
||||
record.nbr_videos = result[record.id].get('video', 0)
|
||||
record.nbr_infographics = result[record.id].get('infographic', 0)
|
||||
record.total = record.nbr_presentations + record.nbr_documents + record.nbr_videos + record.nbr_infographics
|
||||
|
||||
def _search_can_see(self, operator, value):
|
||||
if operator not in ('=', '!=', '<>'):
|
||||
raise ValueError('Invalid operator: %s' % (operator,))
|
||||
|
||||
@@ -107,17 +107,6 @@ class Slide(models.Model):
|
||||
user_ids = fields.Many2many('res.users', 'slide_users', 'slide_id', 'user_id',
|
||||
string='Subscribers', groups='base.group_system')
|
||||
slide_user_ids = fields.One2many('slide.users', 'slide_id', string='Subscribers information', groups='base.group_system')
|
||||
|
||||
@api.depends('image')
|
||||
def _get_image(self):
|
||||
for record in self:
|
||||
if record.image:
|
||||
record.image_medium = image.crop_image(record.image, type='top', ratio=(4, 3), size=(500, 400))
|
||||
record.image_thumb = image.crop_image(record.image, type='top', ratio=(4, 3), size=(200, 200))
|
||||
else:
|
||||
record.image_medium = False
|
||||
record.iamge_thumb = False
|
||||
|
||||
# content
|
||||
slide_type = fields.Selection([
|
||||
('infographic', 'Infographic'),
|
||||
@@ -132,32 +121,29 @@ class Slide(models.Model):
|
||||
url = fields.Char('Document URL', help="Youtube or Google Document URL")
|
||||
document_id = fields.Char('Document ID', help="Youtube or Google Document ID")
|
||||
mime_type = fields.Char('Mime-type')
|
||||
|
||||
@api.onchange('url')
|
||||
def on_change_url(self):
|
||||
self.ensure_one()
|
||||
if self.url:
|
||||
res = self._parse_document_url(self.url)
|
||||
if res.get('error'):
|
||||
raise Warning(_('Could not fetch data from url. Document or access right not available:\n%s') % res['error'])
|
||||
values = res['values']
|
||||
if not values.get('document_id'):
|
||||
raise Warning(_('Please enter valid Youtube or Google Doc URL'))
|
||||
for key, value in values.items():
|
||||
self[key] = value
|
||||
|
||||
# website
|
||||
website_id = fields.Many2one(related='channel_id.website_id', readonly=True)
|
||||
date_published = fields.Datetime('Publish Date')
|
||||
likes = fields.Integer('Likes', compute='_compute_user_info', store=True)
|
||||
dislikes = fields.Integer('Dislikes', compute='_compute_user_info', store=True)
|
||||
user_vote = fields.Integer('User vote', compute='_compute_user_info')
|
||||
embed_code = fields.Text('Embed Code', readonly=True, compute='_get_embed_code')
|
||||
# views
|
||||
embedcount_ids = fields.One2many('slide.embed', 'slide_id', string="Embed Count")
|
||||
slide_views = fields.Integer('# of Website Views')
|
||||
embed_views = fields.Integer('# of Embedded Views')
|
||||
total_views = fields.Integer("Total # Views", default="0", compute='_compute_total', store=True)
|
||||
|
||||
@api.depends('image')
|
||||
def _get_image(self):
|
||||
for record in self:
|
||||
if record.image:
|
||||
record.image_medium = image.crop_image(record.image, type='top', ratio=(4, 3), size=(500, 400))
|
||||
record.image_thumb = image.crop_image(record.image, type='top', ratio=(4, 3), size=(200, 200))
|
||||
else:
|
||||
record.image_medium = False
|
||||
record.iamge_thumb = False
|
||||
|
||||
@api.depends('slide_views', 'embed_views')
|
||||
def _compute_total(self):
|
||||
for record in self:
|
||||
@@ -181,8 +167,6 @@ class Slide(models.Model):
|
||||
for slide_sudo in self.sudo():
|
||||
slide_sudo.update(slide_data[slide_sudo.id])
|
||||
|
||||
embed_code = fields.Text('Embed Code', readonly=True, compute='_get_embed_code')
|
||||
|
||||
def _get_embed_code(self):
|
||||
base_url = request and request.httprequest.url_root or self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|
||||
if base_url[-1] == '/':
|
||||
@@ -201,6 +185,19 @@ class Slide(models.Model):
|
||||
else:
|
||||
record.embed_code = False
|
||||
|
||||
@api.onchange('url')
|
||||
def on_change_url(self):
|
||||
self.ensure_one()
|
||||
if self.url:
|
||||
res = self._parse_document_url(self.url)
|
||||
if res.get('error'):
|
||||
raise Warning(_('Could not fetch data from url. Document or access right not available:\n%s') % res['error'])
|
||||
values = res['values']
|
||||
if not values.get('document_id'):
|
||||
raise Warning(_('Please enter valid Youtube or Google Doc URL'))
|
||||
for key, value in values.items():
|
||||
self[key] = value
|
||||
|
||||
@api.multi
|
||||
@api.depends('name')
|
||||
def _compute_website_url(self):
|
||||
|
||||
Reference in New Issue
Block a user