59 lines
2.6 KiB
Python
59 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
from odoo import api, fields, models
|
|
from odoo.tools.translate import html_translate
|
|
|
|
|
|
class KarmaRank(models.Model):
|
|
_name = 'gamification.karma.rank'
|
|
_description = 'Rank based on karma'
|
|
_inherit = 'image.mixin'
|
|
_order = 'karma_min'
|
|
|
|
name = fields.Text(string='Rank Name', translate=True, required=True)
|
|
description = fields.Html(string='Description', translate=html_translate, sanitize_attributes=False,)
|
|
description_motivational = fields.Html(
|
|
string='Motivational', translate=html_translate, sanitize_attributes=False,
|
|
help="Motivational phrase to reach this rank on your profile page")
|
|
karma_min = fields.Integer(
|
|
string='Required Karma', required=True, default=1)
|
|
user_ids = fields.One2many('res.users', 'rank_id', string='Users')
|
|
rank_users_count = fields.Integer("# Users", compute="_compute_rank_users_count")
|
|
|
|
_sql_constraints = [
|
|
('karma_min_check', "CHECK( karma_min > 0 )", 'The required karma has to be above 0.')
|
|
]
|
|
|
|
@api.depends('user_ids')
|
|
def _compute_rank_users_count(self):
|
|
requests_data = self.env['res.users']._read_group([('rank_id', '!=', False)], ['rank_id'], ['__count'])
|
|
requests_mapped_data = {rank.id: count for rank, count in requests_data}
|
|
for rank in self:
|
|
rank.rank_users_count = requests_mapped_data.get(rank.id, 0)
|
|
|
|
@api.model_create_multi
|
|
def create(self, values_list):
|
|
res = super(KarmaRank, self).create(values_list)
|
|
if any(res.mapped('karma_min')) > 0:
|
|
users = self.env['res.users'].sudo().search([('karma', '>=', max(min(res.mapped('karma_min')), 1))])
|
|
if users:
|
|
users._recompute_rank()
|
|
return res
|
|
|
|
def write(self, vals):
|
|
if 'karma_min' in vals:
|
|
previous_ranks = self.env['gamification.karma.rank'].search([], order="karma_min DESC").ids
|
|
low = min(vals['karma_min'], min(self.mapped('karma_min')))
|
|
high = max(vals['karma_min'], max(self.mapped('karma_min')))
|
|
|
|
res = super(KarmaRank, self).write(vals)
|
|
|
|
if 'karma_min' in vals:
|
|
after_ranks = self.env['gamification.karma.rank'].search([], order="karma_min DESC").ids
|
|
if previous_ranks != after_ranks:
|
|
users = self.env['res.users'].sudo().search([('karma', '>=', max(low, 1))])
|
|
else:
|
|
users = self.env['res.users'].sudo().search([('karma', '>=', max(low, 1)), ('karma', '<=', high)])
|
|
users._recompute_rank()
|
|
return res
|