[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
This commit is contained in:
@@ -2,3 +2,4 @@
|
||||
|
||||
from . import mail
|
||||
from . import main
|
||||
from . import portal
|
||||
|
||||
@@ -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
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user