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

  1. # Copyright 2012 - Now Savoir-faire Linux <https://www.savoirfairelinux.com/>
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  3. from odoo import fields, models, api, exceptions, _
  4. class KPIThreshold(models.Model):
  5. """KPI Threshold."""
  6. _name = "kpi.threshold"
  7. _description = "KPI Threshold"
  8. @api.multi
  9. def _compute_is_valid_threshold(self):
  10. for obj in self:
  11. # check if ranges overlap
  12. # TODO: This code can be done better
  13. obj.valid = True
  14. for range1 in obj.range_ids:
  15. if not range1.valid:
  16. obj.valid = False
  17. break
  18. for range2 in (obj.range_ids-range1):
  19. if (range1.max_value >= range2.min_value and
  20. range1.min_value <= range2.max_value):
  21. obj.valid = False
  22. break
  23. if obj.valid:
  24. obj.invalid_message = None
  25. else:
  26. obj.invalid_message = (
  27. "Some ranges are invalid or overlapping. "
  28. "Please make sure your ranges do not overlap.")
  29. name = fields.Char('Name', size=50, required=True)
  30. range_ids = fields.Many2many(
  31. 'kpi.threshold.range',
  32. 'kpi_threshold_range_rel',
  33. 'threshold_id',
  34. 'range_id',
  35. 'Ranges'
  36. )
  37. valid = fields.Boolean(string='Valid', required=True,
  38. compute="_compute_is_valid_threshold", default=True)
  39. invalid_message = fields.Char(string='Message', size=100,
  40. compute="_compute_is_valid_threshold")
  41. kpi_ids = fields.One2many('kpi', 'threshold_id', 'KPIs')
  42. company_id = fields.Many2one(
  43. 'res.company', 'Company',
  44. default=lambda self: self.env.user.company_id.id)
  45. @api.model
  46. def create(self, data):
  47. # check if ranges overlap
  48. # TODO: This code can be done better
  49. range_obj1 = self.env['kpi.threshold.range']
  50. range_obj2 = self.env['kpi.threshold.range']
  51. if data.get('range_ids'):
  52. for range1 in data['range_ids'][0][2]:
  53. range_obj1 = range_obj1.browse(range1)
  54. for range2 in data['range_ids'][0][2]:
  55. range_obj2 = range_obj2.browse(range2)
  56. if (range_obj1.valid and range_obj2.valid and
  57. range_obj1.min_value < range_obj2.min_value):
  58. if range_obj1.max_value > range_obj2.min_value:
  59. raise exceptions.Warning(
  60. _("Two of your ranges are overlapping."),
  61. _("Make sure your ranges do not overlap!")
  62. )
  63. range_obj2 = self.env['kpi.threshold.range']
  64. range_obj1 = self.env['kpi.threshold.range']
  65. return super(KPIThreshold, self).create(data)
  66. @api.multi
  67. def get_color(self, kpi_value):
  68. color = '#FFFFFF'
  69. for obj in self:
  70. for range_obj in obj.range_ids:
  71. if (range_obj.min_value <= kpi_value <= range_obj.max_value and
  72. range_obj.valid):
  73. color = range_obj.color
  74. return color