[REF] website_slide: rename statistics fields on channel and category models

Purpose is to reduce model naming complexity. Currently you have: slide_type
<type>, and related statistics on channel and category nbr_<type>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.
This commit is contained in:
Thibault Delavallée
2019-02-20 12:24:30 +00:00
parent 4e116ef055
commit f43faad5a3
7 changed files with 53 additions and 75 deletions
+1 -1
View File
@@ -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):
+38 -45
View File
@@ -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
@@ -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
@@ -114,10 +114,11 @@
<page string="Statistics" groups="base.group_no_one">
<group>
<group>
<field name="nbr_presentations"/>
<field name="nbr_documents"/>
<field name="nbr_videos"/>
<field name="nbr_infographics"/>
<field name="nbr_presentation"/>
<field name="nbr_document"/>
<field name="nbr_video"/>
<field name="nbr_infographic"/>
<field name="nbr_webpage"/>
<field name="total_slides"/>
</group>
<group>
@@ -178,10 +178,10 @@
</span>
<span class="col">
<t t-if="search_category">
<span class="badge badge-pill badge-info" t-esc="search_category['nbr_%ss' % slide_type_key]"/>
<span class="badge badge-pill badge-info" t-esc="search_category['nbr_%s' % slide_type_key]"/>
</t>
<t t-else="">
<span class="badge badge-pill badge-info" t-esc="channel['nbr_%ss' % slide_type_key]"/>
<span class="badge badge-pill badge-info" t-esc="channel['nbr_%s' % slide_type_key]"/>
</t>
</span>
</div>
@@ -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)
@@ -6,7 +6,7 @@
<field name="inherit_id" ref="website_slides.view_slide_channel_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='total_slides']" position="before">
<field name="nbr_certifications"/>
<field name="nbr_certification"/>
</xpath>
</field>
</record>