[IMP] rating: delete rating when needed

Automatically deleting a rating was not implemented
yet. We find 2 cases :
- when uninstalling a module, the same mecanism as
mail.follower is used, via a res_model_id field
pointing on ir.model. When this model does not
exist anymore, remove all related rating.
- when deleting a record, its rating should be
deleted too.
This commit is contained in:
Jérome Maes
2017-01-09 16:33:21 +01:00
parent 567ae3137f
commit 8e10f6adf9
4 changed files with 28 additions and 12 deletions
+16 -2
View File
@@ -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
+5 -5
View File
@@ -2,31 +2,31 @@
<odoo>
<data noupdate="1">
<record id="rating_task_1" model="rating.rating">
<field name="res_model">project.task</field>
<field name="res_model_id" ref="project.model_project_task"/>
<field name="rated_partner_id" ref="base.partner_root"/>
<field name="partner_id" ref="portal.demo_user0_res_partner"/>
<field name="res_id" ref="project.project_task_3"/>
</record>
<record id="rating_task_2" model="rating.rating">
<field name="res_model">project.task</field>
<field name="res_model_id" ref="project.model_project_task"/>
<field name="rated_partner_id" ref="base.partner_demo"/>
<field name="partner_id" ref="base.partner_demo"/>
<field name="res_id" ref="project.project_task_8"/>
</record>
<record id="rating_task_3" model="rating.rating">
<field name="res_model">project.task</field>
<field name="res_model_id" ref="project.model_project_task"/>
<field name="rated_partner_id" ref="base.partner_root"/>
<field name="partner_id" ref="base.partner_root"/>
<field name="res_id" ref="project.project_task_15"/>
</record>
<record id="rating_task_4" model="rating.rating">
<field name="res_model">project.task</field>
<field name="res_model_id" ref="project.model_project_task"/>
<field name="rated_partner_id" ref="base.partner_root"/>
<field name="partner_id" ref="base.partner_root"/>
<field name="res_id" ref="project.project_task_18"/>
</record>
<record id="rating_task_5" model="rating.rating">
<field name="res_model">project.task</field>
<field name="res_model_id" ref="project.model_project_task"/>
<field name="rated_partner_id" ref="base.partner_root"/>
<field name="partner_id" ref="base.res_partner_4"/>
<field name="res_id" ref="project.project_task_24"/>
@@ -2,19 +2,19 @@
<odoo>
<data noupdate="1">
<record id="rating_issue_1" model="rating.rating">
<field name="res_model">project.issue</field>
<field name="res_model_id" ref="project_issue.model_project_issue"/>
<field name="rated_partner_id" ref="base.partner_demo"/>
<field name="partner_id" ref="base.partner_demo"/>
<field name="res_id" ref="project_issue.crm_case_outputincorrect0"/>
</record>
<record id="rating_issue_2" model="rating.rating">
<field name="res_model">project.issue</field>
<field name="res_model_id" ref="project_issue.model_project_issue"/>
<field name="rated_partner_id" ref="base.partner_demo"/>
<field name="partner_id" ref="base.res_partner_12"/>
<field name="res_id" ref="project_issue.crm_case_addmenustothemodule0"/>
</record>
<record id="rating_issue_3" model="rating.rating">
<field name="res_model">project.issue</field>
<field name="res_model_id" ref="project_issue.model_project_issue"/>
<field name="rated_partner_id" ref="base.partner_root"/>
<field name="partner_id" ref="base.res_partner_3"/>
<field name="res_id" ref="project_issue.crm_case_improvereportsinhrms0"/>
@@ -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,