From 8f3eff13fb76e71c881c8aae8e21b79cfad0cce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 1 Feb 2019 14:36:52 +0000 Subject: [PATCH] [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. --- addons/website_slides/controllers/main.py | 18 ++--- addons/website_slides/models/slide_channel.py | 66 ++++++++++--------- addons/website_slides/models/slide_slide.py | 51 +++++++------- 3 files changed, 67 insertions(+), 68 deletions(-) diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py index 13a8b4505fb..d09d0e9020b 100644 --- a/addons/website_slides/controllers/main.py +++ b/addons/website_slides/controllers/main.py @@ -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/''', '''/slides//page/''', diff --git a/addons/website_slides/models/slide_channel.py b/addons/website_slides/models/slide_channel.py index f8cf257f7c4..a9b47405672 100644 --- a/addons/website_slides/models/slide_channel.py +++ b/addons/website_slides/models/slide_channel.py @@ -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,)) diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py index 02a9640cc2b..5ebbd8e81a1 100644 --- a/addons/website_slides/models/slide_slide.py +++ b/addons/website_slides/models/slide_slide.py @@ -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):