diff --git a/addons/rating/models/rating.py b/addons/rating/models/rating.py index 20da96154a5..e751f28a597 100644 --- a/addons/rating/models/rating.py +++ b/addons/rating/models/rating.py @@ -29,7 +29,8 @@ class Rating(models.Model): return uuid.uuid4().hex res_name = fields.Char(string='Resource name', compute='_compute_res_name', store=True, help="The name of the rated resource.") - res_model = fields.Char(string='Document Model', required=True, help="Model name of the rated object", index=True) + res_model_id = fields.Many2one('ir.model', 'Related Document Model', index=True, ondelete='cascade', help='Model of the followed resource') + res_model = fields.Char(string='Document Model', related='res_model_id.model', store=True, index=True, readonly=True) res_id = fields.Integer(string='Document ID', required=True, help="Identifier of the rated object", index=True) rated_partner_id = fields.Many2one('res.partner', string="Rated person", help="Owner of the rated resource") partner_id = fields.Many2one('res.partner', string='Customer', help="Author of the rating") @@ -106,6 +107,13 @@ class RatingMixin(models.AbstractModel): self.rating_ids._compute_res_name() return result + def unlink(self): + """ When removing a record, its rating should be deleted too. """ + record_ids = self.ids + result = super(RatingMixin, self).unlink() + self.env['rating.rating'].sudo().search([('res_model', '=', self._name), ('res_id', 'in', record_ids)]).unlink() + return result + def rating_get_partner_id(self): if hasattr(self, 'partner_id') and self.partner_id: return self.partner_id @@ -122,7 +130,13 @@ class RatingMixin(models.AbstractModel): rated_partner = self.rating_get_rated_partner_id() ratings = self.rating_ids.filtered(lambda x: x.partner_id.id == partner.id and not x.consumed) if not ratings: - rating = self.env['rating.rating'].create({'partner_id': partner.id, 'rated_partner_id': rated_partner.id, 'res_model': self._name, 'res_id': self.id}) + record_model_id = self.env['ir.model'].sudo().search([('model', '=', self._name)], limit=1).id + rating = self.env['rating.rating'].create({ + 'partner_id': partner.id, + 'rated_partner_id': rated_partner.id, + 'res_model_id': record_model_id, + 'res_id': self.id + }) else: rating = ratings[0] return rating.access_token diff --git a/addons/rating_project/data/project_demo.xml b/addons/rating_project/data/project_demo.xml index a923cd12c3e..7229f83d770 100644 --- a/addons/rating_project/data/project_demo.xml +++ b/addons/rating_project/data/project_demo.xml @@ -2,31 +2,31 @@ - project.task + - project.task + - project.task + - project.task + - project.task + diff --git a/addons/rating_project_issue/data/project_issue_demo.xml b/addons/rating_project_issue/data/project_issue_demo.xml index 7f98fa39ef4..de808c2a9e9 100644 --- a/addons/rating_project_issue/data/project_issue_demo.xml +++ b/addons/rating_project_issue/data/project_issue_demo.xml @@ -2,19 +2,19 @@ - project.issue + - project.issue + - project.issue + diff --git a/addons/website_sale/controllers/website_mail.py b/addons/website_sale/controllers/website_mail.py index 51a39b6050b..76c6d29ddda 100644 --- a/addons/website_sale/controllers/website_mail.py +++ b/addons/website_sale/controllers/website_mail.py @@ -16,9 +16,10 @@ class WebsiteMailController(WebsiteMail): params.pop('rating', False) message_data = super(WebsiteMailController, self).chatter_json(res_model=res_model, res_id=res_id, message=message, **params) if message_data and kw.get('rating') and res_model == 'product.template': # restrict rating only for product template + res_model_id = request.env.ref('product.model_product_template').id rating = request.env['rating.rating'].create({ 'rating': float(kw.get('rating')), - 'res_model': res_model, + 'res_model_id': res_model_id, 'res_id': res_id, 'message_id': message_data['id'], 'consumed': True, @@ -38,9 +39,10 @@ class WebsiteMailController(WebsiteMail): try: fragment = urlparse.urlparse(response.location).fragment message_id = int(fragment.replace('message-', '')) + res_model_id = request.env.ref('product.model_product_template').id request.env['rating.rating'].create({ 'rating': float(kw.get('rating')), - 'res_model': res_model, + 'res_model_id': res_model_id, 'res_id': res_id, 'message_id': message_id, 'consumed': True,