From f43faad5a3b317f3bfc05da84820bd0963e751b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 18 Feb 2019 12:09:26 +0000 Subject: [PATCH] [REF] website_slide: rename statistics fields on channel and category models Purpose is to reduce model naming complexity. Currently you have: slide_type , and related statistics on channel and category nbr_s with a trailing and error-prone s. Let us remove the trailing s to reduce complexity of code reading. Some code cleaning in statistics computation is also done. Commit linked to task ID 1941250 and PR #31272. --- addons/website_slides/controllers/main.py | 2 +- addons/website_slides/models/slide_channel.py | 83 +++++++++---------- .../website_slides/tests/test_statistics.py | 8 +- .../views/slide_channel_views.xml | 9 +- .../views/website_slides_templates_course.xml | 4 +- .../models/slide_channel.py | 20 +---- .../views/slide_channel_views.xml | 2 +- 7 files changed, 53 insertions(+), 75 deletions(-) diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py index f0248462994..27fd663cb31 100644 --- a/addons/website_slides/controllers/main.py +++ b/addons/website_slides/controllers/main.py @@ -119,7 +119,7 @@ class WebsiteSlides(WebsiteProfile): domain = expression.AND([domain, [('tag_ids', 'in', tags.ids)]]) if slide_type and 'nbr_%ss' % slide_type in request.env['slide.channel']: - domain = expression.AND([domain, [('nbr_%ss' % slide_type, '>', 0)]]) + domain = expression.AND([domain, [('nbr_%s' % slide_type, '>', 0)]]) return domain def _prepare_channel_values(self, **kwargs): diff --git a/addons/website_slides/models/slide_channel.py b/addons/website_slides/models/slide_channel.py index 01cd87b90cb..ca3930d5b5d 100644 --- a/addons/website_slides/models/slide_channel.py +++ b/addons/website_slides/models/slide_channel.py @@ -94,12 +94,12 @@ class Channel(models.Model): ('most_viewed', 'Most Viewed')], string="Featuring Policy", default='latest', required=True) access_token = fields.Char("Security Token", copy=False, default=_default_access_token) - nbr_presentations = fields.Integer('Number of Presentations', compute='_compute_slides_statistics', store=True) - nbr_documents = fields.Integer('Number of Documents', compute='_compute_slides_statistics', store=True) - nbr_videos = fields.Integer('Number of Videos', compute='_compute_slides_statistics', store=True) - nbr_infographics = fields.Integer('Number of Infographics', compute='_compute_slides_statistics', store=True) - nbr_webpages = fields.Integer("Number of Webpages", compute='_compute_slides_statistics', store=True) - nbr_quizs = fields.Integer("Number of quizzes", compute="_compute_slides_statistics", store=True) + nbr_presentation = fields.Integer('Number of Presentations', compute='_compute_slides_statistics', store=True) + nbr_document = fields.Integer('Number of Documents', compute='_compute_slides_statistics', store=True) + nbr_video = fields.Integer('Number of Videos', compute='_compute_slides_statistics', store=True) + nbr_infographic = fields.Integer('Number of Infographics', compute='_compute_slides_statistics', store=True) + nbr_webpage = fields.Integer("Number of Webpages", compute='_compute_slides_statistics', store=True) + nbr_quiz = fields.Integer("Number of Quizs", compute='_compute_slides_statistics', store=True) total_slides = fields.Integer('# Slides', compute='_compute_slides_statistics', store=True, oldname='total') total_views = fields.Integer('# Views', compute='_compute_slides_statistics', store=True) total_votes = fields.Integer('# Votes', compute='_compute_slides_statistics', store=True) @@ -178,7 +178,7 @@ class Channel(models.Model): @api.depends('slide_ids.slide_type', 'slide_ids.is_published', 'slide_ids.completion_time', 'slide_ids.likes', 'slide_ids.dislikes', 'slide_ids.total_views') def _compute_slides_statistics(self): - result = dict((cid, dict(total_slides=0, total_views=0, total_votes=0, total_time=0)) for cid in self.ids) + result = dict((cid, dict(total_views=0, total_votes=0, total_time=0)) for cid in self.ids) read_group_res = self.env['slide.slide'].read_group( [('is_published', '=', True),('channel_id', 'in', self.ids)], ['channel_id', 'slide_type', 'likes', 'dislikes', 'total_views', 'completion_time'], @@ -186,7 +186,6 @@ class Channel(models.Model): lazy=False) for res_group in read_group_res: cid = res_group['channel_id'][0] - result[cid]['total_slides'] += res_group['__count'] result[cid]['total_views'] += res_group.get('total_views', 0) result[cid]['total_votes'] += res_group.get('likes', 0) result[cid]['total_votes'] -= res_group.get('dislikes', 0) @@ -200,16 +199,16 @@ class Channel(models.Model): record.update(result[record.id]) def _compute_slides_statistics_type(self, read_group_res): - """ Can be overridden to compute stats on added slide_types """ - result = dict((cid, dict(nbr_presentations=0, nbr_documents=0, nbr_videos=0, nbr_infographics=0, nbr_webpages=0, nbr_quizs=0)) for cid in self.ids) + """ Compute statistics based on all existing slide types """ + slide_types = self.env['slide.slide']._fields['slide_type'].get_values(self.env) + keys = ['nbr_%s' % slide_type for slide_type in slide_types] + keys.append('total_slides') + result = dict((cid, dict((key, 0) for key in keys)) for cid in self.ids) for res_group in read_group_res: cid = res_group['channel_id'][0] - result[cid]['nbr_presentations'] += res_group.get('slide_type', '') == 'presentation' and res_group['__count'] or 0 - result[cid]['nbr_documents'] += res_group.get('slide_type', '') == 'document' and res_group['__count'] or 0 - result[cid]['nbr_videos'] += res_group.get('slide_type', '') == 'video' and res_group['__count'] or 0 - result[cid]['nbr_infographics'] += res_group.get('slide_type', '') == 'infographic' and res_group['__count'] or 0 - result[cid]['nbr_webpages'] += res_group.get('slide_type', '') == 'webpage' and res_group['__count'] or 0 - result[cid]['nbr_quizs'] += res_group.get('slide_type', '') == 'quiz' and res_group['__count'] or 0 + for slide_type in slide_types: + result[cid]['nbr_%s' % slide_type] += res_group.get('slide_type', '') == slide_type and res_group['__count'] or 0 + result[cid]['total_slides'] += res_group.get('slide_type', '') == slide_type and res_group['__count'] or 0 return result @api.depends('slide_partner_ids') @@ -429,12 +428,12 @@ class Category(models.Model): channel_id = fields.Many2one('slide.channel', string="Channel", required=True, ondelete='cascade') sequence = fields.Integer(default=10, help='Display order') slide_ids = fields.One2many('slide.slide', 'category_id', string="Slides") - 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) - nbr_webpages = fields.Integer("Number of Webpages", compute='_count_presentations', store=True) - nbr_quizs = fields.Integer("Number of quizzes", compute="_count_presentations", store=True) + nbr_presentation = fields.Integer("Number of Presentations", compute='_count_presentations', store=True) + nbr_document = fields.Integer("Number of Documents", compute='_count_presentations', store=True) + nbr_video = fields.Integer("Number of Videos", compute='_count_presentations', store=True) + nbr_infographic = fields.Integer("Number of Infographics", compute='_count_presentations', store=True) + nbr_webpage = fields.Integer("Number of Webpages", compute='_count_presentations', store=True) + nbr_quiz = fields.Integer("Number of Quizs", compute="_count_presentations", store=True) total_slides = fields.Integer(compute='_count_presentations', store=True, oldname='total') @api.depends('slide_ids.slide_type', 'slide_ids.is_published') @@ -444,29 +443,23 @@ class Category(models.Model): [('is_published', '=', True), ('category_id', 'in', self.ids)], ['category_id', 'slide_type'], ['category_id', 'slide_type'], lazy=False) - for res_group in res: - result[res_group['category_id'][0]][res_group['slide_type']] = result[res_group['category_id'][0]].get(res_group['slide_type'], 0) + res_group['__count'] + + type_stats = self._compute_slides_statistics_type(res) + for cid, cdata in type_stats.items(): + result[cid].update(cdata) for record in self: - record.update(self._extract_count_presentations_type(result, record.id)) + record.update(result[record.id]) - def _extract_count_presentations_type(self, result, record_id): - """ Can be overridden to compute stats on added slide_types """ - statistics = { - 'nbr_presentations': result[record_id].get('presentation', 0), - 'nbr_documents': result[record_id].get('document', 0), - 'nbr_videos': result[record_id].get('video', 0), - 'nbr_infographics': result[record_id].get('infographic', 0), - 'nbr_webpages': result[record_id].get('webpage', 0), - 'nbr_quizs': result[record_id].get('quiz', 0), - 'total_slides': 0 - } - - statistics['total_slides'] += statistics['nbr_presentations'] - statistics['total_slides'] += statistics['nbr_documents'] - statistics['total_slides'] += statistics['nbr_videos'] - statistics['total_slides'] += statistics['nbr_infographics'] - statistics['total_slides'] += statistics['nbr_webpages'] - statistics['total_slides'] += statistics['nbr_quizs'] - - return statistics + def _compute_slides_statistics_type(self, read_group_res): + """ Compute statistics based on all existing slide types """ + slide_types = self.env['slide.slide']._fields['slide_type'].get_values(self.env) + keys = ['nbr_%s' % slide_type for slide_type in slide_types] + keys.append('total_slides') + result = dict((cid, dict((key, 0) for key in keys)) for cid in self.ids) + for res_group in read_group_res: + cid = res_group['category_id'][0] + for slide_type in slide_types: + result[cid]['nbr_%s' % slide_type] += res_group.get('slide_type', '') == slide_type and res_group['__count'] or 0 + result[cid]['total_slides'] += res_group.get('slide_type', '') == slide_type and res_group['__count'] or 0 + return result diff --git a/addons/website_slides/tests/test_statistics.py b/addons/website_slides/tests/test_statistics.py index d59590d1cbf..8068c073bf3 100644 --- a/addons/website_slides/tests/test_statistics.py +++ b/addons/website_slides/tests/test_statistics.py @@ -37,10 +37,10 @@ class TestStatistics(common.SlidesCase): channel_publisher = self.channel.sudo(self.user_publisher) # slide type computation self.assertEqual(channel_publisher.total_slides, len(channel_publisher.slide_ids)) - self.assertEqual(channel_publisher.nbr_infographics, len(channel_publisher.slide_ids.filtered(lambda s: s.slide_type == 'infographic'))) - self.assertEqual(channel_publisher.nbr_presentations, len(channel_publisher.slide_ids.filtered(lambda s: s.slide_type == 'presentation'))) - self.assertEqual(channel_publisher.nbr_documents, len(channel_publisher.slide_ids.filtered(lambda s: s.slide_type == 'document'))) - self.assertEqual(channel_publisher.nbr_videos, len(channel_publisher.slide_ids.filtered(lambda s: s.slide_type == 'video'))) + self.assertEqual(channel_publisher.nbr_infographic, len(channel_publisher.slide_ids.filtered(lambda s: s.slide_type == 'infographic'))) + self.assertEqual(channel_publisher.nbr_presentation, len(channel_publisher.slide_ids.filtered(lambda s: s.slide_type == 'presentation'))) + self.assertEqual(channel_publisher.nbr_document, len(channel_publisher.slide_ids.filtered(lambda s: s.slide_type == 'document'))) + self.assertEqual(channel_publisher.nbr_video, len(channel_publisher.slide_ids.filtered(lambda s: s.slide_type == 'video'))) # slide statistics computation self.assertEqual(float_compare(channel_publisher.total_time, sum(s.completion_time for s in channel_publisher.slide_ids), 3), 0) # members computation diff --git a/addons/website_slides/views/slide_channel_views.xml b/addons/website_slides/views/slide_channel_views.xml index 74f920a68a7..e85097bdd8b 100644 --- a/addons/website_slides/views/slide_channel_views.xml +++ b/addons/website_slides/views/slide_channel_views.xml @@ -114,10 +114,11 @@ - - - - + + + + + diff --git a/addons/website_slides/views/website_slides_templates_course.xml b/addons/website_slides/views/website_slides_templates_course.xml index 0d771ad6b5c..d536813f3f9 100644 --- a/addons/website_slides/views/website_slides_templates_course.xml +++ b/addons/website_slides/views/website_slides_templates_course.xml @@ -178,10 +178,10 @@ - + - + diff --git a/addons/website_slides_survey/models/slide_channel.py b/addons/website_slides_survey/models/slide_channel.py index d4132d33151..75d5d6ad88f 100644 --- a/addons/website_slides_survey/models/slide_channel.py +++ b/addons/website_slides_survey/models/slide_channel.py @@ -7,26 +7,10 @@ from odoo import fields, models class Channel(models.Model): _inherit = 'slide.channel' - nbr_certifications = fields.Integer("Number of Certifications", compute='_compute_slides_statistics', store=True) - - def _compute_slides_statistics_type(self, read_group_res): - result = super(Channel, self)._compute_slides_statistics_type(read_group_res) - for cid in result: - result[cid]['nbr_certifications'] = 0 - for res_group in read_group_res: - cid = res_group['channel_id'][0] - result[cid]['nbr_certifications'] += res_group.get('slide_type', '') == 'certification' and res_group['__count'] or 0 - return result + nbr_certification = fields.Integer("Number of Certifications", compute='_compute_slides_statistics', store=True) class Category(models.Model): _inherit = 'slide.category' - nbr_certifications = fields.Integer("Number of Certifications", compute='_count_presentations', store=True) - - def _extract_count_presentations_type(self, result, record_id): - statistics = super(Category, self)._extract_count_presentations_type(result, record_id) - statistics['nbr_certifications'] = result[record_id].get('certification', 0) - statistics['total_slides'] += statistics['nbr_certifications'] - - return statistics + nbr_certification = fields.Integer("Number of Certifications", compute='_count_presentations', store=True) diff --git a/addons/website_slides_survey/views/slide_channel_views.xml b/addons/website_slides_survey/views/slide_channel_views.xml index 566bef457fa..e28b67997cf 100644 --- a/addons/website_slides_survey/views/slide_channel_views.xml +++ b/addons/website_slides_survey/views/slide_channel_views.xml @@ -6,7 +6,7 @@ - +