OCA reporting engine fork for dev and update.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

82 lines
3.2 KiB

# Copyright 2012 - Now Savoir-faire Linux <https://www.savoirfairelinux.com/>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models, api, exceptions, _
class KPIThreshold(models.Model):
"""KPI Threshold."""
_name = "kpi.threshold"
_description = "KPI Threshold"
@api.multi
def _compute_is_valid_threshold(self):
for obj in self:
# check if ranges overlap
# TODO: This code can be done better
obj.valid = True
for range1 in obj.range_ids:
if not range1.valid:
obj.valid = False
break
for range2 in (obj.range_ids-range1):
if (range1.max_value >= range2.min_value and
range1.min_value <= range2.max_value):
obj.valid = False
break
if obj.valid:
obj.invalid_message = None
else:
obj.invalid_message = (
"Some ranges are invalid or overlapping. "
"Please make sure your ranges do not overlap.")
name = fields.Char('Name', size=50, required=True)
range_ids = fields.Many2many(
'kpi.threshold.range',
'kpi_threshold_range_rel',
'threshold_id',
'range_id',
'Ranges'
)
valid = fields.Boolean(string='Valid', required=True,
compute="_compute_is_valid_threshold", default=True)
invalid_message = fields.Char(string='Message', size=100,
compute="_compute_is_valid_threshold")
kpi_ids = fields.One2many('kpi', 'threshold_id', 'KPIs')
company_id = fields.Many2one(
'res.company', 'Company',
default=lambda self: self.env.user.company_id.id)
@api.model
def create(self, data):
# check if ranges overlap
# TODO: This code can be done better
range_obj1 = self.env['kpi.threshold.range']
range_obj2 = self.env['kpi.threshold.range']
if data.get('range_ids'):
for range1 in data['range_ids'][0][2]:
range_obj1 = range_obj1.browse(range1)
for range2 in data['range_ids'][0][2]:
range_obj2 = range_obj2.browse(range2)
if (range_obj1.valid and range_obj2.valid and
range_obj1.min_value < range_obj2.min_value):
if range_obj1.max_value > range_obj2.min_value:
raise exceptions.Warning(
_("Two of your ranges are overlapping."),
_("Make sure your ranges do not overlap!")
)
range_obj2 = self.env['kpi.threshold.range']
range_obj1 = self.env['kpi.threshold.range']
return super(KPIThreshold, self).create(data)
@api.multi
def get_color(self, kpi_value):
color = '#FFFFFF'
for obj in self:
for range_obj in obj.range_ids:
if (range_obj.min_value <= kpi_value <= range_obj.max_value and
range_obj.valid):
color = range_obj.color
return color