PURPOSE Cleanup code and flow of customer rating: routes, rating_apply, rating and message creation and update. SPECIFICATIONS Cleanup code about rating controllers and rating_apply. Notably correctly link a message to a rating once a feedback is posted, whatever the flow. Update ``rating_apply`` to use either a token, either an existing rating to udpate it and post a message. Always link the message and the rating to be sure DB data are coherent. This requires an update in several demo data to correctly set tokens on ratings and use it in calls to ``rating_apply`` done in xml files. Extract default subtype computation of rating_apply in a sub-method to allow setting this parameter without having to deal with ``rating_apply`` details. CODE CLEANUP Split behavior that is generic but actually used only in project about stage update based on rating. Move it directly in project. As it is used only once and as generic approach is hardcoded based on fields names better keep it localized. Task-2812665 (Rating: Cleanup rating flow code) Part-of: odoo/odoo#80707
43 lines
1.9 KiB
Python
43 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, models, _
|
|
|
|
|
|
class MailThread(models.AbstractModel):
|
|
_inherit = 'mail.thread'
|
|
|
|
@api.returns('mail.message', lambda value: value.id)
|
|
def message_post(self, **kwargs):
|
|
rating_id = kwargs.pop('rating_id', False)
|
|
rating_value = kwargs.pop('rating_value', False)
|
|
rating_feedback = kwargs.pop('rating_feedback', False)
|
|
message = super(MailThread, self).message_post(**kwargs)
|
|
|
|
# create rating.rating record linked to given rating_value. Using sudo as portal users may have
|
|
# rights to create messages and therefore ratings (security should be checked beforehand)
|
|
if rating_value:
|
|
self.env['rating.rating'].sudo().create({
|
|
'rating': float(rating_value) if rating_value is not None else False,
|
|
'feedback': rating_feedback,
|
|
'res_model_id': self.env['ir.model']._get_id(self._name),
|
|
'res_id': self.id,
|
|
'message_id': message.id,
|
|
'consumed': True,
|
|
'partner_id': self.env.user.partner_id.id,
|
|
})
|
|
elif rating_id:
|
|
self.env['rating.rating'].browse(rating_id).write({'message_id': message.id})
|
|
|
|
return message
|
|
|
|
def _message_create(self, values_list):
|
|
""" Force usage of rating-specific methods and API allowing to delegate
|
|
computation to records. Keep methods optimized and skip rating_ids
|
|
support to simplify MailThrad main API. """
|
|
if not isinstance(values_list, (list)):
|
|
values_list = [values_list]
|
|
if any(values.get('rating_ids') for values in values_list):
|
|
raise ValueError(_("Posting a rating should be done using message post API."))
|
|
return super()._message_create(values_list)
|