Highlight invalid ranges
parent
c025c00cac
commit
cd45a7ff91
|
@ -13,27 +13,25 @@ class KPIThreshold(models.Model):
|
|||
|
||||
@api.multi
|
||||
def _compute_is_valid_threshold(self):
|
||||
result = {}
|
||||
for obj in self:
|
||||
# check if ranges overlap
|
||||
# TODO: This code can be done better
|
||||
obj.valid = True
|
||||
for range1 in obj.range_ids:
|
||||
for range2 in obj.range_ids:
|
||||
if (range1.valid and range2.valid and
|
||||
range1.min_value < range2.min_value):
|
||||
result[obj.id] = range1.max_value <= range2.min_value
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def _compute_generate_invalid_message(self):
|
||||
result = {}
|
||||
for obj in self:
|
||||
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:
|
||||
result[obj.id] = ""
|
||||
obj.invalid_message = None
|
||||
else:
|
||||
result[obj.id] = ("Two of your ranges are overlapping. Please "
|
||||
"make sure your ranges do not overlap.")
|
||||
return result
|
||||
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(
|
||||
|
@ -46,7 +44,7 @@ class KPIThreshold(models.Model):
|
|||
valid = fields.Boolean(string='Valid', required=True,
|
||||
compute="_compute_is_valid_threshold", default=True)
|
||||
invalid_message = fields.Char(string='Message', size=100,
|
||||
compute="_compute_generate_invalid_message")
|
||||
compute="_compute_is_valid_threshold")
|
||||
kpi_ids = fields.One2many('kpi', 'threshold_id', 'KPIs')
|
||||
company_id = fields.Many2one(
|
||||
'res.company', 'Company',
|
||||
|
|
|
@ -92,10 +92,8 @@ class KPIThresholdRange(models.Model):
|
|||
'res.company', 'Company',
|
||||
default=lambda self: self.env.user.company_id.id)
|
||||
|
||||
|
||||
@api.multi
|
||||
def _compute_min_value(self):
|
||||
result = {}
|
||||
for obj in self:
|
||||
value = None
|
||||
error = None
|
||||
|
@ -121,11 +119,9 @@ class KPIThresholdRange(models.Model):
|
|||
error = str(e)
|
||||
obj.min_value = value
|
||||
obj.min_error = error
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def _compute_max_value(self):
|
||||
result = {}
|
||||
for obj in self:
|
||||
value = None
|
||||
error = None
|
||||
|
@ -151,11 +147,9 @@ class KPIThresholdRange(models.Model):
|
|||
error = str(e)
|
||||
obj.max_value = value
|
||||
obj.max_error = error
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def _compute_is_valid_range(self):
|
||||
result = {}
|
||||
for obj in self:
|
||||
if obj.min_error or obj.max_error:
|
||||
obj.valid = False
|
||||
|
@ -170,5 +164,3 @@ class KPIThresholdRange(models.Model):
|
|||
else:
|
||||
obj.valid = True
|
||||
obj.invalid_message = ""
|
||||
return result
|
||||
|
||||
|
|
|
@ -48,37 +48,39 @@
|
|||
<field name="model">kpi</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Key Performance Indicator">
|
||||
<group col="6" colspan="6">
|
||||
<field name="name" colspan="2"/>
|
||||
<field name="threshold_id" colspan="2"/>
|
||||
<field name="category_id" colspan="2"/>
|
||||
<newline/>
|
||||
<field name="value" colspan="2"/>
|
||||
<button name="compute_kpi_value" string="Compute KPI Now" colspan="2" type="object"/>
|
||||
<field name="active" colspan="2"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
</group>
|
||||
<notebook colspan="6">
|
||||
<page string="History">
|
||||
<field name="history_ids" readonly="1" nolabel="1"/>
|
||||
</page>
|
||||
<page string="Computation">
|
||||
<group col="6">
|
||||
<field name="periodicity" colspan="2"/>
|
||||
<field name="periodicity_uom" colspan="2"/>
|
||||
<field name="next_execution_date" colspan="2"/>
|
||||
<separator string="KPI Computation" colspan="6"/>
|
||||
<newline/>
|
||||
<field name="kpi_type" colspan="2"/>
|
||||
<field name="dbsource_id" colspan="2" attrs="{'invisible' : [('kpi_type', '!=', 'external')]}"/>
|
||||
<newline/>
|
||||
<field name="kpi_code" colspan="6"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Description">
|
||||
<field name="description" nolabel="1"/>
|
||||
</page>
|
||||
</notebook>
|
||||
<sheet>
|
||||
<group col="6" colspan="6">
|
||||
<field name="name" colspan="2"/>
|
||||
<field name="threshold_id" colspan="2"/>
|
||||
<field name="category_id" colspan="2"/>
|
||||
<newline/>
|
||||
<field name="value" colspan="2"/>
|
||||
<button name="compute_kpi_value" string="Compute KPI Now" colspan="2" type="object"/>
|
||||
<field name="active" colspan="2"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
</group>
|
||||
<notebook colspan="6">
|
||||
<page string="History">
|
||||
<field name="history_ids" readonly="1" nolabel="1"/>
|
||||
</page>
|
||||
<page string="Computation">
|
||||
<group col="6">
|
||||
<field name="periodicity" colspan="2"/>
|
||||
<field name="periodicity_uom" colspan="2"/>
|
||||
<field name="next_execution_date" colspan="2"/>
|
||||
<separator string="KPI Computation" colspan="6"/>
|
||||
<newline/>
|
||||
<field name="kpi_type" colspan="2"/>
|
||||
<field name="dbsource_id" colspan="2" attrs="{'invisible' : [('kpi_type', '!=', 'external')]}"/>
|
||||
<newline/>
|
||||
<field name="kpi_code" colspan="6"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Description">
|
||||
<field name="description" nolabel="1"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
@ -23,11 +23,13 @@
|
|||
<field name="model">kpi.category</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Category">
|
||||
<group col="2" colspan="2">
|
||||
<field name="name" colspan="2"/>
|
||||
<newline/>
|
||||
<field name="description" colspan="2"/>
|
||||
</group>
|
||||
<sheet>
|
||||
<group col="2" colspan="2">
|
||||
<field name="name" colspan="2"/>
|
||||
<newline/>
|
||||
<field name="description" colspan="2"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
@ -23,14 +23,16 @@
|
|||
<field name="model">kpi.history</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="KPI History">
|
||||
<group col="4" colspan="4">
|
||||
<field name="kpi_id"/>
|
||||
<field name="name"/>
|
||||
<field name="date"/>
|
||||
<field name="value"/>
|
||||
<field name="color" widget="color"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
</group>
|
||||
<sheet>
|
||||
<group col="4" colspan="4">
|
||||
<field name="kpi_id"/>
|
||||
<field name="name"/>
|
||||
<field name="date"/>
|
||||
<field name="value"/>
|
||||
<field name="color" widget="color"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<field name="name">kpi.threshold.tree</field>
|
||||
<field name="model">kpi.threshold</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Thresholds">
|
||||
<tree string="Thresholds" decoration-danger="invalid_message">
|
||||
<field name="name"/>
|
||||
<field name="invalid_message"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
|
@ -22,21 +22,24 @@
|
|||
<field name="model">kpi.threshold</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Threshold">
|
||||
<group col="6" colspan="6">
|
||||
<field name="name" colspan="2"/>
|
||||
<field name="company_id" groups="base.group_multi_company" colspan="2"/>
|
||||
<newline/>
|
||||
<separator string="Ranges" colspan="6"/>
|
||||
<newline/>
|
||||
<field name="range_ids" nolabel="1" colspan="6"/>
|
||||
<newline/>
|
||||
<separator string="KPIs" colspan="6"/>
|
||||
<newline/>
|
||||
<field name="kpi_ids" nolabel="1" colspan="6"/>
|
||||
<newline/>
|
||||
<field name="invalid_message" nolabel="1" attrs="{'invisible' : [('invalid_message', '=', '')]}" colspan="2"/>
|
||||
<newline/>
|
||||
</group>
|
||||
<sheet>
|
||||
<group col="6" colspan="6">
|
||||
<field name="name" colspan="2"/>
|
||||
<field name="company_id" groups="base.group_multi_company" colspan="2"/>
|
||||
<newline/>
|
||||
<separator string="Ranges" colspan="6"/>
|
||||
<newline/>
|
||||
<field name="range_ids" nolabel="1" colspan="6"/>
|
||||
<newline/>
|
||||
<separator string="KPIs" colspan="6"/>
|
||||
<newline/>
|
||||
<field name="kpi_ids" nolabel="1" colspan="6"/>
|
||||
<newline/>
|
||||
<separator string="Errors" attrs="{'invisible' : [('invalid_message', '=', False)]}" colspan="4"/>
|
||||
<field name="invalid_message" nolabel="1" attrs="{'invisible' : [('invalid_message', '=', False)]}" colspan="4"/>
|
||||
<newline/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<field name="name">kpi.threshold.range.tree</field>
|
||||
<field name="model">kpi.threshold.range</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Ranges">
|
||||
<tree string="Ranges" decoration-danger="invalid_message">
|
||||
<field name="name"/>
|
||||
<field name="min_value"/>
|
||||
<field name="max_value"/>
|
||||
|
@ -25,37 +25,39 @@
|
|||
<field name="model">kpi.threshold.range</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Range">
|
||||
<group col="6" colspan="6">
|
||||
<field name="name"/>
|
||||
<field name="color"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<newline/>
|
||||
<sheet>
|
||||
<group col="6" colspan="6">
|
||||
<field name="name"/>
|
||||
<field name="color"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<newline/>
|
||||
|
||||
<separator string="Minimum" colspan="4"/>
|
||||
<newline/>
|
||||
<field name="min_type" colspan="2"/>
|
||||
<field name="min_fixed_value" colspan="2" attrs="{'invisible' : [('min_type', '!=', 'static')]}"/>
|
||||
<field name="min_dbsource_id" colspan="2" attrs="{'invisible' : [('min_type', '!=', 'external')]}"/>
|
||||
<newline/>
|
||||
<field name="min_code" colspan="6" attrs="{'invisible' : [('min_type', 'NOT IN', ('local','external','python'))]}"/>
|
||||
<newline/>
|
||||
<field name="min_error" colspan="6" attrs="{'invisible': [('min_error', '=', False)]}" />
|
||||
<newline/>
|
||||
<separator string="Maximum" colspan="4"/>
|
||||
<newline/>
|
||||
<field name="max_type"/>
|
||||
<field name="max_fixed_value" attrs="{'invisible' : [('max_type', '!=', 'static')]}"/>
|
||||
<field name="max_dbsource_id" attrs="{'invisible' : [('max_type', '!=', 'external')]}"/>
|
||||
<newline/>
|
||||
<field name="max_code" colspan="6" attrs="{'invisible' : [('max_type', 'NOT IN', ('local','external','python'))]}"/>
|
||||
<newline/>
|
||||
<field name="max_error" colspan="6" attrs="{'invisible': [('max_error', '=', False)]}" />
|
||||
<newline/>
|
||||
<separator string="Thresholds" colspan="4"/>
|
||||
<field name="threshold_ids" nolabel="1" colspan="4"/>
|
||||
<separator string="Errors" attrs="{'invisible' : [('invalid_message', '=', '')]}" colspan="4"/>
|
||||
<field name="invalid_message" nolabel="1" attrs="{'invisible' : [('invalid_message', '=', '')]}" colspan="4"/>
|
||||
</group>
|
||||
<separator string="Minimum" colspan="4"/>
|
||||
<newline/>
|
||||
<field name="min_type" colspan="2"/>
|
||||
<field name="min_fixed_value" colspan="2" attrs="{'invisible' : [('min_type', '!=', 'static')]}"/>
|
||||
<field name="min_dbsource_id" colspan="2" attrs="{'invisible' : [('min_type', '!=', 'external')]}"/>
|
||||
<newline/>
|
||||
<field name="min_code" colspan="6" attrs="{'invisible' : [('min_type', 'NOT IN', ('local','external','python'))]}"/>
|
||||
<newline/>
|
||||
<field name="min_error" colspan="6" attrs="{'invisible': [('min_error', '=', False)]}" />
|
||||
<newline/>
|
||||
<separator string="Maximum" colspan="4"/>
|
||||
<newline/>
|
||||
<field name="max_type"/>
|
||||
<field name="max_fixed_value" attrs="{'invisible' : [('max_type', '!=', 'static')]}"/>
|
||||
<field name="max_dbsource_id" attrs="{'invisible' : [('max_type', '!=', 'external')]}"/>
|
||||
<newline/>
|
||||
<field name="max_code" colspan="6" attrs="{'invisible' : [('max_type', 'NOT IN', ('local','external','python'))]}"/>
|
||||
<newline/>
|
||||
<field name="max_error" colspan="6" attrs="{'invisible': [('max_error', '=', False)]}" />
|
||||
<newline/>
|
||||
<separator string="Thresholds" colspan="4"/>
|
||||
<field name="threshold_ids" nolabel="1" colspan="4"/>
|
||||
<separator string="Errors" attrs="{'invisible' : [('invalid_message', '=', False)]}" colspan="4"/>
|
||||
<field name="invalid_message" nolabel="1" attrs="{'invisible' : [('invalid_message', '=', False)]}" colspan="4"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
|
Loading…
Reference in New Issue