From bf3cdac6284d82fbe7e43b3ee3f34132d2ec5acf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 30 Aug 2019 11:32:42 +0000 Subject: [PATCH 1/5] [FIX] website_slides: avoid display error messages twice in quizz completion Purpose of this commit is to avoid having error message replacing the cross used to close the container of the error message. Task ID 2058595 PR #36281 --- addons/website_slides/static/src/js/slides_course_quiz.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/website_slides/static/src/js/slides_course_quiz.js b/addons/website_slides/static/src/js/slides_course_quiz.js index f5b56297fe8..89076268c6a 100644 --- a/addons/website_slides/static/src/js/slides_course_quiz.js +++ b/addons/website_slides/static/src/js/slides_course_quiz.js @@ -95,7 +95,7 @@ odoo.define('website_slides.quiz', function (require) { } else if (alert_code === 'public_user') { message = _t("You must be logged to submit the quiz."); } - this.$('.o_wslides_js_lesson_quiz_error span').html(message); + this.$('.o_wslides_js_lesson_quiz_error span:first').html(message); this.$('.o_wslides_js_lesson_quiz_error').removeClass('d-none'); }, From d3f6c3b579f39b313401c63d97b95ce690501591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 30 Aug 2019 12:30:33 +0000 Subject: [PATCH 2/5] [FIX] mail: set an integer widget on many2one_reference field Commit 9920f20e4c7753bc17bea71dea3a90f7de687196 introduced a new field type in the ORM. However it is not referenced in various JS parts, leading to crashes. Notably list view of messages and activities crashes. As this is basically an integer field, easy fix is to use an integer widget on those fields. Task ID 2058595 PR #36281 --- addons/mail/views/mail_activity_views.xml | 2 +- addons/mail/views/mail_followers_views.xml | 4 ++-- addons/mail/views/mail_message_views.xml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/mail/views/mail_activity_views.xml b/addons/mail/views/mail_activity_views.xml index addf80362ee..fdbfa3a5bdd 100644 --- a/addons/mail/views/mail_activity_views.xml +++ b/addons/mail/views/mail_activity_views.xml @@ -114,7 +114,7 @@ - + diff --git a/addons/mail/views/mail_followers_views.xml b/addons/mail/views/mail_followers_views.xml index ebcf7d0e44a..3dbd0ba7b1a 100644 --- a/addons/mail/views/mail_followers_views.xml +++ b/addons/mail/views/mail_followers_views.xml @@ -10,7 +10,7 @@ - + @@ -28,7 +28,7 @@ - + diff --git a/addons/mail/views/mail_message_views.xml b/addons/mail/views/mail_message_views.xml index 723ec9fa33e..6bb1bab6f49 100644 --- a/addons/mail/views/mail_message_views.xml +++ b/addons/mail/views/mail_message_views.xml @@ -12,7 +12,7 @@ - + @@ -37,7 +37,7 @@ - + From a6a6795305fda64ddc017a8346c4c32b779798c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 30 Aug 2019 12:31:33 +0000 Subject: [PATCH 3/5] [FIX] rating: allow rating deletion Purpose of this commit is to * delete rating when deleting message. Otherwise rating coming from frontend portal review chatter are lost in the void; * allow system users to delete ratings; Task ID 2058595 PR #36281 --- addons/rating/models/rating.py | 5 ++++- addons/rating/security/ir.model.access.csv | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/rating/models/rating.py b/addons/rating/models/rating.py index bc16bff69c1..1742ef776a4 100644 --- a/addons/rating/models/rating.py +++ b/addons/rating/models/rating.py @@ -50,7 +50,10 @@ class Rating(models.Model): ('highly_dissatisfied', 'Highly dissatisfied'), ('no_rating', 'No Rating yet')], string='Rating', store=True, compute='_compute_rating_text', readonly=True) feedback = fields.Text('Comment', help="Reason of the rating") - message_id = fields.Many2one('mail.message', string="Linked message", help="Associated message when posting a review. Mainly used in website addons.", index=True) + message_id = fields.Many2one( + 'mail.message', string="Linked message", + index=True, ondelete='cascade', + help="Associated message when posting a review. Mainly used in website addons.") access_token = fields.Char('Security Token', default=_default_access_token, help="Access token to set the rating of the value") consumed = fields.Boolean(string="Filled Rating", help="Enabled if the rating has been filled.") diff --git a/addons/rating/security/ir.model.access.csv b/addons/rating/security/ir.model.access.csv index 7d09058e2a7..6af5f1f5205 100644 --- a/addons/rating/security/ir.model.access.csv +++ b/addons/rating/security/ir.model.access.csv @@ -2,3 +2,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_rating_user,rating.rating.user,rating.model_rating_rating,base.group_user,1,1,1,0 access_rating_public,rating.rating.public,rating.model_rating_rating,base.group_public,1,1,1,0 access_rating_portal,rating.rating.portal,rating.model_rating_rating,base.group_portal,1,1,1,0 +rating_rating_access_system,rating.rating.access.system,rating.model_rating_rating,base.group_system,1,1,1,1 From 3c9529901858a9ad153666f657b9b9c9eb12b372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 30 Aug 2019 12:46:19 +0000 Subject: [PATCH 4/5] [FIX] website_slides: always initialize computed fields Creating channels and slides in backend was leading to warnings and/or crashes because of computed fields not being always updated. With new computed fields coming from 9920f20e4c7753bc17bea71dea3a90f7de687196 this cannot be done anymore. Task ID 2058595 PR #36281 --- addons/website_slides/models/slide_channel.py | 8 ++++++-- addons/website_slides/models/slide_slide.py | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/addons/website_slides/models/slide_channel.py b/addons/website_slides/models/slide_channel.py index 33e9ad1ca20..20e62300ff4 100644 --- a/addons/website_slides/models/slide_channel.py +++ b/addons/website_slides/models/slide_channel.py @@ -211,7 +211,11 @@ 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', 'slide_ids.is_category', 'slide_ids.active') def _compute_slides_statistics(self): - result = dict((cid, dict(total_views=0, total_votes=0, total_time=0)) for cid in self.ids) + default_vals = dict(total_views=0, total_votes=0, total_time=0, total_slides=0) + keys = ['nbr_%s' % slide_type for slide_type in self.env['slide.slide']._fields['slide_type'].get_values(self.env)] + default_vals.update(dict((key, 0) for key in keys)) + + result = dict((cid, dict(default_vals)) for cid in self.ids) read_group_res = self.env['slide.slide'].read_group( [('active', '=', True), ('is_published', '=', True), ('channel_id', 'in', self.ids), ('is_category', '=', False)], ['channel_id', 'slide_type', 'likes', 'dislikes', 'total_views', 'completion_time'], @@ -229,7 +233,7 @@ class Channel(models.Model): result[cid].update(cdata) for record in self: - record.update(result.get(record.id, {})) + record.update(result.get(record.id, default_vals)) def _compute_slides_statistics_type(self, read_group_res): """ Compute statistics based on all existing slide types """ diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py index f890c7d1451..2a17ade329d 100644 --- a/addons/website_slides/models/slide_slide.py +++ b/addons/website_slides/models/slide_slide.py @@ -197,6 +197,8 @@ class Slide(models.Model): Lists are manually sorted because when adding a new browse record order will not be correct as the added slide would actually end up at the first place no matter its sequence.""" + self.category_id = False # initialize whatever the state + channel_slides = {} for slide in self: if slide.channel_id.id not in channel_slides: From 10804f1e4b6a72946e2b8ca7b3b8e300acc8b04b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 30 Aug 2019 13:56:53 +0000 Subject: [PATCH 5/5] [FIX] (website_)rating: synchronize rating feedback with message body Purpose is to set review message on both message and rating so that reviews are correctly displayed in eLearning backend as well as correctly displayed in chatter frontend. Task ID 2058595 PR #36281 --- addons/rating/models/mail_thread.py | 2 ++ addons/rating/models/rating.py | 1 - addons/website_rating/controllers/portal_chatter.py | 8 +++++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/addons/rating/models/mail_thread.py b/addons/rating/models/mail_thread.py index b0c229181df..3d89a33a6cf 100644 --- a/addons/rating/models/mail_thread.py +++ b/addons/rating/models/mail_thread.py @@ -10,11 +10,13 @@ class MailThread(models.AbstractModel): @api.returns('mail.message', lambda value: value.id) def message_post(self, **kwargs): rating_value = kwargs.pop('rating_value', False) + rating_feedback = kwargs.pop('rating_feedback', False) message = super(MailThread, self).message_post(**kwargs) if rating_value: ir_model = self.env['ir.model'].sudo().search([('model', '=', self._name)]) self.env['rating.rating'].create({ 'rating': float(rating_value) if rating_value is not None else False, + 'feedback': rating_feedback, 'res_model_id': ir_model.id, 'res_id': self.id, 'message_id': message.id, diff --git a/addons/rating/models/rating.py b/addons/rating/models/rating.py index 1742ef776a4..04f8c474e14 100644 --- a/addons/rating/models/rating.py +++ b/addons/rating/models/rating.py @@ -13,7 +13,6 @@ RATING_LIMIT_MIN = 1 class Rating(models.Model): - _name = "rating.rating" _description = "Rating" _order = 'write_date desc' diff --git a/addons/website_rating/controllers/portal_chatter.py b/addons/website_rating/controllers/portal_chatter.py index c252d2f73e7..f2b2b5a3033 100644 --- a/addons/website_rating/controllers/portal_chatter.py +++ b/addons/website_rating/controllers/portal_chatter.py @@ -11,9 +11,15 @@ class PortalChatter(PortalChatter): def _portal_post_filter_params(self): fields = super(PortalChatter, self)._portal_post_filter_params() - fields.append('rating_value') + fields += ['rating_value', 'rating_feedback'] return fields + @http.route() + def portal_chatter_post(self, res_model, res_id, message, redirect=None, attachment_ids='', attachment_tokens='', **kwargs): + if kwargs.get('rating_value'): + kwargs['rating_feedback'] = kwargs.pop('rating_feedback', message) + return super(PortalChatter, self).portal_chatter_post(res_model, res_id, message, redirect=redirect, attachment_ids=attachment_ids, attachment_tokens=attachment_tokens, **kwargs) + @http.route() def portal_chatter_init(self, res_model, res_id, domain=False, limit=False, **kwargs): result = super(PortalChatter, self).portal_chatter_init(res_model, res_id, domain=domain, limit=limit, **kwargs)