[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:
@@ -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):
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user