diff --git a/odoo_dynamic_dashboard/__manifest__.py b/odoo_dynamic_dashboard/__manifest__.py index 0bf8c3c2a..bc139b09f 100644 --- a/odoo_dynamic_dashboard/__manifest__.py +++ b/odoo_dynamic_dashboard/__manifest__.py @@ -21,7 +21,7 @@ ############################################################################# { 'name': "Odoo Dynamic Dashboard", - 'version': '16.0.1.0.0', + 'version': '16.0.1.0.1', 'summary': """Create Configurable Dashboards Easily""", 'description': """Create Configurable Dashboard Dynamically to get the information that are relevant to your business, department, or a specific process or need, Dynamic Dashboard, Dashboard, Dashboard Odoo""", 'author': 'Cybrosys Techno Solutions', diff --git a/odoo_dynamic_dashboard/controllers/main.py b/odoo_dynamic_dashboard/controllers/main.py index 7cc24178c..9be15852e 100644 --- a/odoo_dynamic_dashboard/controllers/main.py +++ b/odoo_dynamic_dashboard/controllers/main.py @@ -21,7 +21,6 @@ ############################################################################# from odoo import http, _ from odoo.http import request -from odoo.exceptions import UserError class DynamicDashboard(http.Controller): @@ -40,16 +39,17 @@ class DynamicDashboard(http.Controller): 'edit_mode': True, 'client_action': int(action_id), }) - - return {'id': tile_id.id, 'name': tile_id.name, 'type': type, 'icon': 'fa fa-money', + return {'id': tile_id.id, 'name': tile_id.name, 'type': type, + 'icon': 'fa fa-money', 'color': 'background-color: #1f6abb;', 'text_color': 'color: #FFFFFF', 'icon_color': 'color: #1f6abb'} @http.route('/tile/details', type='json', auth='user') def tile_details(self, **kw): - tile_id = request.env['dashboard.block'].sudo().search([('id', '=', kw.get('id'))]) - if tile_id: - # model_name = dict(request.env['dashboard.block'].fields_get(allfields=['model_id'])['model_id']['selection'])[tile_id.model_id] - return {'model': tile_id.model_id.model, 'filter': tile_id.filter, 'model_name': tile_id.model_id.name} + tile_id = request.env['dashboard.block'].sudo().search( + [('id', '=', kw.get('id'))]) + if tile_id.model_id: + return {'model': tile_id.model_id.model, 'filter': tile_id.filter, + 'model_name': tile_id.model_id.name} return False diff --git a/odoo_dynamic_dashboard/doc/RELEASE_NOTES.md b/odoo_dynamic_dashboard/doc/RELEASE_NOTES.md index 5dc9715ab..a9ecc99e2 100755 --- a/odoo_dynamic_dashboard/doc/RELEASE_NOTES.md +++ b/odoo_dynamic_dashboard/doc/RELEASE_NOTES.md @@ -1,8 +1,11 @@ ## Module #### 01.10.2022 - #### Version 16.0.1.0.0 +#### ADD +-Initial Commit for odoo_dynamic_dashboard -##### Initial Commit for odoo_dynamic_dashboard - +#### 26.07.2024 +#### Version 16.0.1.0.1 +#### UPDATE +-Bug Fixing \ No newline at end of file diff --git a/odoo_dynamic_dashboard/models/dashboard_block.py b/odoo_dynamic_dashboard/models/dashboard_block.py index 38460cf4e..b4b4b01c7 100644 --- a/odoo_dynamic_dashboard/models/dashboard_block.py +++ b/odoo_dynamic_dashboard/models/dashboard_block.py @@ -31,33 +31,44 @@ class DashboardBlock(models.Model): _rec_name = "name" def get_default_action(self): - action_id = self.env.ref('odoo_dynamic_dashboard.action_dynamic_dashboard') + action_id = self.env.ref('odoo_dynamic_dashboard' + '.action_dynamic_dashboard') if action_id: return action_id.id else: return False name = fields.Char(string="Name", help='Name of the block') - field_id = fields.Many2one('ir.model.fields', 'Measured Field',domain="[('store', '=', True), ('model_id', '=', model_id), ('ttype', 'in', ['float','integer','monetary'])]") + field_id = fields.Many2one('ir.model.fields', 'Measured Field', + domain="[('store', '=', True), ('model_id', " + "'=', model_id), ('ttype', 'in', " + "['float','integer','monetary'])]") fa_icon = fields.Char(string="Icon") graph_size = fields.Selection( - selection=[("col-lg-4", "Small"), ("col-lg-6", "Medium"), ("col-lg-12", "Large")], - string="Graph Size",default='col-lg-4') + selection=[("col-lg-4", "Small"), ("col-lg-6", "Medium"), + ("col-lg-12", "Large")], + string="Graph Size", default='col-lg-4') operation = fields.Selection( selection=[("sum", "Sum"), ("avg", "Average"), ("count", "Count")], - string="Operation", help='Tile Operation that needs to bring values for tile') + string="Operation", + help='Tile Operation that needs to bring values for tile') graph_type = fields.Selection( - selection=[("bar", "Bar"), ("radar", "Radar"), ("pie", "Pie"), ("line", "Line"), ("doughnut", "Doughnut")], + selection=[("bar", "Bar"), ("radar", "Radar"), ("pie", "Pie"), + ("line", "Line"), ("doughnut", "Doughnut")], string="Chart Type", help='Type of Chart') measured_field = fields.Many2one("ir.model.fields", "Measured Field") - client_action = fields.Many2one('ir.actions.client', default = get_default_action) + client_action = fields.Many2one('ir.actions.client', + default=get_default_action) type = fields.Selection( - selection=[("graph", "Chart"), ("tile", "Tile")], string="Type", help='Type of Block ie, Chart or Tile') + selection=[("graph", "Chart"), ("tile", "Tile")], string="Type", + help='Type of Block ie, Chart or Tile') x_axis = fields.Char(string="X-Axis") y_axis = fields.Char(string="Y-Axis") - group_by = fields.Many2one("ir.model.fields", store=True, string="Group by(Y-Axis)", help='Field value for Y-Axis') + group_by = fields.Many2one("ir.model.fields", store=True, + string="Group by(Y-Axis)", + help='Field value for Y-Axis') tile_color = fields.Char(string="Tile Color", help='Primary Color of Tile') text_color = fields.Char(string="Text Color", help='Text Color of Tile') fa_color = fields.Char(string="Icon Color", help='Icon Color of Tile') @@ -71,10 +82,18 @@ class DashboardBlock(models.Model): sequence = fields.Integer(string="Sequence") edit_mode = fields.Boolean(default=False, invisible=True) + @api.onchange('model_id') + def _onchange_model_id(self): + if self.operation or self.measured_field or self.group_by: + self.operation = False + self.measured_field = False + self.group_by = False + def get_dashboard_vals(self, action_id): """Dashboard block values""" block_id = [] - dashboard_block = self.env['dashboard.block'].sudo().search([('client_action', '=', int(action_id))]) + dashboard_block = self.env['dashboard.block'].sudo().search( + [('client_action', '=', int(action_id))]) for rec in dashboard_block: color = rec.tile_color if rec.tile_color else '#1f6abb;' icon_color = rec.tile_color if rec.tile_color else '#1f6abb;' @@ -95,7 +114,9 @@ class DashboardBlock(models.Model): domain = expression.AND([literal_eval(rec.filter)]) if rec.model_name: if rec.type == 'graph': - query = self.env[rec.model_name].get_query(domain, rec.operation, rec.measured_field, + query = self.env[rec.model_name].get_query(domain, + rec.operation, + rec.measured_field, group_by=rec.group_by) self._cr.execute(query) records = self._cr.dictfetchall() @@ -107,7 +128,9 @@ class DashboardBlock(models.Model): y_axis.append(record.get('value')) vals.update({'x_axis': x_axis, 'y_axis': y_axis}) else: - query = self.env[rec.model_name].get_query(domain, rec.operation, rec.measured_field) + query = self.env[rec.model_name].get_query(domain, + rec.operation, + rec.measured_field) self._cr.execute(query) records = self._cr.dictfetchall() magnitude = 0 @@ -116,7 +139,8 @@ class DashboardBlock(models.Model): magnitude += 1 total /= 1000.0 # add more suffixes if you need them - val = '%.2f%s' % (total, ['', 'K', 'M', 'G', 'T', 'P'][magnitude]) + val = '%.2f%s' % ( + total, ['', 'K', 'M', 'G', 'T', 'P'][magnitude]) records[0]['value'] = val vals.update(records[0]) block_id.append(vals) diff --git a/odoo_dynamic_dashboard/models/domain_to_sql.py b/odoo_dynamic_dashboard/models/domain_to_sql.py index 9ebd7dbb4..0421064e4 100644 --- a/odoo_dynamic_dashboard/models/domain_to_sql.py +++ b/odoo_dynamic_dashboard/models/domain_to_sql.py @@ -69,6 +69,4 @@ def get_query(self, args, operation, field, group_by=False, apply_ir_rules=False where_clause_params = map(lambda x: "'" + str(x) + "'", where_clause_params) return query_str % tuple(where_clause_params) - - models.BaseModel.get_query = get_query diff --git a/odoo_dynamic_dashboard/static/src/js/dynamic_dashboard.js b/odoo_dynamic_dashboard/static/src/js/dynamic_dashboard.js index 91ff121f6..5502b7f89 100644 --- a/odoo_dynamic_dashboard/static/src/js/dynamic_dashboard.js +++ b/odoo_dynamic_dashboard/static/src/js/dynamic_dashboard.js @@ -44,9 +44,9 @@ var DynamicDashboard = AbstractAction.extend({ fetch_data: function() { var self = this; var def1 = this._rpc({ - model: 'dashboard.block', - method: 'get_dashboard_vals', - args: [[],this.action_id] + model: 'dashboard.block', + method: 'get_dashboard_vals', + args: [[],this.action_id] }).then(function(result) { self.block_ids = result; }); @@ -67,16 +67,15 @@ var DynamicDashboard = AbstractAction.extend({ get_values_bar : function(block){ var labels = block['x_axis'] var data = { - labels: labels, - datasets: [{ - label: "", - data: block['y_axis'], + labels: labels, + datasets: [{ + label: "", + data: block['y_axis'], backgroundColor: this.get_colors(block['x_axis']), borderColor: 'rgba(200, 200, 200, 0.75)', borderWidth: 1 - }] + }] }; - var options = { scales: { y: { @@ -106,14 +105,14 @@ var DynamicDashboard = AbstractAction.extend({ get_values_line : function(block){ var labels = block['x_axis'] var data = { - labels: labels, - datasets: [{ - label: '', - data: block['y_axis'], - fill: false, - borderColor: 'rgb(75, 192, 192)', - tension: 0.1 - }] + labels: labels, + datasets: [{ + label: '', + data: block['y_axis'], + fill: false, + borderColor: 'rgb(75, 192, 192)', + tension: 0.1 + }] }; var options = { }, line_data = [data,options] @@ -123,35 +122,33 @@ var DynamicDashboard = AbstractAction.extend({ get_values_doughnut : function(block){ var data = { - labels: block['x_axis'], - datasets: [{ + labels: block['x_axis'], + datasets: [{ label: '', data: block['y_axis'], backgroundColor: this.get_colors(block['x_axis']), hoverOffset: 4 - }] + }] }; var options = { }, doughnut_data = [data,options] return doughnut_data; - - }, get_values_radar : function(block){ - var data = { - labels: block['x_axis'], - datasets: [{ - label: '', - data: block['y_axis'], - fill: true, - backgroundColor: 'rgba(255, 99, 132, 0.2)', - borderColor: 'rgb(255, 99, 132)', - pointBackgroundColor: 'rgb(255, 99, 132)', - pointBorderColor: '#fff', - pointHoverBackgroundColor: '#fff', - pointHoverBorderColor: 'rgb(255, 99, 132)' - }] + var data = { + labels: block['x_axis'], + datasets: [{ + label: '', + data: block['y_axis'], + fill: true, + backgroundColor: 'rgba(255, 99, 132, 0.2)', + borderColor: 'rgb(255, 99, 132)', + pointBackgroundColor: 'rgb(255, 99, 132)', + pointBorderColor: '#fff', + pointHoverBackgroundColor: '#fff', + pointHoverBorderColor: 'rgb(255, 99, 132)' + }] }; var options = { elements: { @@ -218,8 +215,8 @@ var DynamicDashboard = AbstractAction.extend({ var element = $('[data-id=' + result['id'] + ']') var ctx =self.$('.chart_graphs').last() var options = { - type: 'bar', - data: { + type: 'bar', + data: { labels: [], datasets: [ { @@ -244,6 +241,7 @@ var DynamicDashboard = AbstractAction.extend({ ajax.jsonRpc('/tile/details', 'call', { 'id': id }).then(function (result) { + if(result){ self.do_action({ name : result['model_name'], type: 'ir.actions.act_window', @@ -252,16 +250,10 @@ var DynamicDashboard = AbstractAction.extend({ views: [[false, 'list'], [false, 'form']], domain: result['filter'] }); + } }); }, - - - }); - - core.action_registry.add('dynamic_dashboard', DynamicDashboard); - return DynamicDashboard; - }); diff --git a/odoo_dynamic_dashboard/views/dynamic_block_view.xml b/odoo_dynamic_dashboard/views/dynamic_block_view.xml index e184a3117..c2471dee5 100644 --- a/odoo_dynamic_dashboard/views/dynamic_block_view.xml +++ b/odoo_dynamic_dashboard/views/dynamic_block_view.xml @@ -64,6 +64,4 @@ - - \ No newline at end of file