mirror of
https://github.com/OCA/reporting-engine.git
synced 2025-02-16 16:30:38 +02:00
[IMP] kpi_dashboard: black, isort, prettier
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# Copyright 2020 Creu Blanca
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
from odoo import _, api, fields, models
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
|
||||
@@ -17,8 +17,7 @@ class KpiDashboard(models.Model):
|
||||
)
|
||||
number_of_columns = fields.Integer(default=5, required=True)
|
||||
compute_on_fly_refresh = fields.Integer(
|
||||
default=0,
|
||||
help="Seconds to refresh on fly elements"
|
||||
default=0, help="Seconds to refresh on fly elements"
|
||||
)
|
||||
width = fields.Integer(compute="_compute_width")
|
||||
margin_y = fields.Integer(default=10, required=True)
|
||||
@@ -34,9 +33,7 @@ class KpiDashboard(models.Model):
|
||||
if "group_ids" in vals:
|
||||
for rec in self:
|
||||
if rec.menu_id:
|
||||
rec.menu_id.write(
|
||||
{"groups_id": [(6, 0, rec.group_ids.ids)]}
|
||||
)
|
||||
rec.menu_id.write({"groups_id": [(6, 0, rec.group_ids.ids)]})
|
||||
return res
|
||||
|
||||
@api.depends("widget_dimension_x", "margin_x", "number_of_columns")
|
||||
@@ -78,7 +75,7 @@ class KpiDashboard(models.Model):
|
||||
return {
|
||||
"parent_id": menu.id or False,
|
||||
"name": self.name,
|
||||
"action": "%s,%s" % (action._name, action.id),
|
||||
"action": "{},{}".format(action._name, action.id),
|
||||
"groups_id": [(6, 0, self.group_ids.ids)],
|
||||
}
|
||||
|
||||
@@ -106,13 +103,11 @@ class KpiDashboardItem(models.Model):
|
||||
|
||||
name = fields.Char(required=True)
|
||||
kpi_id = fields.Many2one("kpi.kpi")
|
||||
dashboard_id = fields.Many2one(
|
||||
"kpi.dashboard", required=True, ondelete="cascade"
|
||||
)
|
||||
dashboard_id = fields.Many2one("kpi.dashboard", required=True, ondelete="cascade")
|
||||
column = fields.Integer(required=True, default=1)
|
||||
row = fields.Integer(required=True, default=1)
|
||||
end_row = fields.Integer(store=True, compute='_compute_end_row')
|
||||
end_column = fields.Integer(store=True, compute='_compute_end_column')
|
||||
end_row = fields.Integer(store=True, compute="_compute_end_row")
|
||||
end_column = fields.Integer(store=True, compute="_compute_end_column")
|
||||
size_x = fields.Integer(required=True, default=1)
|
||||
size_y = fields.Integer(required=True, default=1)
|
||||
color = fields.Char()
|
||||
@@ -122,44 +117,43 @@ class KpiDashboardItem(models.Model):
|
||||
modify_color = fields.Boolean()
|
||||
modify_color_expression = fields.Char()
|
||||
|
||||
@api.depends('row', 'size_y')
|
||||
@api.depends("row", "size_y")
|
||||
def _compute_end_row(self):
|
||||
for r in self:
|
||||
r.end_row = r.row + r.size_y - 1
|
||||
|
||||
@api.depends('column', 'size_x')
|
||||
@api.depends("column", "size_x")
|
||||
def _compute_end_column(self):
|
||||
for r in self:
|
||||
r.end_column = r.column + r.size_x - 1
|
||||
|
||||
@api.constrains('size_y')
|
||||
@api.constrains("size_y")
|
||||
def _check_size_y(self):
|
||||
for rec in self:
|
||||
if rec.size_y > 10:
|
||||
raise ValidationError(_(
|
||||
'Size Y of the widget cannot be bigger than 10'))
|
||||
raise ValidationError(
|
||||
_("Size Y of the widget cannot be bigger than 10")
|
||||
)
|
||||
|
||||
def _check_size_domain(self):
|
||||
return [
|
||||
('dashboard_id', '=', self.dashboard_id.id),
|
||||
('id', '!=', self.id),
|
||||
('row', '<=', self.end_row),
|
||||
('end_row', '>=', self.row),
|
||||
('column', '<=', self.end_column),
|
||||
('end_column', '>=', self.column),
|
||||
("dashboard_id", "=", self.dashboard_id.id),
|
||||
("id", "!=", self.id),
|
||||
("row", "<=", self.end_row),
|
||||
("end_row", ">=", self.row),
|
||||
("column", "<=", self.end_column),
|
||||
("end_column", ">=", self.column),
|
||||
]
|
||||
|
||||
@api.constrains('end_row', 'end_column', 'row', 'column')
|
||||
@api.constrains("end_row", "end_column", "row", "column")
|
||||
def _check_size(self):
|
||||
for r in self:
|
||||
if self.search(r._check_size_domain(), limit=1):
|
||||
raise ValidationError(_(
|
||||
'Widgets cannot be crossed by other widgets'
|
||||
))
|
||||
raise ValidationError(_("Widgets cannot be crossed by other widgets"))
|
||||
if r.end_column > r.dashboard_id.number_of_columns:
|
||||
raise ValidationError(_(
|
||||
'Widget %s is bigger than expected'
|
||||
) % r.display_name)
|
||||
raise ValidationError(
|
||||
_("Widget %s is bigger than expected") % r.display_name
|
||||
)
|
||||
|
||||
@api.onchange("kpi_id")
|
||||
def _onchange_kpi(self):
|
||||
@@ -181,9 +175,9 @@ class KpiDashboardItem(models.Model):
|
||||
"modify_color": self.modify_color,
|
||||
}
|
||||
if self.modify_context:
|
||||
vals['modify_context_expression'] = self.modify_context_expression
|
||||
vals["modify_context_expression"] = self.modify_context_expression
|
||||
if self.modify_color:
|
||||
vals['modify_color_expression'] = self.modify_color_expression
|
||||
vals["modify_color_expression"] = self.modify_color_expression
|
||||
if self.kpi_id:
|
||||
vals.update(
|
||||
{
|
||||
@@ -195,15 +189,19 @@ class KpiDashboardItem(models.Model):
|
||||
}
|
||||
)
|
||||
if self.kpi_id.compute_on_fly:
|
||||
vals.update({
|
||||
"value": self.kpi_id._compute_value(),
|
||||
"value_last_update": fields.Datetime.now(),
|
||||
})
|
||||
vals.update(
|
||||
{
|
||||
"value": self.kpi_id._compute_value(),
|
||||
"value_last_update": fields.Datetime.now(),
|
||||
}
|
||||
)
|
||||
else:
|
||||
vals.update({
|
||||
"value": self.kpi_id.value,
|
||||
"value_last_update": self.kpi_id.value_last_update,
|
||||
})
|
||||
vals.update(
|
||||
{
|
||||
"value": self.kpi_id.value,
|
||||
"value_last_update": self.kpi_id.value_last_update,
|
||||
}
|
||||
)
|
||||
if self.kpi_id.action_ids:
|
||||
vals["actions"] = self.kpi_id.action_ids.read_dashboard()
|
||||
else:
|
||||
@@ -219,12 +217,13 @@ class KpiDashboardItem(models.Model):
|
||||
def technical_config(self):
|
||||
self.ensure_one()
|
||||
return {
|
||||
'name': self.display_name,
|
||||
'res_model': self._name,
|
||||
'res_id': self.id,
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_mode': 'form',
|
||||
'target': 'new',
|
||||
'view_id': self.env.ref(
|
||||
'kpi_dashboard.kpi_dashboard_item_config_form_view').id,
|
||||
"name": self.display_name,
|
||||
"res_model": self._name,
|
||||
"res_id": self.id,
|
||||
"type": "ir.actions.act_window",
|
||||
"view_mode": "form",
|
||||
"target": "new",
|
||||
"view_id": self.env.ref(
|
||||
"kpi_dashboard.kpi_dashboard_item_config_form_view"
|
||||
).id,
|
||||
}
|
||||
|
||||
@@ -1,17 +1,20 @@
|
||||
# Copyright 2020 Creu Blanca
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
from odoo.exceptions import ValidationError
|
||||
import ast
|
||||
from odoo.tools.safe_eval import safe_eval
|
||||
from odoo.addons.base.models.ir_cron import _intervalTypes
|
||||
from odoo.tools.float_utils import float_compare
|
||||
import re
|
||||
import json
|
||||
import datetime
|
||||
import json
|
||||
import re
|
||||
|
||||
from dateutil import relativedelta
|
||||
|
||||
from odoo import _, api, fields, models
|
||||
from odoo.exceptions import ValidationError
|
||||
from odoo.tools.float_utils import float_compare
|
||||
from odoo.tools.safe_eval import safe_eval
|
||||
|
||||
from odoo.addons.base.models.ir_cron import _intervalTypes
|
||||
|
||||
|
||||
class KpiKpi(models.Model):
|
||||
_name = "kpi.kpi"
|
||||
@@ -30,8 +33,13 @@ class KpiKpi(models.Model):
|
||||
args = fields.Char()
|
||||
kwargs = fields.Char()
|
||||
widget = fields.Selection(
|
||||
[('integer', 'Integer'), ("number", "Number"), ("meter", "Meter"),
|
||||
('counter', 'Counter'), ("graph", "Graph")],
|
||||
[
|
||||
("integer", "Integer"),
|
||||
("number", "Number"),
|
||||
("meter", "Meter"),
|
||||
("counter", "Counter"),
|
||||
("graph", "Graph"),
|
||||
],
|
||||
required=True,
|
||||
default="number",
|
||||
)
|
||||
@@ -40,22 +48,21 @@ class KpiKpi(models.Model):
|
||||
suffix = fields.Char()
|
||||
action_ids = fields.One2many(
|
||||
"kpi.kpi.action",
|
||||
inverse_name='kpi_id',
|
||||
help="Actions that can be opened from the KPI"
|
||||
inverse_name="kpi_id",
|
||||
help="Actions that can be opened from the KPI",
|
||||
)
|
||||
code = fields.Text("Code")
|
||||
store_history = fields.Boolean()
|
||||
store_history_interval = fields.Selection(
|
||||
selection=lambda self:
|
||||
self.env['ir.cron']._fields['interval_type'].selection,
|
||||
selection=lambda self: self.env["ir.cron"]._fields["interval_type"].selection,
|
||||
)
|
||||
store_history_interval_number = fields.Integer()
|
||||
compute_on_fly = fields.Boolean()
|
||||
history_ids = fields.One2many("kpi.kpi.history", inverse_name="kpi_id")
|
||||
computed_value = fields.Serialized(compute='_compute_computed_value')
|
||||
computed_date = fields.Datetime(compute='_compute_computed_value')
|
||||
computed_value = fields.Serialized(compute="_compute_computed_value")
|
||||
computed_date = fields.Datetime(compute="_compute_computed_value")
|
||||
|
||||
@api.depends('value', 'value_last_update', 'compute_on_fly')
|
||||
@api.depends("value", "value_last_update", "compute_on_fly")
|
||||
def _compute_computed_value(self):
|
||||
for record in self:
|
||||
if record.compute_on_fly:
|
||||
@@ -95,18 +102,19 @@ class KpiKpi(models.Model):
|
||||
value = self._compute_value()
|
||||
self.write({"value": value})
|
||||
if self.store_history:
|
||||
last = self.env['kpi.kpi.history'].search([
|
||||
('kpi_id', '=', self.id)
|
||||
], limit=1)
|
||||
last = self.env["kpi.kpi.history"].search(
|
||||
[("kpi_id", "=", self.id)], limit=1
|
||||
)
|
||||
if (
|
||||
not last or
|
||||
not self.store_history_interval or
|
||||
last.create_date + _intervalTypes[self.store_history_interval](
|
||||
self.store_history_interval_number) < fields.Datetime.now()
|
||||
):
|
||||
self.env["kpi.kpi.history"].create(
|
||||
self._generate_history_vals(value)
|
||||
not last
|
||||
or not self.store_history_interval
|
||||
or last.create_date
|
||||
+ _intervalTypes[self.store_history_interval](
|
||||
self.store_history_interval_number
|
||||
)
|
||||
< fields.Datetime.now()
|
||||
):
|
||||
self.env["kpi.kpi.history"].create(self._generate_history_vals(value))
|
||||
notifications = []
|
||||
for dashboard_item in self.dashboard_item_ids:
|
||||
channel = "kpi_dashboard_%s" % dashboard_item.dashboard_id.id
|
||||
@@ -152,9 +160,9 @@ class KpiKpi(models.Model):
|
||||
if len(message) > 0:
|
||||
message += _(" or ")
|
||||
message += forbidden[-1]
|
||||
raise ValidationError(_(
|
||||
"The code cannot contain the following terms: %s."
|
||||
) % message)
|
||||
raise ValidationError(
|
||||
_("The code cannot contain the following terms: %s.") % message
|
||||
)
|
||||
results = self._get_code_input_dict()
|
||||
savepoint = "kpi_formula_%s" % self.id
|
||||
self.env.cr.execute("savepoint %s" % savepoint)
|
||||
@@ -164,30 +172,34 @@ class KpiKpi(models.Model):
|
||||
|
||||
def show_value(self):
|
||||
self.ensure_one()
|
||||
action = self.env.ref('kpi_dashboard.kpi_kpi_act_window')
|
||||
action = self.env.ref("kpi_dashboard.kpi_kpi_act_window")
|
||||
result = action.read()[0]
|
||||
result.update({
|
||||
'res_id': self.id,
|
||||
'target': 'new',
|
||||
'view_mode': 'form',
|
||||
'views': [(self.env.ref(
|
||||
'kpi_dashboard.kpi_kpi_widget_form_view'
|
||||
).id, 'form')],
|
||||
})
|
||||
result.update(
|
||||
{
|
||||
"res_id": self.id,
|
||||
"target": "new",
|
||||
"view_mode": "form",
|
||||
"views": [
|
||||
(self.env.ref("kpi_dashboard.kpi_kpi_widget_form_view").id, "form")
|
||||
],
|
||||
}
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
class KpiKpiAction(models.Model):
|
||||
_name = 'kpi.kpi.action'
|
||||
_description = 'KPI action'
|
||||
_name = "kpi.kpi.action"
|
||||
_description = "KPI action"
|
||||
|
||||
kpi_id = fields.Many2one('kpi.kpi', required=True, ondelete='cascade')
|
||||
kpi_id = fields.Many2one("kpi.kpi", required=True, ondelete="cascade")
|
||||
action = fields.Reference(
|
||||
selection=[('ir.actions.report', 'ir.actions.report'),
|
||||
('ir.actions.act_window', 'ir.actions.act_window'),
|
||||
('ir.actions.act_url', 'ir.actions.act_url'),
|
||||
('ir.actions.server', 'ir.actions.server'),
|
||||
('ir.actions.client', 'ir.actions.client')],
|
||||
selection=[
|
||||
("ir.actions.report", "ir.actions.report"),
|
||||
("ir.actions.act_window", "ir.actions.act_window"),
|
||||
("ir.actions.act_url", "ir.actions.act_url"),
|
||||
("ir.actions.server", "ir.actions.server"),
|
||||
("ir.actions.client", "ir.actions.client"),
|
||||
],
|
||||
required=True,
|
||||
)
|
||||
context = fields.Char()
|
||||
@@ -196,43 +208,45 @@ class KpiKpiAction(models.Model):
|
||||
result = {}
|
||||
for r in self:
|
||||
result[r.id] = {
|
||||
'id': r.action.id,
|
||||
'type': r.action._name,
|
||||
'name': r.action.name,
|
||||
'context': safe_eval(r.context or '{}')
|
||||
"id": r.action.id,
|
||||
"type": r.action._name,
|
||||
"name": r.action.name,
|
||||
"context": safe_eval(r.context or "{}"),
|
||||
}
|
||||
return result
|
||||
|
||||
|
||||
class KpiKpiHistory(models.Model):
|
||||
_name = 'kpi.kpi.history'
|
||||
_description = 'KPI history'
|
||||
_order = 'create_date DESC'
|
||||
_name = "kpi.kpi.history"
|
||||
_description = "KPI history"
|
||||
_order = "create_date DESC"
|
||||
|
||||
kpi_id = fields.Many2one(
|
||||
'kpi.kpi', required=True, ondelete='cascade', readonly=True
|
||||
"kpi.kpi", required=True, ondelete="cascade", readonly=True
|
||||
)
|
||||
value = fields.Serialized(readonly=True)
|
||||
raw_value = fields.Char(compute='_compute_raw_value')
|
||||
name = fields.Char(related='kpi_id.name')
|
||||
raw_value = fields.Char(compute="_compute_raw_value")
|
||||
name = fields.Char(related="kpi_id.name")
|
||||
widget = fields.Selection(
|
||||
selection=lambda self:
|
||||
self.env['kpi.kpi']._fields['widget'].selection,
|
||||
required=True)
|
||||
selection=lambda self: self.env["kpi.kpi"]._fields["widget"].selection,
|
||||
required=True,
|
||||
)
|
||||
|
||||
@api.depends('value')
|
||||
@api.depends("value")
|
||||
def _compute_raw_value(self):
|
||||
for record in self:
|
||||
record.raw_value = json.dumps(record.value)
|
||||
|
||||
def show_form(self):
|
||||
self.ensure_one()
|
||||
action = self.env.ref('kpi_dashboard.kpi_kpi_history_act_window')
|
||||
action = self.env.ref("kpi_dashboard.kpi_kpi_history_act_window")
|
||||
result = action.read()[0]
|
||||
result.update({
|
||||
'res_id': self.id,
|
||||
'target': 'new',
|
||||
'view_mode': 'form',
|
||||
'views': [(self.env.context.get('form_id'), 'form')],
|
||||
})
|
||||
result.update(
|
||||
{
|
||||
"res_id": self.id,
|
||||
"target": "new",
|
||||
"view_mode": "form",
|
||||
"views": [(self.env.context.get("form_id"), "form")],
|
||||
}
|
||||
)
|
||||
return result
|
||||
|
||||
Reference in New Issue
Block a user