pengyuthon wechat

This commit is contained in:
李鹏宇
2024-11-16 11:26:15 +08:00
parent a340f25e24
commit 720ce6f8d5
403 changed files with 29058 additions and 2473 deletions
+77 -24
View File
@@ -1,25 +1,22 @@
# -*- coding: utf-8 -*-
{
'name': 'Dashboard Ninja',
'name': 'Dashboard Ninja with AI',
'summary': """
KS Dashboard Ninja
""",
'summary': """Dashboard Ninja v17""",
'description': """
Dashboard Ninja v17
""",
'description': """Dashboard Ninja v17""",
'author': 'Ksolves India Ltd.',
'license': 'OPL-1',
'website': 'https://store.ksolves.com/',
'maintainer': 'Ksolves India Ltd.',
'category': 'public_pur',
'live_test_url': 'https://dashboardninja17.ksolves.net/',
'category': 'Services',
'version': '17.0.1.8.3',
'support': 'sales@ksolves.com',
@@ -52,27 +49,83 @@
'demo': ['demo/ks_dashboard_ninja_demo.xml'],
'assets': {
'ks_dashboard_ninja.ks_dashboard_lib': [
'/ks_dashboard_ninja/static/lib/css/gridstack.min.css',
'/ks_dashboard_ninja/static/lib/js/gridstack-h5.js',
'/ks_dashboard_ninja/static/lib/js/pdfmake.min.js',
'/ks_dashboard_ninja/static/lib/js/vfs_fonts.js',
'ks_dashboard_ninja/static/lib/js/Animated.js',
'ks_dashboard_ninja/static/lib/js/worldLow.js',
'ks_dashboard_ninja/static/lib/js/map.js',
'ks_dashboard_ninja/static/lib/js/index.js',
'ks_dashboard_ninja/static/lib/js/pdfmake.js',
'ks_dashboard_ninja/static/lib/js/percent.js',
'ks_dashboard_ninja/static/lib/js/pdf.min.js',
'ks_dashboard_ninja/static/lib/js/print.min.js',
'ks_dashboard_ninja/static/lib/js/Dataviz.js',
'ks_dashboard_ninja/static/lib/js/Material.js',
'ks_dashboard_ninja/static/lib/js/Moonrise.js',
'ks_dashboard_ninja/static/lib/js/xy.js',
'ks_dashboard_ninja/static/lib/js/radar.js',
],
'web.assets_backend': [
# 'ks_dashboard_ninja/static/lib/css/Chart.css',
'ks_dashboard_ninja/static/lib/css/gridstack.min.css',
'ks_dashboard_ninja/static/lib/js/gridstack-h5.js',
# 'ks_dashboard_ninja/static/lib/js/Chart.bundle.min.js',
'ks_dashboard_ninja/static/lib/js/chart.umd.min.js',
'ks_dashboard_ninja/static/src/css/ks_dashboard_ninja.scss',
'ks_dashboard_ninja/static/src/css/ks_dashboard_ninja_item.css',
'ks_dashboard_ninja/static/src/css/ks_icon_container_modal.css',
'ks_dashboard_ninja/static/src/css/ks_dashboard_item_theme.css',
'ks_dashboard_ninja/static/src/css/ks_input_bar.css',
'ks_dashboard_ninja/static/src/css/ks_ai_dash.css',
'ks_dashboard_ninja/static/src/css/ks_dn_filter.css',
'ks_dashboard_ninja/static/src/css/ks_toggle_icon.css',
'ks_dashboard_ninja/static/src/css/ks_flower_view.css',
'ks_dashboard_ninja/static/src/css/ks_map_view.css',
'ks_dashboard_ninja/static/src/css/ks_funnel_view.css',
'ks_dashboard_ninja/static/src/css/ks_dashboard_options.css',
'ks_dashboard_ninja/static/lib/css/Chart.min.css',
'ks_dashboard_ninja/static/src/js/ks_dashboard_ninja_new.js',
'ks_dashboard_ninja/static/src/js/ks_global_functions.js',
'ks_dashboard_ninja/static/lib/js/index.js',
'ks_dashboard_ninja/static/lib/js/pdfmake.js',
'ks_dashboard_ninja/static/lib/js/percent.js',
'ks_dashboard_ninja/static/lib/js/pdf.min.js',
'ks_dashboard_ninja/static/lib/js/print.min.js',
'ks_dashboard_ninja/static/lib/js/Dataviz.js',
'ks_dashboard_ninja/static/lib/js/Material.js',
'ks_dashboard_ninja/static/lib/js/Moonrise.js',
'ks_dashboard_ninja/static/lib/js/exporting.js',
'ks_dashboard_ninja/static/lib/js/pdfmake.min.js',
'ks_dashboard_ninja/static/src/css/*',
'ks_dashboard_ninja/static/src/scss/*',
'ks_dashboard_ninja/static/src/dashboard/*',
'ks_dashboard_ninja/static/src/items/*',
'ks_dashboard_ninja/static/src/items/**/*',
'ks_dashboard_ninja/static/src/preview/*',
'ks_dashboard_ninja/static/src/tools/*',
# 'ks_dashboard_ninja/static/src/**/**/*',
'ks_dashboard_ninja/static/lib/js/pdfmake.js',
'ks_dashboard_ninja/static/lib/js/percent.js',
'ks_dashboard_ninja/static/src/js/ks_dashboard_ninja_new.js',
'ks_dashboard_ninja/static/src/js/ks_global_functions.js',
'ks_dashboard_ninja/static/src/js/ks_form_view_dialog.js',
'ks_dashboard_ninja/static/lib/js/xy.js',
'ks_dashboard_ninja/static/lib/js/radar.js',
'ks_dashboard_ninja/static/src/css/style.css',
# 'ks_dashboard_ninja/static/src/js/ks_dashboard_ninja.js',
# 'ks_dashboard_ninja/static/src/js/ks_to_do_dashboard.js',
'ks_dashboard_ninja/static/src/js/ks_filter_props_new.js',
'ks_dashboard_ninja/static/src/js/domainfix.js',
# 'ks_dashboard_ninja/static/src/js/ks_dashboard_item_theme.js',
# 'ks_dashboard_ninja/static/src/js/ks_import_dashboard.js',
# 'ks_dashboard_ninja/static/src/js/ks_domain_fix.js',
# 'ks_dashboard_ninja/static/src/js/ks_quick_edit_view.js',
# 'ks_dashboard_ninja/static/src/js/ks_date_picker.js',
# 'ks_dashboard_ninja/static/lib/js/Chart.bundle.min.js',
'ks_dashboard_ninja/static/src/css/ks_dashboard_ninja_pro.css',
'ks_dashboard_ninja/static/src/css/ks_to_do_item.css',
# 'ks_dashboard_ninja/static/src/js/ks_item_theme_file.js',
# 'ks_dashboard_ninja/static/src/xml/owl_template.xml',
'ks_dashboard_ninja/static/src/xml/**/*',
'ks_dashboard_ninja/static/src/css/ks_radial_chart.css',
'ks_dashboard_ninja/static/src/js/ks_ai_dash_action.js',
'ks_dashboard_ninja/static/src/components/**/*',
'ks_dashboard_ninja/static/src/widgets/**/*',
],
},
'external_dependencies': {
'python': ['pandas','xlrd']
'python': ['pandas','xlrd','openpyxl','gTTS']
},
'uninstall_hook': 'uninstall_hook',
@@ -6,9 +6,11 @@ from odoo.exceptions import ValidationError
from datetime import timedelta
import pytz
import os
import ast
import os.path
from dateutil import rrule
from dateutil.relativedelta import relativedelta
from odoo.tools.safe_eval import safe_eval
@@ -41,7 +43,6 @@ def ks_get_date(ks_date_filter_selection, self, type):
function_name = globals()["ks_date_series_" + series.split("_")[0]]
return function_name(series.split("_")[1],timezone, type,self)
def ks_date_series_td(ks_date_selection, timezone, type, self=None):
ks_function_name = globals()["ks_get_date_range_from_td_" + ks_date_selection]
return ks_function_name(timezone, type, self)
@@ -1,3 +1,4 @@
from . import ks_chart_export
from . import ks_list_export
from . import ks_dashboard_export
from . import ks_domain_fix
@@ -22,6 +22,10 @@ class KsChartExport(http.Controller):
params = json.loads(data)
header,chart_data = operator.itemgetter('header','chart_data')(params)
chart_data = json.loads(chart_data)
if isinstance(chart_data['labels'], list):
chart_data['labels'] = [str(label) for label in chart_data['labels']]
chart_data['labels'].insert(0,'Measure')
columns_headers = chart_data['labels']
import_data = []
@@ -37,9 +41,6 @@ class KsChartExport(http.Controller):
# cookies={'fileToken': token}
)
class KsChartExcelExport(KsChartExport, http.Controller):
# Excel needs raw data to correctly handle numbers and date values
@@ -0,0 +1,21 @@
from odoo.addons.web.controllers.domain import Domain
from odoo import http, _
from odoo.http import Controller, request
from odoo.tools.safe_eval import safe_eval
class ksdomainfix(Domain):
# to validate our uid and mycompany based domain
@http.route('/web/domain/validate', type='json', auth="user")
def validate(self, model, domain):
ks_uid_domain = str(domain)
if ks_uid_domain and "%UID" in ks_uid_domain:
ks_domain = ks_uid_domain.replace("%UID", str(request.env.user.id))
return super().validate(model,safe_eval(ks_domain))
elif ks_uid_domain and "%MYCOMPANY" in ks_uid_domain:
ks_domain = ks_uid_domain.replace("%MYCOMPANY", str(request.env.company.id))
return super().validate(model,safe_eval(ks_domain))
else:
return super().validate(model, domain)
@@ -5,7 +5,7 @@ import json
import operator
import logging
from odoo.addons.web.controllers.main import ExportFormat, ExportXlsxWriter
from odoo.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT
from odoo.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT , xlsxwriter
import datetime
from odoo import http
from odoo.http import content_disposition, request
+11 -11
View File
@@ -242,7 +242,7 @@
<!-- <field name="ks_chart_measure_field" eval="[ref('base.field_res_country__phone_code')]"/>-->
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
<field name="ks_domain">[["id","&lt;",40]]</field>
<field name="ks_chart_item_color">warm</field>
<field name="ks_chart_item_color">dark</field>
<field name="ks_dashboard_item_type">ks_bar_chart</field>
<field name="ks_company_id" eval="0"/>
@@ -258,7 +258,7 @@
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
<field name="ks_domain">[["id","&lt;",10]]</field>
<field name="ks_chart_item_color">warm</field>
<field name="ks_chart_item_color">dark</field>
<field name="ks_dashboard_item_type">ks_line_chart</field>
<field name="ks_company_id" eval="0"/>
@@ -296,7 +296,7 @@
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
<field name="ks_domain">[["id","&lt;",10]]</field>
<field name="ks_chart_item_color">neon</field>
<field name="ks_chart_item_color">material</field>
<field name="ks_dashboard_item_type">ks_horizontalBar_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
@@ -308,7 +308,7 @@
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
<field name="ks_domain">[["id","&lt;",10]]</field>
<field name="ks_chart_item_color">cool</field>
<field name="ks_chart_item_color">moonrise</field>
<field name="ks_dashboard_item_type">ks_polarArea_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
@@ -320,7 +320,7 @@
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__name')"/>
<field name="ks_domain">[["id","&lt;",10]]</field>
<field name="ks_chart_item_color">neon</field>
<field name="ks_chart_item_color">moonrise</field>
<field name="ks_record_data_limit">100</field>
<field name="ks_show_data_value">1</field>
<field name="ks_unit_selection">monetary</field>
@@ -363,7 +363,7 @@
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
<field name="ks_domain">[["id","&lt;",10]]</field>
<field name="ks_chart_item_color">neon</field>
<field name="ks_chart_item_color">dark</field>
<field name="ks_dashboard_item_type">ks_pie_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
@@ -374,7 +374,7 @@
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__code')"/>
<field name="ks_chart_item_color">neon</field>
<field name="ks_chart_item_color">default</field>
<field name="ks_dashboard_item_type">ks_area_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
@@ -468,7 +468,7 @@
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__name')"/>
<field name="ks_semi_circle_chart">1</field>
<field name="ks_chart_item_color">warm</field>
<field name="ks_chart_item_color">material</field>
<field name="ks_record_data_limit">10</field>
<field name="ks_show_data_value">1</field>
<field name="ks_unit_selection">monetary</field>
@@ -497,7 +497,7 @@
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__code')"/>
<field name="ks_chart_item_color">warm</field>
<field name="ks_chart_item_color">material</field>
<field name="ks_record_data_limit">25</field>
<field name="ks_show_data_value">1</field>
<field name="ks_unit_selection">monetary</field>
@@ -511,7 +511,7 @@
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__name')"/>
<field name="ks_chart_item_color">warm</field>
<field name="ks_chart_item_color">moonrise</field>
<field name="ks_record_data_limit">10</field>
<field name="ks_show_data_value">1</field>
<field name="ks_unit_selection">monetary</field>
@@ -525,7 +525,7 @@
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__name')"/>
<field name="ks_chart_item_color">neon</field>
<field name="ks_chart_item_color">default</field>
<field name="ks_semi_circle_chart">1</field>
<field name="ks_record_data_limit">25</field>
<field name="ks_show_data_value">1</field>
File diff suppressed because it is too large Load Diff
@@ -3,6 +3,9 @@ import logging
import requests
from odoo import http, api, fields, models, _
from odoo.exceptions import ValidationError
from gtts import gTTS
import base64
import os
_logger = logging.getLogger(__name__)
@@ -14,9 +17,9 @@ class KsDashboardNInjaAI(models.TransientModel):
ks_type = fields.Selection([('ks_model', 'Model'), ('ks_keyword', 'Keywords')],
string="Ks AI Type", default='ks_model')
ks_import_model_id = fields.Many2one('ir.model', string='Model',
ks_import_model_id = fields.Many2one('ir.model', string='Model ID',
domain="[('access_ids','!=',False),('transient','=',False),"
"('model','not ilike','base_import%'),('model','not ilike','ir.%'),"
"('model','not ilike','base_import%'),'|',('model','not ilike','ir.%'),('model','=ilike','_%ir.%'),"
"('model','not ilike','web_editor.%'),('model','not ilike','web_tour.%'),"
"('model','!=','mail.thread'),('model','not ilike','ks_dash%'),('model','not ilike','ks_to%')]",
help="Data source to fetch and read the data for the creation of dashboard items. ")
@@ -48,9 +51,6 @@ class KsDashboardNInjaAI(models.TransientModel):
self.ks_model_show = True
else:
self.ks_model_show = False
else:
raise ValidationError(_("Please enter URL and API Key in General Settings"))
else:
self.ks_model_show = False
@@ -88,6 +88,7 @@ class KsDashboardNInjaAI(models.TransientModel):
if api_key and url:
json_data = {'name': api_key,
'question':question,
'type': self.ks_type,
'url': self.env['ir.config_parameter'].sudo().get_param('web.base.url'),
'db_name': self.env.cr.dbname
}
@@ -114,11 +115,11 @@ class KsDashboardNInjaAI(models.TransientModel):
if (ks_result == "success"):
return {
'type': 'ir.actions.client',
'name': context['ks_dash_name'],
'name': 'AI Dashboard',
'params': {'ks_dashboard_id': ks_create_record.id},
'tag': 'ks_dashboard_ninja_ai',
'target': 'new',
'context': context
'tag': 'ks_ai_dashboard_ninja',
'context': context,
'target':'new'
}
else:
self.env['ks_dashboard_ninja.board'].browse(ks_dash_id).unlink()
@@ -212,11 +213,86 @@ class KsDashboardNInjaAI(models.TransientModel):
else:
raise ValidationError(_("Enter the input keywords to render the item"))
@api.model
def ks_generate_analysis(self,ks_items_explain,ks_rest_items,dashboard_id):
if ks_items_explain:
result = []
api_key = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.dn_api_key')
ks_url = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.url')
words = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.ks_analysis_word_length')
url = ks_url + "/api/v1/ks_dn_main_api"
for i in range(0,len(ks_items_explain)):
if api_key and url :
json_data = {'name': api_key,
'items':json.dumps(ks_items_explain[i]),
'type':'ks_ai_explain',
'url': self.env['ir.config_parameter'].sudo().get_param('web.base.url'),
'db_name': self.env.cr.dbname,
'words': words if words else 100
}
ks_response = requests.post(url, data=json_data)
if ks_response.status_code == 200 and json.loads(ks_response.text):
ks_ai_response = json.loads(ks_response.text)
item = ks_ai_response[0]
if item['analysis'] and item['insights']:
try:
self.env['ks_dashboard_ninja.item'].browse(item['id']).write({
'ks_ai_analysis': item['analysis']+'ks_gap'+item['insights']
})
result.append(True)
except:
result
else:
result
else:
result
else:
raise ValidationError(_("Please put API key and URL"))
if len(result):
self.env['ks_dashboard_ninja.board'].browse(dashboard_id).write({
'ks_ai_explain_dash': True
})
return True
else:
raise ValidationError(_("AI Responds with the wrong analysis. Please try again "))
elif ks_rest_items:
self.env['ks_dashboard_ninja.board'].browse(dashboard_id).write({
'ks_ai_explain_dash': True
})
return True
else:
return False
@api.model
def ks_switch_default_dashboard(self,dashboard_id):
self.env['ks_dashboard_ninja.board'].browse(dashboard_id).write({
'ks_ai_explain_dash':False
})
return True
@api.model
def ks_generatetext_to_speech(self,item_id):
if (item_id):
try:
ks_text = self.env['ks_dashboard_ninja.item'].browse(item_id).ks_ai_analysis
if ks_text:
language = 'en'
ks_myobj = gTTS(text=ks_text, lang=language, slow=False)
ks_file = ks_myobj.save('ks_audio.mp3')
with open('ks_audio.mp3', 'rb') as audio_file:
binary_data = audio_file.read()
wav_file = base64.b64encode( binary_data).decode('UTF-8')
data = {"snd": wav_file}
return json.dumps(data)
else:
return False
except Exception as e:
print(e)
raise ValidationError(_("Some problem in audio generation."))
else:
return False
@@ -71,10 +71,7 @@ class KsAIDashboardninja(models.TransientModel):
if (ks_result == "success"):
return {
'type': 'ir.actions.client',
'name': "Dashboard Ninja",
'res_model': 'ks_dashboard_ninja.board',
'params': {'ks_dashboard_id': ks_dash_id},
'tag': 'ks_dashboard_ninja',
'tag': 'reload',
}
else:
self.env['ks_dashboard_ninja.board'].browse(ks_dash_id).unlink()
@@ -15,7 +15,5 @@ class KsDashboardNinjaBoardItemAction(models.Model):
company_id = fields.Many2one('res.company', required=True, default=lambda self: self.env.company)
def set_grid_stack_config(self, dashboard_id, gridstack_config):
return self.search([('ks_dashboard_ninja_id', '=', dashboard_id)]).sudo().write({'ks_gridstack_config': gridstack_config})
def write(self,vals):
return super(KsDashboardNinjaBoardItemAction, self).write(vals)
+32 -30
View File
@@ -11,18 +11,6 @@ from odoo.tools.safe_eval import safe_eval
import locale
from dateutil.parser import parse
def calculate_time(func):
import time
"""
计算函数执行时间的装饰器
"""
def wrapper(*args, **kwargs):
start_time = time.time() # 记录开始时间
result = func(*args, **kwargs) # 执行函数
end_time = time.time() # 记录结束时间
print(f"{func.__name__} 函数执行时间: {end_time - start_time} 秒")
return result
return wrapper
class KsDashboardNinjaBoard(models.Model):
_name = 'ks_dashboard_ninja.board'
@@ -113,7 +101,7 @@ class KsDashboardNinjaBoard(models.Model):
multi_layouts = fields.Boolean(string='Enable Multi-Dashboard Layouts',
help='Allow user to have multiple layouts of the same Dashboard')
ks_ai_explain_dash = fields.Boolean(default=False);
@api.constrains('ks_dashboard_start_date', 'ks_dashboard_end_date')
def ks_date_validation(self):
for rec in self:
@@ -229,7 +217,6 @@ class KsDashboardNinjaBoard(models.Model):
return default_grid_id
@api.model
@calculate_time
def ks_fetch_dashboard_data(self, ks_dashboard_id, ks_item_domain=False):
"""
Return Dictionary of Dashboard Data.
@@ -252,7 +239,7 @@ class KsDashboardNinjaBoard(models.Model):
dashboard_data = {
'name': ks_dashboard_rec.name,
'multi_layouts': ks_dashboard_rec.multi_layouts,
'ks_company_id': self.env.company.id,
'ks_company_id': self._context.get('allowed_company_ids')[0],
'ks_dashboard_manager': has_group_ks_dashboard_manager,
'ks_dashboard_list': self.search_read([], ['id', 'name']),
'ks_dashboard_start_date': self._context.get('ksDateFilterStartDate', False) or self.browse(
@@ -275,6 +262,7 @@ class KsDashboardNinjaBoard(models.Model):
ks_dashboard_rec.ks_dashboard_items_ids.read(
['ks_model_name', 'ks_model_name_2'])]),
'ks_model_item_relation': {},
'ks_ai_explain_dash':ks_dashboard_rec.ks_ai_explain_dash
}
default_grid_id = ks_dashboard_rec.ks_get_grid_config()
@@ -310,7 +298,6 @@ class KsDashboardNinjaBoard(models.Model):
return dashboard_data
@api.model
@calculate_time
def ks_fetch_item(self, item_list, ks_dashboard_id, params={}):
"""
:rtype: object
@@ -345,6 +332,17 @@ class KsDashboardNinjaBoard(models.Model):
action = {}
item_domain1 = params.get('ks_domain_1', [])
item_domain2 = params.get('ks_domain_2', [])
ks_action_name = []
if rec.ks_action_lines:
for res in rec.ks_action_lines:
my_dict = {}
my_dict['id'] = res.id
my_dict['name'] = res.ks_action_item_name
my_dict['sequence'] = res.sequence
ks_action_name.append(my_dict)
ks_action_name.sort(key=lambda r: r['sequence'])
if rec.ks_actions:
context = {}
try:
@@ -408,6 +406,8 @@ class KsDashboardNinjaBoard(models.Model):
'ks_background_color': rec.ks_background_color,
'ks_font_color': rec.ks_font_color,
'ks_header_bg_color': rec.ks_header_bg_color,
# 'ks_domain': rec.ks_domain.replace('"%UID"', str(
# self.env.user.id)) if rec.ks_domain and "%UID" in rec.ks_domain else rec.ks_domain,
'ks_domain': rec.ks_convert_into_proper_domain(rec.ks_domain, rec, item_domain1),
'ks_dashboard_id': rec.ks_dashboard_ninja_board_id.id,
'ks_icon': rec.ks_icon,
@@ -463,6 +463,7 @@ class KsDashboardNinjaBoard(models.Model):
'ks_radial_legend': rec.ks_radial_legend,
'ks_data_calculation_type': rec.ks_data_calculation_type,
'ks_export_all_records': rec.ks_export_all_records,
'ks_data_format': rec.ks_data_format,
'ks_data_formatting': rec.ks_data_format,
'ks_is_client_action': rec.ks_is_client_action,
'ks_pagination_limit': rec.ks_pagination_limit,
@@ -484,16 +485,17 @@ class KsDashboardNinjaBoard(models.Model):
'ks_info': rec.ks_info,
'ks_company': rec.ks_company_id.name if rec.ks_company_id else False,
'ks_scatter_measure_x_id': rec.ks_scatter_measure_x_id,
'ks_scatter_measure_y_id': rec.ks_scatter_measure_y_id,
# 'ks_scatter_measure_y_id': rec.ks_scatter_measure_y_id,
'ks_is_scatter_group': rec.ks_is_scatter_group,
'ks_radial_item_color': rec.ks_radial_item_color,
'ks_flower_item_color': rec.ks_flower_item_color,
'ks_bounds': rec.ks_bounds,
'ks_partners_map': rec.ks_partners_map,
'ks_funnel_record_field':rec.ks_funnel_record_field,
'ks_map_record_field':rec.ks_map_record_field,
'ks_funnel_item_color':rec.ks_funnel_item_color,
'ks_country_id':rec.ks_country_id.id
'ks_country_id':rec.ks_country_id.id,
'ks_action_name':ks_action_name if ks_action_name else False,
'ks_ai_analysis':rec.ks_ai_analysis
# 'ks_last_index':ks_last_index
# 'ks_id_name':','.join(ks_id_name)
}
return item
@@ -641,6 +643,7 @@ class KsDashboardNinjaBoard(models.Model):
'ks_sort_by_order': res.ks_sort_by_order,
'ks_record_limit': res.ks_record_limit,
'sequence': res.sequence,
'ks_action_item_name': res.ks_action_item_name
}
ks_action_lines.append(action_line)
ks_multiplier_lines = []
@@ -772,12 +775,11 @@ class KsDashboardNinjaBoard(models.Model):
'ks_data_label_type': rec.ks_data_label_type,
'ks_as_of_now': rec.ks_as_of_now,
'ks_scatter_measure_x_id': rec.ks_chart_relation_groupby.name,
'ks_scatter_measure_y_id': ks_chart_measure_field,
# 'ks_scatter_measure_y_id': ks_chart_measure_field,
'ks_is_scatter_group': rec.ks_is_scatter_group,
'ks_country_id': rec.ks_country_id.id,
'ks_bounds': rec.ks_bounds,
'ks_partners_map': rec.ks_partners_map,
'ks_funnel_item_color':rec.ks_funnel_item_color,
}
if grid_corners:
@@ -1189,12 +1191,12 @@ class KsDashboardNinjaBoard(models.Model):
else:
item['ks_chart_relation_sub_groupby'] = False
if item['ks_dashboard_item_type'] == "ks_scatter_chart" and item['ks_scatter_measure_y_id'] and item[
if item['ks_dashboard_item_type'] == "ks_scatter_chart" and item[
'ks_scatter_measure_x_id']:
ks_scatter_id = self.env['ir.model.fields'].search(
[('name', '=', item['ks_scatter_measure_y_id'][0]), ('model', '=', item['ks_model_id'])])
if ks_scatter_id:
item['ks_scatter_measure_y_id'] = ks_scatter_id.id
# ks_scatter_id = self.env['ir.model.fields'].search(
# [('name', '=', item['ks_scatter_measure_y_id'][0]), ('model', '=', item['ks_model_id'])])
# if ks_scatter_id:
# item['ks_scatter_measure_y_id'] = ks_scatter_id.id
ks_scatter_group_by = item['ks_scatter_measure_x_id']
ks_record_id = self.env['ir.model.fields'].search(
[('name', '=', ks_scatter_group_by), ('model', '=', item['ks_model_id'])])
@@ -1204,7 +1206,7 @@ class KsDashboardNinjaBoard(models.Model):
item['ks_scatter_measure_x_id'] = False
if item["ks_dashboard_item_type"] != "ks_scatter_chart":
item['ks_scatter_measure_x_id'] = False
item['ks_scatter_measure_y_id'] = False
# item['ks_scatter_measure_y_id'] = False
# Sort by field : Many2one Entery
if item['ks_sort_by_field']:
@@ -1380,7 +1382,7 @@ class KsDashboardNinjaBoard(models.Model):
'model': rec.ks_model_id.model,
'model_name': rec.ks_model_id.name,
'field_name': rec.ks_domain_field_id.name,
'field_type': rec.ks_domain_field_id.ttype,
'type': rec.ks_domain_field_id.ttype,
'special_data': {}
}
if rec.ks_domain_field_id.ttype == 'selection':
File diff suppressed because it is too large Load Diff
+80 -42
View File
@@ -19,55 +19,93 @@ class KsDashboardNinjaItems(models.Model):
ks_to_do_data = rec._ksGetToDOData()
rec.ks_to_do_data = ks_to_do_data
def getToDoData(self):
return self._ksGetToDOData()
def _ksGetToDOData(self):
""" @return
ks_to_do_data = {
"items":[
{"item_id": item_id1, "label": label1, "lines": [{"id": id1, "content": content1, "active": active},{"id": id2, "content": content1, "active": active}] ,
{"item_id": item_id2,"label": label2,"lines": [{"id": id3, "content": content2, "active": active},...],
]
'label': [],
'ks_link': [],
'ks_href_id': [],
'ks_section_id': [],
'ks_content': {},
'ks_content_record_id': {},
'ks_content_active': {}
}
"""
if self.ks_dn_header_lines:
for ks_dn_header_line in self.ks_dn_header_lines:
ks_to_do_header_label = ks_dn_header_line.ks_to_do_header[:]
ks_to_do_data['label'].append(ks_to_do_header_label)
ks_dn_header_line_id = str(ks_dn_header_line.id)
if type(ks_dn_header_line.id).__name__ != 'int' and ks_dn_header_line.id.ref != None:
ks_dn_header_line_id = ks_dn_header_line.id.ref
if ' ' in ks_dn_header_line.ks_to_do_header:
ks_temp = ks_dn_header_line.ks_to_do_header.replace(" ", "")
ks_to_do_data['ks_link'].append('#' + ks_temp + ks_dn_header_line_id)
ks_to_do_data['ks_href_id'].append(ks_temp + str(ks_dn_header_line.id))
if not self.ks_dn_header_lines:
return False
ks_to_do_data = {
'items': [],
}
items = []
for record in self.ks_dn_header_lines:
lines = []
for line in record.ks_to_do_description_lines:
if isinstance(line.id, int):
line_id = line.id
elif ks_dn_header_line.ks_to_do_header[0].isdigit():
ks_temp = ks_dn_header_line.ks_to_do_header.replace(
ks_dn_header_line.ks_to_do_header[0], 'z')
ks_to_do_data['ks_link'].append('#' + ks_temp + ks_dn_header_line_id)
ks_to_do_data['ks_href_id'].append(ks_temp + str(ks_dn_header_line.id))
else:
try:
line_id = line.ids[0]
except IndexError:
line_id = 0
lines.append({
"id": line_id,
"ks_description": line.ks_description,
"ks_active": line.ks_active
})
if isinstance(record.id, int):
record_id = record.id
ks_to_do_data['ks_link'].append('#' + ks_dn_header_line.ks_to_do_header + ks_dn_header_line_id)
ks_to_do_data['ks_href_id'].append(ks_dn_header_line.ks_to_do_header + str(ks_dn_header_line.id))
ks_to_do_data['ks_section_id'].append(str(ks_dn_header_line.id))
if len(ks_dn_header_line.ks_to_do_description_lines):
for ks_to_do_description_line in ks_dn_header_line.ks_to_do_description_lines:
if ' ' in ks_dn_header_line.ks_to_do_header or ks_dn_header_line.ks_to_do_header[0].isdigit():
if ks_to_do_data['ks_content'].get(ks_temp +
str(ks_dn_header_line.id), False):
ks_to_do_data['ks_content'][ks_temp +
str(ks_dn_header_line.id)].append(
ks_to_do_description_line.ks_description)
ks_to_do_data['ks_content_record_id'][ks_temp +
str(ks_dn_header_line.id)].append(
str(ks_to_do_description_line.id))
ks_to_do_data['ks_content_active'][ks_temp +
str(ks_dn_header_line.id)].append(
str(ks_to_do_description_line.ks_active))
else:
try:
record_id = record.ids[0]
except IndexError:
record_id = 0
items.append({
"item_id": record_id,
"label": record.ks_to_do_header,
"lines": lines
})
ks_to_do_data['items'] = items
return json.dumps(ks_to_do_data)
ks_to_do_data['ks_content'][ks_temp +
str(ks_dn_header_line.id)] = [
ks_to_do_description_line.ks_description]
ks_to_do_data['ks_content_record_id'][ks_temp +
str(ks_dn_header_line.id)] = [
str(ks_to_do_description_line.id)]
ks_to_do_data['ks_content_active'][ks_temp +
str(ks_dn_header_line.id)] = [
str(ks_to_do_description_line.ks_active)]
else:
if ks_to_do_data['ks_content'].get(ks_dn_header_line.ks_to_do_header +
str(ks_dn_header_line.id), False):
ks_to_do_data['ks_content'][ks_dn_header_line.ks_to_do_header +
str(ks_dn_header_line.id)].append(
ks_to_do_description_line.ks_description)
ks_to_do_data['ks_content_record_id'][ks_dn_header_line.ks_to_do_header +
str(ks_dn_header_line.id)].append(
str(ks_to_do_description_line.id))
ks_to_do_data['ks_content_active'][ks_dn_header_line.ks_to_do_header +
str(ks_dn_header_line.id)].append(
str(ks_to_do_description_line.ks_active))
else:
ks_to_do_data['ks_content'][ks_dn_header_line.ks_to_do_header +
str(ks_dn_header_line.id)] = [
ks_to_do_description_line.ks_description]
ks_to_do_data['ks_content_record_id'][ks_dn_header_line.ks_to_do_header +
str(ks_dn_header_line.id)] = [
str(ks_to_do_description_line.id)]
ks_to_do_data['ks_content_active'][ks_dn_header_line.ks_to_do_header +
str(ks_dn_header_line.id)] = [
str(ks_to_do_description_line.ks_active)]
ks_to_do_data = json.dumps(ks_to_do_data)
else:
ks_to_do_data = False
return ks_to_do_data
class KsToDoheaders(models.Model):
+3 -3
View File
@@ -11,7 +11,7 @@ class ResConfig(models.TransientModel):
url = fields.Char(string="URL", store=True,
config_parameter="ks_dashboard_ninja.url")
ks_email_id = fields.Char(string="Email ID",store=True,config_parameter="ks_dashboard_ninja.ks_email_id")
ks_analysis_word_length = fields.Selection([("50","50 words"),("100","100 words"),("150","150 words"),("200","200 words"),],default ="100", string="AI Analysis length", store=True,config_parameter="ks_dashboard_ninja.ks_analysis_word_length")
def Open_wizard(self):
if self.url and self.ks_email_id:
try:
@@ -41,10 +41,10 @@ class ResConfig(models.TransientModel):
elif ks_ai_response == 'key already generated':
raise ValidationError(
_("key already generated.If you need assistance, feel free to contact at sales@ksolves.com"))
else:
raise ValidationError(_("Some problem in sending request. If you need assistance, feel free to contact at sales@ksolves.com"))
else:
raise ValidationError(_("Either you have entered wrong URL path or there is some problem in sending request. If you need assistance, feel free to contact at sales@ksolves.com"))
else:
raise ValidationError(_("Some problem in sending request.Please contact at sales@ksolves.com"))
else:
raise ValidationError(_("Please enter URL and Email ID"))
+3 -1
View File
@@ -1,2 +1,4 @@
pandas==2.0.3
xlrd==1.2.0
xlrd==2.0.1
openpyxl == 3.1.2
gTTS == 2.5.1
+27 -27
View File
@@ -1,35 +1,35 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_ks_dashboard_ninja_board,ks_dashboard_ninja.board,model_ks_dashboard_ninja_board,,1,1,1,1
access_ks_dashboard_ninja_kpi_mail,ks_dashboard_ninja.kpi_mail,model_ks_dashboard_ninja_kpi_mail,,1,1,1,1
access_ks_dashboard_ninja_item,ks_dashboard_ninja.item,model_ks_dashboard_ninja_item,,1,1,1,1
access_ks_to_do_headers,ks_to.do.headers,model_ks_to_do_headers,,1,1,1,1
access_ks_to_do_description,ks_to.do.description,model_ks_to_do_description,,1,1,1,1
access_ks_dashboard_ninja_child_board,ks_dashboard_ninja.child_board,model_ks_dashboard_ninja_child_board,,1,1,1,1
access_ks_dashboard_ninja_board_defined_filters,ks_dashboard_ninja.board_defined_filters,model_ks_dashboard_ninja_board_defined_filters,,1,1,1,1
access_ks_dashboard_ninja_board_custom_filters,ks_dashboard_ninja.board_custom_filters,model_ks_dashboard_ninja_board_custom_filters,,1,1,1,1
access_ks_dashboard_ninja_board,ks_dashboard_ninja.board,model_ks_dashboard_ninja_board,base.group_user,1,1,1,1
access_ks_dashboard_ninja_kpi_mail,ks_dashboard_ninja.kpi_mail,model_ks_dashboard_ninja_kpi_mail,base.group_user,1,1,1,1
access_ks_dashboard_ninja_item,ks_dashboard_ninja.item,model_ks_dashboard_ninja_item,base.group_user,1,1,1,1
access_ks_to_do_headers,ks_to.do.headers,model_ks_to_do_headers,base.group_user,1,1,1,1
access_ks_to_do_description,ks_to.do.description,model_ks_to_do_description,base.group_user,1,1,1,1
access_ks_dashboard_ninja_child_board,ks_dashboard_ninja.child_board,model_ks_dashboard_ninja_child_board,base.group_user,1,1,1,1
access_ks_dashboard_ninja_board_defined_filters,ks_dashboard_ninja.board_defined_filters,model_ks_dashboard_ninja_board_defined_filters,base.group_user,1,1,1,1
access_ks_dashboard_ninja_board_custom_filters,ks_dashboard_ninja.board_custom_filters,model_ks_dashboard_ninja_board_custom_filters,base.group_user,1,1,1,1
access_ks_dashboard_ninja_board_template,ks_dashboard_ninja.board_template,model_ks_dashboard_ninja_board_template,,1,1,1,1
access_ks_dashboard_ninja_item_goal,ks_dashboard_ninja_item_goal,model_ks_dashboard_ninja_item_goal,,1,1,1,1
access_ks_dashboard_ninja_item_action,ks_dashboard_ninja_item_action,model_ks_dashboard_ninja_item_action,,1,1,1,1
access_ks_dashboard_item_multiplier,ks_dashboard_item.multiplier,model_ks_dashboard_item_multiplier,,1,1,1,1
access_ks_ninja_dashboard_item_action,ks_ninja_dashboard.item_action,model_ks_ninja_dashboard_item_action,,1,1,1,0
access_ks_dashboard_group_by,ks.dashboard.group.by,model_ks_dashboard_group_by,,1,1,1,1
access_ks_dashboard_csv_group_by,ks.dashboard.csv.group.by,model_ks_dashboard_csv_group_by,,1,1,1,1
access_ks_dashboard_new,ks.dashboard.new,model_ks_dashboard_new,,1,1,1,1
access_ks_dashboard_csv_new,ks.dashboard.csv.new,model_ks_dashboard_csv_new,,1,1,1,1
access_ks_dashboard_ninja_board_template,ks_dashboard_ninja.board_template,model_ks_dashboard_ninja_board_template,base.group_user,1,1,1,1
access_ks_dashboard_ninja_item_goal,ks_dashboard_ninja_item_goal,model_ks_dashboard_ninja_item_goal,base.group_user,1,1,1,1
access_ks_dashboard_ninja_item_action,ks_dashboard_ninja_item_action,model_ks_dashboard_ninja_item_action,base.group_user,1,1,1,1
access_ks_dashboard_item_multiplier,ks_dashboard_item.multiplier,model_ks_dashboard_item_multiplier,base.group_user,1,1,1,1
access_ks_ninja_dashboard_item_action,ks_ninja_dashboard.item_action,model_ks_ninja_dashboard_item_action,base.group_user,1,1,1,0
access_ks_dashboard_group_by,ks.dashboard.group.by,model_ks_dashboard_group_by,base.group_user,1,1,1,1
access_ks_dashboard_csv_group_by,ks.dashboard.csv.group.by,model_ks_dashboard_csv_group_by,base.group_user,1,1,1,1
access_ks_dashboard_new,ks.dashboard.new,model_ks_dashboard_new,base.group_user,1,1,1,1
access_ks_dashboard_csv_new,ks.dashboard.csv.new,model_ks_dashboard_csv_new,base.group_user,1,1,1,1
access_ks_dashboard_ninja_import,ks_dashboard_ninja.import,model_ks_dashboard_ninja_import,base.group_system,1,1,1,0
access_ir_actions_act_window_view,ir.actions.act_window.view,base.model_ir_actions_act_window_view,,1,0,0,0
access_ir_actions_act_window,ir.actions.act_window,base.model_ir_actions_act_window,,1,0,0,0
access_ir_actions_client,ir.actions.client,base.model_ir_actions_client,,1,0,0,0
access_ir_ui_menu,ir.ui.menu,base.model_ir_ui_menu,,1,1,0,0
access_ir_actions_act_window_view,ir.actions.act_window.view,base.model_ir_actions_act_window_view,base.group_user,1,0,0,0
access_ir_actions_act_window,ir.actions.act_window,base.model_ir_actions_act_window,base.group_user,1,0,0,0
access_ir_actions_client,ir.actions.client,base.model_ir_actions_client,base.group_user,1,0,0,0
access_ir_ui_menu,ir.ui.menu,base.model_ir_ui_menu,base.group_user,1,1,0,0
access_ir_model_group_user,ir.model,base.model_ir_model,base.group_user,1,0,0,0
access_ir_model_fields_group_user,ir.model.fields,base.model_ir_model_fields,base.group_user,1,0,0,0
access_ir_model_ks_dashboard_wizard,ks_dashboard_wizard,model_ks_dashboard_wizard,,1,1,1,1
access_ir_model_ks_duplicate_dashboard_wizard,ks_duplicate_dashboard__wizard,model_ks_dashboard_duplicate_wizard,,1,1,1,1
access_ir_model_ks_delete_dashboard_wizard,ks_delete_dashboard__wizard,model_ks_dashboard_delete_wizard,,1,1,1,1
access_ks_dashboard_ninja_arti_int,ks_dashboard_ninja.arti_int,model_ks_dashboard_ninja_arti_int,,1,1,1,1
access_ks_dashboard_ninja_ai_dashboard,ks_dashboard_ninja.ai_dashboard,model_ks_dashboard_ninja_ai_dashboard,,1,1,1,1
access_ks_dashboard_ninja_fetch_key,ks_dashboard_ninja.fetch_key,model_ks_dashboard_ninja_fetch_key,,1,1,1,1
access_ir_model_ks_dashboard_wizard,ks_dashboard_wizard,model_ks_dashboard_wizard,base.group_user,1,1,1,1
access_ir_model_ks_duplicate_dashboard_wizard,ks_duplicate_dashboard__wizard,model_ks_dashboard_duplicate_wizard,base.group_user,1,1,1,1
access_ir_model_ks_delete_dashboard_wizard,ks_delete_dashboard__wizard,model_ks_dashboard_delete_wizard,base.group_user,1,1,1,1
access_ks_dashboard_ninja_arti_int,ks_dashboard_ninja.arti_int,model_ks_dashboard_ninja_arti_int,base.group_user,1,1,1,1
access_ks_dashboard_ninja_ai_dashboard,ks_dashboard_ninja.ai_dashboard,model_ks_dashboard_ninja_ai_dashboard,base.group_user,1,1,1,1
access_ks_dashboard_ninja_fetch_key,ks_dashboard_ninja.fetch_key,model_ks_dashboard_ninja_fetch_key,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_ks_dashboard_ninja_board ks_dashboard_ninja.board model_ks_dashboard_ninja_board base.group_user 1 1 1 1
3 access_ks_dashboard_ninja_kpi_mail ks_dashboard_ninja.kpi_mail model_ks_dashboard_ninja_kpi_mail base.group_user 1 1 1 1
4 access_ks_dashboard_ninja_item ks_dashboard_ninja.item model_ks_dashboard_ninja_item base.group_user 1 1 1 1
5 access_ks_to_do_headers ks_to.do.headers model_ks_to_do_headers base.group_user 1 1 1 1
6 access_ks_to_do_description ks_to.do.description model_ks_to_do_description base.group_user 1 1 1 1
7 access_ks_dashboard_ninja_child_board ks_dashboard_ninja.child_board model_ks_dashboard_ninja_child_board base.group_user 1 1 1 1
8 access_ks_dashboard_ninja_board_defined_filters ks_dashboard_ninja.board_defined_filters model_ks_dashboard_ninja_board_defined_filters base.group_user 1 1 1 1
9 access_ks_dashboard_ninja_board_custom_filters ks_dashboard_ninja.board_custom_filters model_ks_dashboard_ninja_board_custom_filters base.group_user 1 1 1 1
10 access_ks_dashboard_ninja_board_template ks_dashboard_ninja.board_template model_ks_dashboard_ninja_board_template base.group_user 1 1 1 1
11 access_ks_dashboard_ninja_item_goal ks_dashboard_ninja_item_goal model_ks_dashboard_ninja_item_goal base.group_user 1 1 1 1
12 access_ks_dashboard_ninja_item_action ks_dashboard_ninja_item_action model_ks_dashboard_ninja_item_action base.group_user 1 1 1 1
13 access_ks_dashboard_item_multiplier ks_dashboard_item.multiplier model_ks_dashboard_item_multiplier base.group_user 1 1 1 1
14 access_ks_ninja_dashboard_item_action ks_ninja_dashboard.item_action model_ks_ninja_dashboard_item_action base.group_user 1 1 1 0
15 access_ks_dashboard_group_by ks.dashboard.group.by model_ks_dashboard_group_by base.group_user 1 1 1 1
16 access_ks_dashboard_csv_group_by ks.dashboard.csv.group.by model_ks_dashboard_csv_group_by base.group_user 1 1 1 1
17 access_ks_dashboard_new ks.dashboard.new model_ks_dashboard_new base.group_user 1 1 1 1
18 access_ks_dashboard_csv_new ks.dashboard.csv.new model_ks_dashboard_csv_new base.group_user 1 1 1 1
19 access_ks_dashboard_ninja_import ks_dashboard_ninja.import model_ks_dashboard_ninja_import base.group_system 1 1 1 0
20 access_ir_actions_act_window_view ir.actions.act_window.view base.model_ir_actions_act_window_view base.group_user 1 0 0 0
21 access_ir_actions_act_window ir.actions.act_window base.model_ir_actions_act_window base.group_user 1 0 0 0
22 access_ir_actions_client ir.actions.client base.model_ir_actions_client base.group_user 1 0 0 0
23 access_ir_ui_menu ir.ui.menu base.model_ir_ui_menu base.group_user 1 1 0 0
24 access_ir_model_group_user ir.model base.model_ir_model base.group_user 1 0 0 0
25 access_ir_model_fields_group_user ir.model.fields base.model_ir_model_fields base.group_user 1 0 0 0
26 access_ir_model_ks_dashboard_wizard ks_dashboard_wizard model_ks_dashboard_wizard base.group_user 1 1 1 1
27 access_ir_model_ks_duplicate_dashboard_wizard ks_duplicate_dashboard__wizard model_ks_dashboard_duplicate_wizard base.group_user 1 1 1 1
28 access_ir_model_ks_delete_dashboard_wizard ks_delete_dashboard__wizard model_ks_dashboard_delete_wizard base.group_user 1 1 1 1
29 access_ks_dashboard_ninja_arti_int ks_dashboard_ninja.arti_int model_ks_dashboard_ninja_arti_int base.group_user 1 1 1 1
30 access_ks_dashboard_ninja_ai_dashboard ks_dashboard_ninja.ai_dashboard model_ks_dashboard_ninja_ai_dashboard base.group_user 1 1 1 1
31 access_ks_dashboard_ninja_fetch_key ks_dashboard_ninja.fetch_key model_ks_dashboard_ninja_fetch_key base.group_user 1 1 1 1
32
33
34
35
Binary file not shown.

After

Width:  |  Height:  |  Size: 36 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 MiB

File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -0,0 +1,5 @@
<svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.50016 15.1654C12.1821 15.1654 15.1668 12.1806 15.1668 8.4987C15.1668 4.8168 12.1821 1.83203 8.50016 1.83203C4.81826 1.83203 1.8335 4.8168 1.8335 8.4987C1.8335 12.1806 4.81826 15.1654 8.50016 15.1654Z" stroke="#1C1C1C" stroke-width="1.5"/>
<path d="M8.5 11.832V7.83203" stroke="#1C1C1C" stroke-width="1.5" stroke-linecap="round"/>
<path d="M8.50016 5.16667C8.86835 5.16667 9.16683 5.46514 9.16683 5.83333C9.16683 6.20152 8.86835 6.5 8.50016 6.5C8.13197 6.5 7.8335 6.20152 7.8335 5.83333C7.8335 5.46514 8.13197 5.16667 8.50016 5.16667Z" fill="#1C1C1C"/>
</svg>

After

Width:  |  Height:  |  Size: 667 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 855 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

@@ -0,0 +1,6 @@
<svg width="40" height="41" viewBox="0 0 40 41" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20 30.1774C21.914 30.1774 23.785 29.6098 25.3765 28.5465C26.9679 27.4831 28.2083 25.9717 28.9408 24.2034C29.6732 22.4351 29.8649 20.4893 29.4915 18.612C29.118 16.7348 28.1964 15.0104 26.843 13.657C25.4895 12.3036 23.7652 11.3819 21.888 11.0085C20.0107 10.6351 18.0649 10.8268 16.2966 11.5592C14.5283 12.2917 13.0169 13.5321 11.9535 15.1235C10.8901 16.715 10.3226 18.586 10.3226 20.5C10.3226 23.0666 11.3422 25.5281 13.157 27.343C14.9719 29.1578 17.4334 30.1774 20 30.1774ZM20 14.6935C21.1484 14.6935 22.271 15.0341 23.2259 15.6721C24.1807 16.3101 24.925 17.217 25.3644 18.278C25.8039 19.339 25.9189 20.5064 25.6949 21.6328C25.4708 22.7591 24.9178 23.7937 24.1058 24.6058C23.2937 25.4178 22.2591 25.9708 21.1328 26.1949C20.0064 26.4189 18.8389 26.3039 17.778 25.8645C16.717 25.425 15.8101 24.6808 15.1721 23.7259C14.5341 22.771 14.1935 21.6484 14.1935 20.5C14.1935 18.96 14.8053 17.4831 15.8942 16.3942C16.9831 15.3053 18.46 14.6935 20 14.6935Z" fill="#A05381"/>
<path d="M6.19029 12.4377C6.72476 11.5119 6.40758 10.3282 5.48185 9.79373C4.55613 9.25926 3.3724 9.57644 2.83794 10.5022C2.30347 11.4279 2.62064 12.6116 3.54637 13.1461C4.4721 13.6806 5.65582 13.3634 6.19029 12.4377Z" fill="#A05381"/>
<path d="M11.9335 6.69013C12.8592 6.15566 13.1764 4.97193 12.6419 4.04621C12.1074 3.12048 10.9237 2.8033 9.99799 3.33777C9.07226 3.87224 8.75508 5.05596 9.28955 5.98169C9.82402 6.90742 11.0077 7.22459 11.9335 6.69013Z" fill="#A05381"/>
<path d="M20 0.5H18.0645V4.37097H20C23.19 4.37097 26.3084 5.31692 28.9608 7.0892C31.6132 8.86148 33.6805 11.3805 34.9013 14.3277C36.122 17.2749 36.4415 20.5179 35.8191 23.6466C35.1968 26.7753 33.6606 29.6493 31.4049 31.9049C29.1493 34.1606 26.2753 35.6968 23.1466 36.3191C20.0179 36.9415 16.7749 36.622 13.8277 35.4013C10.8805 34.1805 8.36148 32.1132 6.5892 29.4608C4.81692 26.8084 3.87097 23.69 3.87097 20.5V18.5645H0V20.5C0 24.4556 1.17298 28.3224 3.37061 31.6114C5.56823 34.9004 8.69181 37.4638 12.3463 38.9776C16.0009 40.4913 20.0222 40.8874 23.9018 40.1157C27.7814 39.344 31.3451 37.4392 34.1421 34.6421C36.9392 31.8451 38.844 28.2814 39.6157 24.4018C40.3874 20.5222 39.9913 16.5009 38.4776 12.8463C36.9638 9.19181 34.4004 6.06823 31.1114 3.87061C27.8224 1.67298 23.9556 0.5 20 0.5Z" fill="#A05381"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Some files were not shown because too many files have changed in this diff Show More