pengyuthon wechat
@@ -1,32 +1,29 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
{
|
{
|
||||||
'name': 'Dashboard Ninja',
|
'name': 'Dashboard Ninja with AI',
|
||||||
|
|
||||||
'summary': """
|
'summary': """Dashboard Ninja v17""",
|
||||||
KS Dashboard Ninja
|
|
||||||
""",
|
|
||||||
|
|
||||||
'description': """
|
'description': """Dashboard Ninja v17""",
|
||||||
Dashboard Ninja v17
|
|
||||||
""",
|
|
||||||
|
|
||||||
'author': 'Ksolves India Ltd.',
|
'author': 'Ksolves India Ltd.',
|
||||||
|
|
||||||
'license': 'OPL-1',
|
'license': 'OPL-1',
|
||||||
|
|
||||||
|
|
||||||
'website': 'https://store.ksolves.com/',
|
'website': 'https://store.ksolves.com/',
|
||||||
|
|
||||||
'maintainer': 'Ksolves India Ltd.',
|
'maintainer': 'Ksolves India Ltd.',
|
||||||
|
|
||||||
'category': 'public_pur',
|
'live_test_url': 'https://dashboardninja17.ksolves.net/',
|
||||||
|
|
||||||
|
'category': 'Services',
|
||||||
'version': '17.0.1.8.3',
|
'version': '17.0.1.8.3',
|
||||||
|
|
||||||
'support': 'sales@ksolves.com',
|
'support': 'sales@ksolves.com',
|
||||||
|
|
||||||
'images': ['static/description/Independence_sale.jpg'],
|
'images': ['static/description/Independence_sale.jpg'],
|
||||||
|
|
||||||
'depends': ['base', 'web', 'base_setup', 'bus', 'base_geolocalize'],
|
'depends': ['base', 'web', 'base_setup', 'bus','base_geolocalize'],
|
||||||
|
|
||||||
'data': [
|
'data': [
|
||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
@@ -52,27 +49,83 @@
|
|||||||
'demo': ['demo/ks_dashboard_ninja_demo.xml'],
|
'demo': ['demo/ks_dashboard_ninja_demo.xml'],
|
||||||
|
|
||||||
'assets': {
|
'assets': {
|
||||||
'web.assets_backend':[
|
'ks_dashboard_ninja.ks_dashboard_lib': [
|
||||||
# 'ks_dashboard_ninja/static/lib/css/Chart.css',
|
'/ks_dashboard_ninja/static/lib/css/gridstack.min.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/gridstack-h5.js',
|
'/ks_dashboard_ninja/static/lib/js/pdfmake.min.js',
|
||||||
# 'ks_dashboard_ninja/static/lib/js/Chart.bundle.min.js',
|
'/ks_dashboard_ninja/static/lib/js/vfs_fonts.js',
|
||||||
'ks_dashboard_ninja/static/lib/js/chart.umd.min.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/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/exporting.js',
|
||||||
'ks_dashboard_ninja/static/lib/js/pdfmake.min.js',
|
'ks_dashboard_ninja/static/lib/js/pdfmake.js',
|
||||||
'ks_dashboard_ninja/static/src/css/*',
|
'ks_dashboard_ninja/static/lib/js/percent.js',
|
||||||
'ks_dashboard_ninja/static/src/scss/*',
|
'ks_dashboard_ninja/static/src/js/ks_dashboard_ninja_new.js',
|
||||||
'ks_dashboard_ninja/static/src/dashboard/*',
|
'ks_dashboard_ninja/static/src/js/ks_global_functions.js',
|
||||||
'ks_dashboard_ninja/static/src/items/*',
|
'ks_dashboard_ninja/static/src/js/ks_form_view_dialog.js',
|
||||||
'ks_dashboard_ninja/static/src/items/**/*',
|
'ks_dashboard_ninja/static/lib/js/xy.js',
|
||||||
'ks_dashboard_ninja/static/src/preview/*',
|
'ks_dashboard_ninja/static/lib/js/radar.js',
|
||||||
'ks_dashboard_ninja/static/src/tools/*',
|
'ks_dashboard_ninja/static/src/css/style.css',
|
||||||
# 'ks_dashboard_ninja/static/src/**/**/*',
|
# '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': {
|
'external_dependencies': {
|
||||||
'python': ['pandas','xlrd']
|
'python': ['pandas','xlrd','openpyxl','gTTS']
|
||||||
},
|
},
|
||||||
|
|
||||||
'uninstall_hook': 'uninstall_hook',
|
'uninstall_hook': 'uninstall_hook',
|
||||||
|
|||||||
@@ -6,9 +6,11 @@ from odoo.exceptions import ValidationError
|
|||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import pytz
|
import pytz
|
||||||
import os
|
import os
|
||||||
|
import ast
|
||||||
import os.path
|
import os.path
|
||||||
from dateutil import rrule
|
from dateutil import rrule
|
||||||
from dateutil.relativedelta import relativedelta
|
from dateutil.relativedelta import relativedelta
|
||||||
|
from odoo.tools.safe_eval import safe_eval
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -36,11 +38,10 @@ def ks_get_date(ks_date_filter_selection, self, type):
|
|||||||
series = ks_date_filter_selection
|
series = ks_date_filter_selection
|
||||||
if ks_date_filter_selection in ['t_fiscal_year', 'n_fiscal_year', 'ls_fiscal_year']:
|
if ks_date_filter_selection in ['t_fiscal_year', 'n_fiscal_year', 'ls_fiscal_year']:
|
||||||
function_name = globals()["ks_date_series_" + series.split("_")[0]]
|
function_name = globals()["ks_date_series_" + series.split("_")[0]]
|
||||||
return function_name(series.split("_")[1], timezone, type, self)
|
return function_name(series.split("_")[1], timezone, type,self)
|
||||||
else:
|
else:
|
||||||
function_name = globals()["ks_date_series_" + series.split("_")[0]]
|
function_name = globals()["ks_date_series_" + series.split("_")[0]]
|
||||||
return function_name(series.split("_")[1], timezone, type, self)
|
return function_name(series.split("_")[1],timezone, type,self)
|
||||||
|
|
||||||
|
|
||||||
def ks_date_series_td(ks_date_selection, timezone, type, self=None):
|
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]
|
ks_function_name = globals()["ks_get_date_range_from_td_" + ks_date_selection]
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
from . import ks_chart_export
|
from . import ks_chart_export
|
||||||
from . import ks_list_export
|
from . import ks_list_export
|
||||||
from . import ks_dashboard_export
|
from . import ks_dashboard_export
|
||||||
|
from . import ks_domain_fix
|
||||||
@@ -22,6 +22,10 @@ class KsChartExport(http.Controller):
|
|||||||
params = json.loads(data)
|
params = json.loads(data)
|
||||||
header,chart_data = operator.itemgetter('header','chart_data')(params)
|
header,chart_data = operator.itemgetter('header','chart_data')(params)
|
||||||
chart_data = json.loads(chart_data)
|
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')
|
chart_data['labels'].insert(0,'Measure')
|
||||||
columns_headers = chart_data['labels']
|
columns_headers = chart_data['labels']
|
||||||
import_data = []
|
import_data = []
|
||||||
@@ -37,9 +41,6 @@ class KsChartExport(http.Controller):
|
|||||||
# cookies={'fileToken': token}
|
# cookies={'fileToken': token}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class KsChartExcelExport(KsChartExport, http.Controller):
|
class KsChartExcelExport(KsChartExport, http.Controller):
|
||||||
|
|
||||||
# Excel needs raw data to correctly handle numbers and date values
|
# 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 operator
|
||||||
import logging
|
import logging
|
||||||
from odoo.addons.web.controllers.main import ExportFormat, ExportXlsxWriter
|
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
|
import datetime
|
||||||
from odoo import http
|
from odoo import http
|
||||||
from odoo.http import content_disposition, request
|
from odoo.http import content_disposition, request
|
||||||
|
|||||||
@@ -242,7 +242,7 @@
|
|||||||
<!-- <field name="ks_chart_measure_field" eval="[ref('base.field_res_country__phone_code')]"/>-->
|
<!-- <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_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
|
||||||
<field name="ks_domain">[["id","<",40]]</field>
|
<field name="ks_domain">[["id","<",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_dashboard_item_type">ks_bar_chart</field>
|
||||||
<field name="ks_company_id" eval="0"/>
|
<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_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_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
|
||||||
<field name="ks_domain">[["id","<",10]]</field>
|
<field name="ks_domain">[["id","<",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_dashboard_item_type">ks_line_chart</field>
|
||||||
<field name="ks_company_id" eval="0"/>
|
<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_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_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
|
||||||
<field name="ks_domain">[["id","<",10]]</field>
|
<field name="ks_domain">[["id","<",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_dashboard_item_type">ks_horizontalBar_chart</field>
|
||||||
<field name="ks_company_id" eval="0"/>
|
<field name="ks_company_id" eval="0"/>
|
||||||
</record>
|
</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_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_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
|
||||||
<field name="ks_domain">[["id","<",10]]</field>
|
<field name="ks_domain">[["id","<",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_dashboard_item_type">ks_polarArea_chart</field>
|
||||||
<field name="ks_company_id" eval="0"/>
|
<field name="ks_company_id" eval="0"/>
|
||||||
</record>
|
</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_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_relation_groupby" eval="ref('base.field_res_country__name')"/>
|
||||||
<field name="ks_domain">[["id","<",10]]</field>
|
<field name="ks_domain">[["id","<",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_record_data_limit">100</field>
|
||||||
<field name="ks_show_data_value">1</field>
|
<field name="ks_show_data_value">1</field>
|
||||||
<field name="ks_unit_selection">monetary</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_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_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
|
||||||
<field name="ks_domain">[["id","<",10]]</field>
|
<field name="ks_domain">[["id","<",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_dashboard_item_type">ks_pie_chart</field>
|
||||||
<field name="ks_company_id" eval="0"/>
|
<field name="ks_company_id" eval="0"/>
|
||||||
</record>
|
</record>
|
||||||
@@ -374,7 +374,7 @@
|
|||||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
<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_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_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_dashboard_item_type">ks_area_chart</field>
|
||||||
<field name="ks_company_id" eval="0"/>
|
<field name="ks_company_id" eval="0"/>
|
||||||
</record>
|
</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_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_relation_groupby" eval="ref('base.field_res_country__name')"/>
|
||||||
<field name="ks_semi_circle_chart">1</field>
|
<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_record_data_limit">10</field>
|
||||||
<field name="ks_show_data_value">1</field>
|
<field name="ks_show_data_value">1</field>
|
||||||
<field name="ks_unit_selection">monetary</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_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_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_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_record_data_limit">25</field>
|
||||||
<field name="ks_show_data_value">1</field>
|
<field name="ks_show_data_value">1</field>
|
||||||
<field name="ks_unit_selection">monetary</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_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_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_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_record_data_limit">10</field>
|
||||||
<field name="ks_show_data_value">1</field>
|
<field name="ks_show_data_value">1</field>
|
||||||
<field name="ks_unit_selection">monetary</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_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_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_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_semi_circle_chart">1</field>
|
||||||
<field name="ks_record_data_limit">25</field>
|
<field name="ks_record_data_limit">25</field>
|
||||||
<field name="ks_show_data_value">1</field>
|
<field name="ks_show_data_value">1</field>
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ import logging
|
|||||||
import requests
|
import requests
|
||||||
from odoo import http, api, fields, models, _
|
from odoo import http, api, fields, models, _
|
||||||
from odoo.exceptions import ValidationError
|
from odoo.exceptions import ValidationError
|
||||||
|
from gtts import gTTS
|
||||||
|
import base64
|
||||||
|
import os
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -14,9 +17,9 @@ class KsDashboardNInjaAI(models.TransientModel):
|
|||||||
ks_type = fields.Selection([('ks_model', 'Model'), ('ks_keyword', 'Keywords')],
|
ks_type = fields.Selection([('ks_model', 'Model'), ('ks_keyword', 'Keywords')],
|
||||||
string="Ks AI Type", default='ks_model')
|
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),"
|
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','not ilike','web_editor.%'),('model','not ilike','web_tour.%'),"
|
||||||
"('model','!=','mail.thread'),('model','not ilike','ks_dash%'),('model','not ilike','ks_to%')]",
|
"('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. ")
|
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
|
self.ks_model_show = True
|
||||||
else:
|
else:
|
||||||
self.ks_model_show = False
|
self.ks_model_show = False
|
||||||
else:
|
|
||||||
raise ValidationError(_("Please enter URL and API Key in General Settings"))
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.ks_model_show = False
|
self.ks_model_show = False
|
||||||
|
|
||||||
@@ -88,6 +88,7 @@ class KsDashboardNInjaAI(models.TransientModel):
|
|||||||
if api_key and url:
|
if api_key and url:
|
||||||
json_data = {'name': api_key,
|
json_data = {'name': api_key,
|
||||||
'question':question,
|
'question':question,
|
||||||
|
'type': self.ks_type,
|
||||||
'url': self.env['ir.config_parameter'].sudo().get_param('web.base.url'),
|
'url': self.env['ir.config_parameter'].sudo().get_param('web.base.url'),
|
||||||
'db_name': self.env.cr.dbname
|
'db_name': self.env.cr.dbname
|
||||||
}
|
}
|
||||||
@@ -114,11 +115,11 @@ class KsDashboardNInjaAI(models.TransientModel):
|
|||||||
if (ks_result == "success"):
|
if (ks_result == "success"):
|
||||||
return {
|
return {
|
||||||
'type': 'ir.actions.client',
|
'type': 'ir.actions.client',
|
||||||
'name': context['ks_dash_name'],
|
'name': 'AI Dashboard',
|
||||||
'params': {'ks_dashboard_id': ks_create_record.id},
|
'params': {'ks_dashboard_id': ks_create_record.id},
|
||||||
'tag': 'ks_dashboard_ninja_ai',
|
'tag': 'ks_ai_dashboard_ninja',
|
||||||
'target': 'new',
|
'context': context,
|
||||||
'context': context
|
'target':'new'
|
||||||
}
|
}
|
||||||
else:
|
else:
|
||||||
self.env['ks_dashboard_ninja.board'].browse(ks_dash_id).unlink()
|
self.env['ks_dashboard_ninja.board'].browse(ks_dash_id).unlink()
|
||||||
@@ -212,11 +213,86 @@ class KsDashboardNInjaAI(models.TransientModel):
|
|||||||
else:
|
else:
|
||||||
raise ValidationError(_("Enter the input keywords to render the item"))
|
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"):
|
if (ks_result == "success"):
|
||||||
return {
|
return {
|
||||||
'type': 'ir.actions.client',
|
'type': 'ir.actions.client',
|
||||||
'name': "Dashboard Ninja",
|
'tag': 'reload',
|
||||||
'res_model': 'ks_dashboard_ninja.board',
|
|
||||||
'params': {'ks_dashboard_id': ks_dash_id},
|
|
||||||
'tag': 'ks_dashboard_ninja',
|
|
||||||
}
|
}
|
||||||
else:
|
else:
|
||||||
self.env['ks_dashboard_ninja.board'].browse(ks_dash_id).unlink()
|
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)
|
company_id = fields.Many2one('res.company', required=True, default=lambda self: self.env.company)
|
||||||
|
|
||||||
|
|
||||||
def set_grid_stack_config(self, dashboard_id, gridstack_config):
|
def write(self,vals):
|
||||||
return self.search([('ks_dashboard_ninja_id', '=', dashboard_id)]).sudo().write({'ks_gridstack_config': gridstack_config})
|
return super(KsDashboardNinjaBoardItemAction, self).write(vals)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,18 +11,6 @@ from odoo.tools.safe_eval import safe_eval
|
|||||||
import locale
|
import locale
|
||||||
from dateutil.parser import parse
|
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):
|
class KsDashboardNinjaBoard(models.Model):
|
||||||
_name = 'ks_dashboard_ninja.board'
|
_name = 'ks_dashboard_ninja.board'
|
||||||
@@ -113,7 +101,7 @@ class KsDashboardNinjaBoard(models.Model):
|
|||||||
multi_layouts = fields.Boolean(string='Enable Multi-Dashboard Layouts',
|
multi_layouts = fields.Boolean(string='Enable Multi-Dashboard Layouts',
|
||||||
help='Allow user to have multiple layouts of the same Dashboard')
|
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')
|
@api.constrains('ks_dashboard_start_date', 'ks_dashboard_end_date')
|
||||||
def ks_date_validation(self):
|
def ks_date_validation(self):
|
||||||
for rec in self:
|
for rec in self:
|
||||||
@@ -229,7 +217,6 @@ class KsDashboardNinjaBoard(models.Model):
|
|||||||
return default_grid_id
|
return default_grid_id
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
@calculate_time
|
|
||||||
def ks_fetch_dashboard_data(self, ks_dashboard_id, ks_item_domain=False):
|
def ks_fetch_dashboard_data(self, ks_dashboard_id, ks_item_domain=False):
|
||||||
"""
|
"""
|
||||||
Return Dictionary of Dashboard Data.
|
Return Dictionary of Dashboard Data.
|
||||||
@@ -252,7 +239,7 @@ class KsDashboardNinjaBoard(models.Model):
|
|||||||
dashboard_data = {
|
dashboard_data = {
|
||||||
'name': ks_dashboard_rec.name,
|
'name': ks_dashboard_rec.name,
|
||||||
'multi_layouts': ks_dashboard_rec.multi_layouts,
|
'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_manager': has_group_ks_dashboard_manager,
|
||||||
'ks_dashboard_list': self.search_read([], ['id', 'name']),
|
'ks_dashboard_list': self.search_read([], ['id', 'name']),
|
||||||
'ks_dashboard_start_date': self._context.get('ksDateFilterStartDate', False) or self.browse(
|
'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_dashboard_rec.ks_dashboard_items_ids.read(
|
||||||
['ks_model_name', 'ks_model_name_2'])]),
|
['ks_model_name', 'ks_model_name_2'])]),
|
||||||
'ks_model_item_relation': {},
|
'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()
|
default_grid_id = ks_dashboard_rec.ks_get_grid_config()
|
||||||
@@ -310,7 +298,6 @@ class KsDashboardNinjaBoard(models.Model):
|
|||||||
return dashboard_data
|
return dashboard_data
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
@calculate_time
|
|
||||||
def ks_fetch_item(self, item_list, ks_dashboard_id, params={}):
|
def ks_fetch_item(self, item_list, ks_dashboard_id, params={}):
|
||||||
"""
|
"""
|
||||||
:rtype: object
|
:rtype: object
|
||||||
@@ -345,6 +332,17 @@ class KsDashboardNinjaBoard(models.Model):
|
|||||||
action = {}
|
action = {}
|
||||||
item_domain1 = params.get('ks_domain_1', [])
|
item_domain1 = params.get('ks_domain_1', [])
|
||||||
item_domain2 = params.get('ks_domain_2', [])
|
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:
|
if rec.ks_actions:
|
||||||
context = {}
|
context = {}
|
||||||
try:
|
try:
|
||||||
@@ -408,6 +406,8 @@ class KsDashboardNinjaBoard(models.Model):
|
|||||||
'ks_background_color': rec.ks_background_color,
|
'ks_background_color': rec.ks_background_color,
|
||||||
'ks_font_color': rec.ks_font_color,
|
'ks_font_color': rec.ks_font_color,
|
||||||
'ks_header_bg_color': rec.ks_header_bg_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_domain': rec.ks_convert_into_proper_domain(rec.ks_domain, rec, item_domain1),
|
||||||
'ks_dashboard_id': rec.ks_dashboard_ninja_board_id.id,
|
'ks_dashboard_id': rec.ks_dashboard_ninja_board_id.id,
|
||||||
'ks_icon': rec.ks_icon,
|
'ks_icon': rec.ks_icon,
|
||||||
@@ -463,6 +463,7 @@ class KsDashboardNinjaBoard(models.Model):
|
|||||||
'ks_radial_legend': rec.ks_radial_legend,
|
'ks_radial_legend': rec.ks_radial_legend,
|
||||||
'ks_data_calculation_type': rec.ks_data_calculation_type,
|
'ks_data_calculation_type': rec.ks_data_calculation_type,
|
||||||
'ks_export_all_records': rec.ks_export_all_records,
|
'ks_export_all_records': rec.ks_export_all_records,
|
||||||
|
'ks_data_format': rec.ks_data_format,
|
||||||
'ks_data_formatting': rec.ks_data_format,
|
'ks_data_formatting': rec.ks_data_format,
|
||||||
'ks_is_client_action': rec.ks_is_client_action,
|
'ks_is_client_action': rec.ks_is_client_action,
|
||||||
'ks_pagination_limit': rec.ks_pagination_limit,
|
'ks_pagination_limit': rec.ks_pagination_limit,
|
||||||
@@ -484,16 +485,17 @@ class KsDashboardNinjaBoard(models.Model):
|
|||||||
'ks_info': rec.ks_info,
|
'ks_info': rec.ks_info,
|
||||||
'ks_company': rec.ks_company_id.name if rec.ks_company_id else False,
|
'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_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_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_bounds': rec.ks_bounds,
|
||||||
'ks_partners_map': rec.ks_partners_map,
|
'ks_partners_map': rec.ks_partners_map,
|
||||||
'ks_funnel_record_field':rec.ks_funnel_record_field,
|
'ks_funnel_record_field':rec.ks_funnel_record_field,
|
||||||
'ks_map_record_field':rec.ks_map_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
|
return item
|
||||||
|
|
||||||
@@ -641,6 +643,7 @@ class KsDashboardNinjaBoard(models.Model):
|
|||||||
'ks_sort_by_order': res.ks_sort_by_order,
|
'ks_sort_by_order': res.ks_sort_by_order,
|
||||||
'ks_record_limit': res.ks_record_limit,
|
'ks_record_limit': res.ks_record_limit,
|
||||||
'sequence': res.sequence,
|
'sequence': res.sequence,
|
||||||
|
'ks_action_item_name': res.ks_action_item_name
|
||||||
}
|
}
|
||||||
ks_action_lines.append(action_line)
|
ks_action_lines.append(action_line)
|
||||||
ks_multiplier_lines = []
|
ks_multiplier_lines = []
|
||||||
@@ -772,12 +775,11 @@ class KsDashboardNinjaBoard(models.Model):
|
|||||||
'ks_data_label_type': rec.ks_data_label_type,
|
'ks_data_label_type': rec.ks_data_label_type,
|
||||||
'ks_as_of_now': rec.ks_as_of_now,
|
'ks_as_of_now': rec.ks_as_of_now,
|
||||||
'ks_scatter_measure_x_id': rec.ks_chart_relation_groupby.name,
|
'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_is_scatter_group': rec.ks_is_scatter_group,
|
||||||
'ks_country_id': rec.ks_country_id.id,
|
'ks_country_id': rec.ks_country_id.id,
|
||||||
'ks_bounds': rec.ks_bounds,
|
'ks_bounds': rec.ks_bounds,
|
||||||
'ks_partners_map': rec.ks_partners_map,
|
'ks_partners_map': rec.ks_partners_map,
|
||||||
'ks_funnel_item_color':rec.ks_funnel_item_color,
|
|
||||||
|
|
||||||
}
|
}
|
||||||
if grid_corners:
|
if grid_corners:
|
||||||
@@ -1189,12 +1191,12 @@ class KsDashboardNinjaBoard(models.Model):
|
|||||||
else:
|
else:
|
||||||
item['ks_chart_relation_sub_groupby'] = False
|
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_measure_x_id']:
|
||||||
ks_scatter_id = self.env['ir.model.fields'].search(
|
# ks_scatter_id = self.env['ir.model.fields'].search(
|
||||||
[('name', '=', item['ks_scatter_measure_y_id'][0]), ('model', '=', item['ks_model_id'])])
|
# [('name', '=', item['ks_scatter_measure_y_id'][0]), ('model', '=', item['ks_model_id'])])
|
||||||
if ks_scatter_id:
|
# if ks_scatter_id:
|
||||||
item['ks_scatter_measure_y_id'] = ks_scatter_id.id
|
# item['ks_scatter_measure_y_id'] = ks_scatter_id.id
|
||||||
ks_scatter_group_by = item['ks_scatter_measure_x_id']
|
ks_scatter_group_by = item['ks_scatter_measure_x_id']
|
||||||
ks_record_id = self.env['ir.model.fields'].search(
|
ks_record_id = self.env['ir.model.fields'].search(
|
||||||
[('name', '=', ks_scatter_group_by), ('model', '=', item['ks_model_id'])])
|
[('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
|
item['ks_scatter_measure_x_id'] = False
|
||||||
if item["ks_dashboard_item_type"] != "ks_scatter_chart":
|
if item["ks_dashboard_item_type"] != "ks_scatter_chart":
|
||||||
item['ks_scatter_measure_x_id'] = False
|
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
|
# Sort by field : Many2one Entery
|
||||||
if item['ks_sort_by_field']:
|
if item['ks_sort_by_field']:
|
||||||
@@ -1380,7 +1382,7 @@ class KsDashboardNinjaBoard(models.Model):
|
|||||||
'model': rec.ks_model_id.model,
|
'model': rec.ks_model_id.model,
|
||||||
'model_name': rec.ks_model_id.name,
|
'model_name': rec.ks_model_id.name,
|
||||||
'field_name': rec.ks_domain_field_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': {}
|
'special_data': {}
|
||||||
}
|
}
|
||||||
if rec.ks_domain_field_id.ttype == 'selection':
|
if rec.ks_domain_field_id.ttype == 'selection':
|
||||||
|
|||||||
@@ -19,55 +19,93 @@ class KsDashboardNinjaItems(models.Model):
|
|||||||
ks_to_do_data = rec._ksGetToDOData()
|
ks_to_do_data = rec._ksGetToDOData()
|
||||||
rec.ks_to_do_data = ks_to_do_data
|
rec.ks_to_do_data = ks_to_do_data
|
||||||
|
|
||||||
def getToDoData(self):
|
|
||||||
return self._ksGetToDOData()
|
|
||||||
|
|
||||||
def _ksGetToDOData(self):
|
def _ksGetToDOData(self):
|
||||||
""" @return
|
|
||||||
ks_to_do_data = {
|
ks_to_do_data = {
|
||||||
"items":[
|
'label': [],
|
||||||
{"item_id": item_id1, "label": label1, "lines": [{"id": id1, "content": content1, "active": active},{"id": id2, "content": content1, "active": active}] ,
|
'ks_link': [],
|
||||||
{"item_id": item_id2,"label": label2,"lines": [{"id": id3, "content": content2, "active": active},...],
|
'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:
|
elif ks_dn_header_line.ks_to_do_header[0].isdigit():
|
||||||
return False
|
ks_temp = ks_dn_header_line.ks_to_do_header.replace(
|
||||||
ks_to_do_data = {
|
ks_dn_header_line.ks_to_do_header[0], 'z')
|
||||||
'items': [],
|
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))
|
||||||
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
|
|
||||||
else:
|
else:
|
||||||
try:
|
ks_to_do_data['ks_link'].append('#' + ks_dn_header_line.ks_to_do_header + ks_dn_header_line_id)
|
||||||
line_id = line.ids[0]
|
ks_to_do_data['ks_href_id'].append(ks_dn_header_line.ks_to_do_header + str(ks_dn_header_line.id))
|
||||||
except IndexError:
|
ks_to_do_data['ks_section_id'].append(str(ks_dn_header_line.id))
|
||||||
line_id = 0
|
if len(ks_dn_header_line.ks_to_do_description_lines):
|
||||||
lines.append({
|
for ks_to_do_description_line in ks_dn_header_line.ks_to_do_description_lines:
|
||||||
"id": line_id,
|
if ' ' in ks_dn_header_line.ks_to_do_header or ks_dn_header_line.ks_to_do_header[0].isdigit():
|
||||||
"ks_description": line.ks_description,
|
if ks_to_do_data['ks_content'].get(ks_temp +
|
||||||
"ks_active": line.ks_active
|
str(ks_dn_header_line.id), False):
|
||||||
})
|
|
||||||
if isinstance(record.id, int):
|
ks_to_do_data['ks_content'][ks_temp +
|
||||||
record_id = record.id
|
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:
|
else:
|
||||||
try:
|
ks_to_do_data['ks_content'][ks_temp +
|
||||||
record_id = record.ids[0]
|
str(ks_dn_header_line.id)] = [
|
||||||
except IndexError:
|
ks_to_do_description_line.ks_description]
|
||||||
record_id = 0
|
ks_to_do_data['ks_content_record_id'][ks_temp +
|
||||||
items.append({
|
str(ks_dn_header_line.id)] = [
|
||||||
"item_id": record_id,
|
str(ks_to_do_description_line.id)]
|
||||||
"label": record.ks_to_do_header,
|
ks_to_do_data['ks_content_active'][ks_temp +
|
||||||
"lines": lines
|
str(ks_dn_header_line.id)] = [
|
||||||
})
|
str(ks_to_do_description_line.ks_active)]
|
||||||
ks_to_do_data['items'] = items
|
else:
|
||||||
return json.dumps(ks_to_do_data)
|
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):
|
class KsToDoheaders(models.Model):
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ class ResConfig(models.TransientModel):
|
|||||||
url = fields.Char(string="URL", store=True,
|
url = fields.Char(string="URL", store=True,
|
||||||
config_parameter="ks_dashboard_ninja.url")
|
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_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):
|
def Open_wizard(self):
|
||||||
if self.url and self.ks_email_id:
|
if self.url and self.ks_email_id:
|
||||||
try:
|
try:
|
||||||
@@ -41,10 +41,10 @@ class ResConfig(models.TransientModel):
|
|||||||
elif ks_ai_response == 'key already generated':
|
elif ks_ai_response == 'key already generated':
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("key already generated.If you need assistance, feel free to contact at sales@ksolves.com"))
|
_("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:
|
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"))
|
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:
|
else:
|
||||||
raise ValidationError(_("Please enter URL and Email ID"))
|
raise ValidationError(_("Please enter URL and Email ID"))
|
||||||
|
|
||||||
|
|||||||
@@ -1,2 +1,4 @@
|
|||||||
pandas==2.0.3
|
pandas==2.0.3
|
||||||
xlrd==1.2.0
|
xlrd==2.0.1
|
||||||
|
openpyxl == 3.1.2
|
||||||
|
gTTS == 2.5.1
|
||||||
@@ -1,35 +1,35 @@
|
|||||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
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_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,,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,,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,,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,,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,,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,,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,,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_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,,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,,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,,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,,1,1,1,0
|
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,,1,1,1,1
|
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,,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,,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,,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_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_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,,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,,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,,1,1,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_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_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_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,,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,,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,,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,,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,,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
|
||||||
|
|
After Width: | Height: | Size: 36 MiB |
|
After Width: | Height: | Size: 28 MiB |
|
After Width: | Height: | Size: 424 KiB |
|
After Width: | Height: | Size: 324 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 358 KiB |
|
After Width: | Height: | Size: 190 KiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 157 KiB |
|
After Width: | Height: | Size: 407 KiB |
|
After Width: | Height: | Size: 218 KiB |
|
After Width: | Height: | Size: 255 KiB |
|
After Width: | Height: | Size: 163 KiB |
|
After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 5.6 MiB |
|
After Width: | Height: | Size: 5.7 MiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 155 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 92 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 5.6 MiB |
|
After Width: | Height: | Size: 101 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 3.1 MiB |
|
After Width: | Height: | Size: 531 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
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 |
|
After Width: | Height: | Size: 855 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
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 |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 2.7 MiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 2.2 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 144 KiB |
|
After Width: | Height: | Size: 170 KiB |
|
After Width: | Height: | Size: 175 KiB |
|
After Width: | Height: | Size: 168 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 143 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 224 B |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 9.8 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 7.4 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 94 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 120 KiB |