From 705376a982d64fb41800f148a167ef0fc28ce4c6 Mon Sep 17 00:00:00 2001 From: David Beguin Date: Thu, 14 Feb 2019 10:36:26 +0000 Subject: [PATCH] [IMP] website_slides : add karma gain rules To gamify the new elearning, karma can be gained on various actions - rank a slide_channel (course) - vote for a slide - finish a course This commit also fix the 'completed' computation on slide.channel.partner Task ID : 1922159 PR #31109 --- addons/website_slides/controllers/__init__.py | 1 + addons/website_slides/controllers/portal.py | 20 +++++++++++++++++++ addons/website_slides/models/slide_channel.py | 15 +++++++++++++- addons/website_slides/models/slide_slide.py | 1 + 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 addons/website_slides/controllers/portal.py diff --git a/addons/website_slides/controllers/__init__.py b/addons/website_slides/controllers/__init__.py index 17b391fb0a4..acf000fd92c 100644 --- a/addons/website_slides/controllers/__init__.py +++ b/addons/website_slides/controllers/__init__.py @@ -2,3 +2,4 @@ from . import mail from . import main +from . import portal diff --git a/addons/website_slides/controllers/portal.py b/addons/website_slides/controllers/portal.py new file mode 100644 index 00000000000..ae07dd85f8a --- /dev/null +++ b/addons/website_slides/controllers/portal.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import http +from odoo.http import request +from odoo.addons.portal.controllers.mail import PortalChatter + + +class SlidesPortalChatter(PortalChatter): + + @http.route(['/mail/chatter_post'], type='http', methods=['POST'], auth='public', website=True) + def portal_chatter_post(self, res_model, res_id, message, **kw): + result = super(SlidesPortalChatter, self).portal_chatter_post(res_model, res_id, message, **kw) + if res_model == 'slide.channel': + rating_value = kw.get('rating_value', False) + slide_channel = request.env[res_model].sudo().browse(int(res_id)) + if rating_value and slide_channel and request.env.user.partner_id.id == int(kw.get('pid')): + # apply karma gain rule only once + request.env.user.add_karma(slide_channel.karma_gen_channel_rank) + return result diff --git a/addons/website_slides/models/slide_channel.py b/addons/website_slides/models/slide_channel.py index f02b0c1f251..1c391b253fa 100644 --- a/addons/website_slides/models/slide_channel.py +++ b/addons/website_slides/models/slide_channel.py @@ -49,7 +49,14 @@ class ChannelUsersRelation(models.Model): def _write(self, values): if 'completion' in values and values['completion'] >= 100: values['completed'] = True - return super(ChannelUsersRelation, self)._write(values) + result = super(ChannelUsersRelation, self)._write(values) + partner_has_completed = {channel_partner.partner_id.id: channel_partner.channel_id for channel_partner in self} + users = self.env['res.users'].sudo().search([('partner_id', 'in', list(partner_has_completed.keys()))]) + for user in users: + users.add_karma(partner_has_completed[user.partner_id.id].karma_gen_channel_finish) + else: + result = super(ChannelUsersRelation, self)._write(values) + return result class Channel(models.Model): @@ -131,6 +138,12 @@ class Channel(models.Model): completion = fields.Integer('Completion', compute='_compute_user_statistics') can_upload = fields.Boolean('Can Upload', compute='_compute_access') can_publish = fields.Boolean('Can Publish', compute='_compute_access') + # karma generation + karma_gen_slide_vote = fields.Integer(string='Lesson voted', default=1) + karma_gen_channel_share = fields.Integer(string='Course shared', default=2) + karma_gen_channel_rank = fields.Integer(string='Course ranked', default=5) + karma_gen_channel_finish = fields.Integer(string='Course finished', default=10) + # TODO DBE : Add karma based action rules (like in forum) @api.depends('slide_ids.is_published') def _compute_slide_last_update(self): diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py index 617ad2e1421..c705542e681 100644 --- a/addons/website_slides/models/slide_slide.py +++ b/addons/website_slides/models/slide_slide.py @@ -412,6 +412,7 @@ class Slide(models.Model): new_slide.write({ 'slide_partner_ids': [(0, 0, {'vote': new_vote, 'partner_id': self.env.user.partner_id.id})] }) + self.env.user.add_karma(new_slide.channel_id.karma_gen_slide_vote) def action_set_viewed(self): if not all(slide.channel_id.is_member for slide in self):