Skip to content

Commit

Permalink
[IMP] rating: delete rating when needed
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
jem-odoo committed Jan 9, 2017
1 parent 567ae31 commit 8e10f6a
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 12 deletions.
18 changes: 16 additions & 2 deletions addons/rating/models/rating.py
Expand Up @@ -29,7 +29,8 @@ def new_access_token(self):
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")
Expand Down Expand Up @@ -106,6 +107,13 @@ def write(self, values):
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
Expand All @@ -122,7 +130,13 @@ def rating_get_access_token(self, partner=None):
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
Expand Down
10 changes: 5 additions & 5 deletions addons/rating_project/data/project_demo.xml
Expand Up @@ -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"/>
Expand Down
6 changes: 3 additions & 3 deletions addons/rating_project_issue/data/project_issue_demo.xml
Expand Up @@ -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"/>
Expand Down
6 changes: 4 additions & 2 deletions addons/website_sale/controllers/website_mail.py
Expand Up @@ -16,9 +16,10 @@ def chatter_json(self, res_model='', res_id=None, message='', **kw):
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,
Expand All @@ -38,9 +39,10 @@ def chatter_post(self, res_model='', res_id=None, message='', redirect=None, **k
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,
Expand Down

0 comments on commit 8e10f6a

Please sign in to comment.