Tower: unpublish ks_dashboard_ninja — remove source from 18.0 branch
@@ -1,15 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import models
|
||||
from . import controllers
|
||||
from . import common_lib
|
||||
from . import wizard
|
||||
|
||||
from odoo.api import Environment, SUPERUSER_ID
|
||||
|
||||
|
||||
def uninstall_hook(env):
|
||||
# env = Environment(cr, SUPERUSER_ID, {})
|
||||
for rec in env['ks_dashboard_ninja.board'].search([]):
|
||||
rec.ks_dashboard_client_action_id.unlink()
|
||||
rec.ks_dashboard_menu_id.unlink()
|
||||
@@ -1,191 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
{
|
||||
'name': 'Dashboard Ninja with AI',
|
||||
|
||||
'summary': """
|
||||
Ksolves Dashboard Ninja gives you a wide-angle view of your business that you might have missed. Get smart visual data with interactive and engaging dashboards for your Odoo ERP. Odoo Dashboard, CRM Dashboard, Inventory Dashboard, Sales Dashboard, Account Dashboard, Invoice Dashboard, Revamp Dashboard, Best Dashboard, Odoo Best Dashboard, Odoo Apps Dashboard, Best Ninja Dashboard, Analytic Dashboard, Pre-Configured Dashboard, Create Dashboard, Beautiful Dashboard, Customized Robust Dashboard, Predefined Dashboard, Multiple Dashboards, Advance Dashboard, Beautiful Powerful Dashboards, Chart Graphs Table View, All In One Dynamic Dashboard, Accounting Stock Dashboard, Pie Chart Dashboard, Modern Dashboard, Dashboard Studio, Dashboard Builder, Dashboard Designer, Odoo Studio. Revamp your Odoo Dashboard like never before! It is one of the best dashboard odoo apps in the market.
|
||||
""",
|
||||
|
||||
'description': """
|
||||
Dashboard Ninja v18.0,
|
||||
Odoo Dashboard,
|
||||
Dashboard,
|
||||
Dashboards,
|
||||
Odoo apps,
|
||||
Dashboard app,
|
||||
HR Dashboard,
|
||||
Sales Dashboard,
|
||||
inventory Dashboard,
|
||||
Lead Dashboard,
|
||||
Opportunity Dashboard,
|
||||
CRM Dashboard,
|
||||
POS,
|
||||
POS Dashboard,
|
||||
Connectors,
|
||||
Web Dynamic,
|
||||
Report Import/Export,
|
||||
Date Filter,
|
||||
HR,
|
||||
Sales,
|
||||
Theme,
|
||||
Tile Dashboard,
|
||||
Dashboard Widgets,
|
||||
Dashboard Manager,
|
||||
Debranding,
|
||||
Customize Dashboard,
|
||||
Graph Dashboard,
|
||||
Charts Dashboard,
|
||||
Invoice Dashboard,
|
||||
Project management,
|
||||
ksolves,
|
||||
ksolves apps,
|
||||
Ksolves India Ltd.
|
||||
Ksolves India Limited,
|
||||
odoo dashboard apps
|
||||
odoo dashboard app
|
||||
odoo dashboard module
|
||||
odoo modules
|
||||
dashboards
|
||||
powerful dashboards
|
||||
beautiful odoo dashboard
|
||||
odoo dynamic dashboard
|
||||
all in one dashboard
|
||||
multiple dashboard menu
|
||||
odoo dashboard portal
|
||||
beautiful odoo dashboard
|
||||
odoo best dashboard
|
||||
dashboard for management
|
||||
Odoo custom dashboard
|
||||
odoo dashboard management
|
||||
odoo dashboard apps
|
||||
create odoo dashboard
|
||||
odoo dashboard extension
|
||||
odoo dashboard module
|
||||
""",
|
||||
|
||||
'author': 'Ksolves India Ltd.',
|
||||
|
||||
'license': 'OPL-1',
|
||||
|
||||
'currency': 'EUR',
|
||||
|
||||
'price': '518.62',
|
||||
|
||||
'website': 'https://store.ksolves.com/',
|
||||
|
||||
'maintainer': 'Ksolves India Ltd.',
|
||||
|
||||
'live_test_url': 'https://ksdndemo18.kappso.com/web/demo_login',
|
||||
|
||||
'category': 'Services',
|
||||
'version': '18.0.1.1.7',
|
||||
|
||||
'support': 'sales@ksolves.com',
|
||||
|
||||
'images': ['static/description/output.gif'],
|
||||
|
||||
'depends': ['base', 'web', 'base_setup', 'bus', 'base_geolocalize', 'mail'],
|
||||
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'security/ks_security_groups.xml',
|
||||
'data/ks_default_data.xml',
|
||||
'data/ks_mail_cron.xml',
|
||||
'data/dn_data.xml',
|
||||
'data/sequence.xml',
|
||||
'views/res_settings.xml',
|
||||
'views/ks_dashboard_ninja_view.xml',
|
||||
'views/ks_dashboard_ninja_item_view.xml',
|
||||
'views/ks_dashboard_group_by.xml',
|
||||
'views/ks_dashboard_csv_group_by.xml',
|
||||
'views/ks_dashboard_action.xml',
|
||||
'views/ks_import_dashboard_view.xml',
|
||||
'wizard/ks_create_dashboard_wiz_view.xml',
|
||||
'wizard/ks_duplicate_dashboard_wiz_view.xml',
|
||||
'views/ks_ai_dashboard.xml',
|
||||
'views/ks_whole_ai_dashboard.xml',
|
||||
'views/ks_key_fetch.xml',
|
||||
'views/webExtend.xml'
|
||||
],
|
||||
|
||||
'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': [
|
||||
'web/static/lib/jquery/jquery.js',
|
||||
'ks_dashboard_ninja/static/src/scss/variable.scss',
|
||||
'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/src/css/ks_dashboard_ninja_pro.css',
|
||||
'ks_dashboard_ninja/static/src/css/ks_to_do_item.css',
|
||||
'ks_dashboard_ninja/static/src/scss/common.scss',
|
||||
'/ks_dashboard_ninja/static/src/scss/explainAi.scss',
|
||||
'/ks_dashboard_ninja/static/src/scss/chat_with_ai.scss',
|
||||
'/ks_dashboard_ninja/static/src/scss/Generate-ai.scss',
|
||||
'/ks_dashboard_ninja/static/src/scss/ks_ai_dashboard.scss',
|
||||
'ks_dashboard_ninja/static/src/css/style.css',
|
||||
'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.js',
|
||||
'ks_dashboard_ninja/static/lib/js/percent.js',
|
||||
'ks_dashboard_ninja/static/src/js/ks_global_functions.js',
|
||||
'ks_dashboard_ninja/static/lib/js/xy.js',
|
||||
'ks_dashboard_ninja/static/lib/js/radar.js',
|
||||
'ks_dashboard_ninja/static/src/js/domainfix.js',
|
||||
'ks_dashboard_ninja/static/src/js/chart_buttons_patch.js',
|
||||
'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/**/*',
|
||||
'ks_dashboard_ninja/static/src/js/charts_render_global_functions.js',
|
||||
'ks_dashboard_ninja/static/src/js/cookies.js',
|
||||
'ks_dashboard_ninja/static/src/scss/form_views.scss',
|
||||
'ks_dashboard_ninja/static/src/scss/modal.scss',
|
||||
'ks_dashboard_ninja/static/src/odoo_base_extend/**/*',
|
||||
],
|
||||
},
|
||||
|
||||
'external_dependencies': {
|
||||
'python': ['pandas', 'xlrd', 'openpyxl', 'gTTS', 'SQLAlchemy']
|
||||
},
|
||||
|
||||
'uninstall_hook': 'uninstall_hook',
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
from . import ks_date_filter_selections
|
||||
from . import filter_tools
|
||||
@@ -1,20 +0,0 @@
|
||||
import json
|
||||
|
||||
from odoo.tools.safe_eval import safe_eval
|
||||
|
||||
|
||||
def replace_company_domain(domain, company_id, company_ids):
|
||||
domain = safe_eval(domain) if isinstance(domain, str) else domain
|
||||
new_domain = []
|
||||
for condition in domain:
|
||||
if isinstance(condition, tuple) and len(condition) >= 3:
|
||||
if condition[1] in ('in', 'not in') and isinstance(condition[2], list) and '%MYCOMPANY' in condition[2]:
|
||||
new_condition = (condition[0], condition[1], [y for x in condition[2] for y in (company_ids if x == '%MYCOMPANY' else [x])])
|
||||
elif condition[2] == '%MYCOMPANY':
|
||||
new_condition = (condition[0], condition[1], company_id)
|
||||
else:
|
||||
new_condition = condition
|
||||
new_domain.append(new_condition)
|
||||
else:
|
||||
new_domain.append(condition)
|
||||
return json.dumps(new_domain)
|
||||
@@ -1,343 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import json
|
||||
import os
|
||||
import os.path
|
||||
from datetime import timedelta
|
||||
|
||||
import pytz
|
||||
from dateutil import rrule
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from odoo import _
|
||||
from odoo.exceptions import ValidationError
|
||||
from odoo.fields import datetime
|
||||
from odoo.tools.safe_eval import safe_eval
|
||||
|
||||
|
||||
def ks_get_date(ks_date_filter_selection, self, type):
|
||||
try:
|
||||
timezone = self._context.get('tz')
|
||||
except Exception as e:
|
||||
timezone = self.env.user.tz
|
||||
|
||||
if not timezone:
|
||||
ks_tzone = os.environ.get('TZ')
|
||||
if ks_tzone:
|
||||
timezone = ks_tzone
|
||||
elif os.path.exists('/etc/timezone'):
|
||||
ks_tzone = open('/etc/timezone').read()
|
||||
timezone = ks_tzone[0:-1]
|
||||
try:
|
||||
datetime.now(pytz.timezone(timezone))
|
||||
except Exception as e:
|
||||
raise ValidationError(_("Please set the local timezone."))
|
||||
|
||||
else:
|
||||
raise ValidationError(_("Please set the local timezone."))
|
||||
|
||||
series = ks_date_filter_selection
|
||||
if ks_date_filter_selection in ['t_fiscal_year', 'n_fiscal_year', 'ls_fiscal_year']:
|
||||
function_name = globals()["ks_date_series_" + series.split("_")[0]]
|
||||
return function_name(series.split("_")[1], timezone, type,self)
|
||||
else:
|
||||
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)
|
||||
|
||||
def ks_get_date_range_from_td_year(timezone, type,self):
|
||||
ks_date_data = {}
|
||||
date = datetime.now(pytz.timezone(timezone))
|
||||
year = date.year
|
||||
start_date = datetime(year, 1, 1)
|
||||
end_date = date
|
||||
if type == 'date':
|
||||
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
ks_date_data["selected_end_date"] = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
else:
|
||||
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
|
||||
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
|
||||
return ks_date_data
|
||||
|
||||
def ks_get_date_range_from_td_month(timezone, type,self):
|
||||
ks_date_data = {}
|
||||
|
||||
date = datetime.now(pytz.timezone(timezone))
|
||||
year = date.year
|
||||
month = date.month
|
||||
start_date = datetime(year, month, 1)
|
||||
end_date = date
|
||||
if type == 'date':
|
||||
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
ks_date_data["selected_end_date"] = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
else:
|
||||
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
|
||||
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
|
||||
return ks_date_data
|
||||
def ks_get_date_range_from_td_week(timezone, type,self):
|
||||
ks_date_data = {}
|
||||
lang = self.env['res.lang']._lang_get(self.env.user.lang)
|
||||
week_start = lang.week_start
|
||||
start_Date = rrule.weekday(int(week_start) - 1)
|
||||
start_date = datetime.today() + relativedelta(weekday=start_Date(-1))
|
||||
end_date = datetime.now(pytz.timezone(timezone))
|
||||
start_date = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
if type == 'date':
|
||||
ks_date_data["selected_start_date"] = start_date
|
||||
end_date = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
ks_date_data["selected_end_date"] = end_date
|
||||
else:
|
||||
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
|
||||
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
|
||||
return ks_date_data
|
||||
def ks_get_date_range_from_td_quarter(timezone, type,self):
|
||||
ks_date_data = {}
|
||||
date = datetime.now(pytz.timezone(timezone))
|
||||
year = date.year
|
||||
quarter = int((date.month - 1) / 3) + 1
|
||||
start_date = datetime(year, 3 * quarter - 2, 1)
|
||||
end_date = date
|
||||
if type == 'date':
|
||||
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
ks_date_data["selected_end_date"] = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
else:
|
||||
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
|
||||
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
|
||||
return ks_date_data
|
||||
|
||||
|
||||
# Last Specific Days Ranges : 7, 30, 90, 365
|
||||
def ks_date_series_l(ks_date_selection, timezone, type, self=None):
|
||||
ks_date_data = {}
|
||||
date_filter_options = {
|
||||
'day': 0,
|
||||
'week': 7,
|
||||
'month': 30,
|
||||
'quarter': 90,
|
||||
'year': 365,
|
||||
'past': False,
|
||||
'future': False
|
||||
}
|
||||
end_time = datetime.strptime(datetime.now(pytz.timezone(timezone)).strftime("%Y-%m-%d 23:59:59"),
|
||||
'%Y-%m-%d %H:%M:%S')
|
||||
start_time = datetime.strptime((datetime.now(pytz.timezone(timezone)) - timedelta(
|
||||
days=date_filter_options[ks_date_selection])).strftime("%Y-%m-%d 00:00:00"), '%Y-%m-%d %H:%M:%S')
|
||||
if type == 'date':
|
||||
ks_date_data["selected_end_date"] = datetime.strptime(end_time.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
ks_date_data["selected_start_date"] = datetime.strptime(start_time.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
else:
|
||||
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_time, timezone)
|
||||
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_time, timezone)
|
||||
|
||||
return ks_date_data
|
||||
|
||||
|
||||
# Current Date Ranges : Week, Month, Quarter, year
|
||||
def ks_date_series_t(ks_date_selection, timezone, type, self=None):
|
||||
ks_function_name = globals()["ks_get_date_range_from_" + ks_date_selection]
|
||||
return ks_function_name("current", timezone, type,self)
|
||||
|
||||
|
||||
# Previous Date Ranges : Week, Month, Quarter, year
|
||||
def ks_date_series_ls(ks_date_selection, timezone, type,self=None):
|
||||
ks_function_name = globals()["ks_get_date_range_from_" + ks_date_selection]
|
||||
return ks_function_name("previous", timezone, type,self)
|
||||
|
||||
|
||||
# Next Date Ranges : Day, Week, Month, Quarter, year
|
||||
def ks_date_series_n(ks_date_selection, timezone, type,self=None):
|
||||
ks_function_name = globals()["ks_get_date_range_from_" + ks_date_selection]
|
||||
return ks_function_name("next", timezone, type, self)
|
||||
|
||||
|
||||
def ks_get_date_range_from_day(date_state, timezone, type,self):
|
||||
ks_date_data = {}
|
||||
|
||||
date = datetime.now(pytz.timezone(timezone))
|
||||
|
||||
if date_state == "previous":
|
||||
date = date - timedelta(days=1)
|
||||
elif date_state == "next":
|
||||
date = date + timedelta(days=1)
|
||||
start_date = datetime(date.year, date.month, date.day)
|
||||
end_date = datetime(date.year, date.month, date.day) + timedelta(days=1, seconds=-1)
|
||||
if type == 'date':
|
||||
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
ks_date_data["selected_end_date"] = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
else:
|
||||
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date,timezone)
|
||||
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date,timezone)
|
||||
return ks_date_data
|
||||
|
||||
|
||||
def ks_get_date_range_from_week(date_state, timezone, type,self):
|
||||
ks_date_data = {}
|
||||
|
||||
# date = datetime.now(pytz.timezone(timezone))
|
||||
# ks_week = 0
|
||||
lang = self.env['res.lang']._lang_get(self.env.user.lang)
|
||||
week_start = lang.week_start
|
||||
start_Date = rrule.weekday(int(week_start) - 1)
|
||||
start_date = datetime.today() + relativedelta(weekday=start_Date(-1))
|
||||
if date_state == "previous":
|
||||
start_date = datetime.today() - relativedelta(weeks=1, weekday=start_Date(-1))
|
||||
elif date_state == "next":
|
||||
start_date = datetime.today() - relativedelta(weeks=-1, weekday=start_Date(-1))
|
||||
|
||||
start_date = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
if type == 'date':
|
||||
ks_date_data["selected_start_date"] = start_date
|
||||
end_date = start_date + timedelta(days=6, hours=23, minutes=59, seconds=59, milliseconds=59)
|
||||
ks_date_data["selected_end_date"] = end_date
|
||||
else:
|
||||
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
|
||||
end_date = start_date + timedelta(days=6, hours=23, minutes=59, seconds=59, milliseconds=59)
|
||||
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
|
||||
return ks_date_data
|
||||
|
||||
def ks_get_date_range_from_month(date_state, timezone, type,self):
|
||||
ks_date_data = {}
|
||||
|
||||
date = datetime.now(pytz.timezone(timezone))
|
||||
year = date.year
|
||||
month = date.month
|
||||
|
||||
if date_state == "previous":
|
||||
month -= 1
|
||||
if month == 0:
|
||||
month = 12
|
||||
year -= 1
|
||||
elif date_state == "next":
|
||||
month += 1
|
||||
if month == 13:
|
||||
month = 1
|
||||
year += 1
|
||||
|
||||
end_year = year
|
||||
end_month = month
|
||||
if month == 12:
|
||||
end_year += 1
|
||||
end_month = 1
|
||||
else:
|
||||
end_month += 1
|
||||
start_date = datetime(year, month, 1)
|
||||
end_date = datetime(end_year, end_month, 1) - timedelta(seconds=1)
|
||||
if type == 'date':
|
||||
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
ks_date_data["selected_end_date"] = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
else:
|
||||
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
|
||||
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
|
||||
return ks_date_data
|
||||
|
||||
|
||||
def ks_get_date_range_from_quarter(date_state, timezone, type,self):
|
||||
ks_date_data = {}
|
||||
|
||||
date = datetime.now(pytz.timezone(timezone))
|
||||
year = date.year
|
||||
quarter = int((date.month - 1) / 3) + 1
|
||||
|
||||
if date_state == "previous":
|
||||
quarter -= 1
|
||||
if quarter == 0:
|
||||
quarter = 4
|
||||
year -= 1
|
||||
elif date_state == "next":
|
||||
quarter += 1
|
||||
if quarter == 5:
|
||||
quarter = 1
|
||||
year += 1
|
||||
|
||||
start_date = datetime(year, 3 * quarter - 2, 1)
|
||||
|
||||
month = 3 * quarter
|
||||
remaining = int(month / 12)
|
||||
end_date = datetime(year + remaining, month % 12 + 1, 1) - timedelta(seconds=1)
|
||||
if type == 'date':
|
||||
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
ks_date_data["selected_end_date"] = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
else:
|
||||
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
|
||||
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
|
||||
return ks_date_data
|
||||
|
||||
|
||||
def ks_get_date_range_from_year(date_state, timezone, type,self):
|
||||
ks_date_data = {}
|
||||
|
||||
date = datetime.now(pytz.timezone(timezone))
|
||||
year = date.year
|
||||
|
||||
if date_state == "previous":
|
||||
year -= 1
|
||||
elif date_state == "next":
|
||||
year += 1
|
||||
start_date = datetime(year, 1, 1)
|
||||
end_date = datetime(year + 1, 1, 1) - timedelta(seconds=1)
|
||||
if type == 'date':
|
||||
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
ks_date_data["selected_end_date"] = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
else:
|
||||
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
|
||||
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
|
||||
return ks_date_data
|
||||
|
||||
def ks_get_date_range_from_past(date_state, self_tz, type, self):
|
||||
ks_date_data = {}
|
||||
date = datetime.now(pytz.timezone(self_tz))
|
||||
if type == 'date':
|
||||
ks_date_data["selected_end_date"] = datetime.strptime(date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
else:
|
||||
ks_date_data["selected_end_date"] = ks_convert_into_utc(date, self_tz)
|
||||
ks_date_data["selected_start_date"] = False
|
||||
return ks_date_data
|
||||
|
||||
|
||||
def ks_get_date_range_from_pastwithout(date_state, self_tz, type,self):
|
||||
ks_date_data = {}
|
||||
date = datetime.now(pytz.timezone(self_tz))
|
||||
hour = date.hour + 1
|
||||
date = date - timedelta(hours=hour)
|
||||
date = datetime.strptime(date.strftime("%Y-%m-%d 23:59:59"), '%Y-%m-%d %H:%M:%S')
|
||||
ks_date_data["selected_start_date"] = False
|
||||
if type == 'date':
|
||||
ks_date_data["selected_end_date"] = datetime.strptime(date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
else:
|
||||
ks_date_data["selected_end_date"] = ks_convert_into_utc(date, self_tz)
|
||||
return ks_date_data
|
||||
|
||||
|
||||
def ks_get_date_range_from_future(date_state, self_tz, type,self):
|
||||
ks_date_data = {}
|
||||
date = datetime.now(pytz.timezone(self_tz))
|
||||
ks_date_data["selected_end_date"] = False
|
||||
if type == 'date':
|
||||
ks_date_data["selected_start_date"] = date.strptime(date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
else:
|
||||
ks_date_data["selected_start_date"] = ks_convert_into_utc(date,self_tz)
|
||||
return ks_date_data
|
||||
|
||||
|
||||
def ks_get_date_range_from_futurestarting(date_state, self_tz, type,self):
|
||||
ks_date_data = {}
|
||||
date = datetime.now(pytz.timezone(self_tz))
|
||||
date = date + timedelta(days=1)
|
||||
start_date = datetime.strptime(date.strftime("%Y-%m-%d 00:00:00"), '%Y-%m-%d %H:%M:%S')
|
||||
if type == 'date':
|
||||
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
|
||||
ks_date_data["selected_end_date"] = False
|
||||
else:
|
||||
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, self_tz)
|
||||
ks_date_data["selected_end_date"] = False
|
||||
return ks_date_data
|
||||
|
||||
def ks_convert_into_utc(datetime, timezone):
|
||||
ks_tz = timezone and pytz.timezone(timezone) or pytz.UTC
|
||||
return ks_tz.localize(datetime.replace(tzinfo=None), is_dst=False).astimezone(pytz.UTC).replace(tzinfo=None)
|
||||
|
||||
def ks_convert_into_local(datetime, timezone):
|
||||
ks_tz = timezone and pytz.timezone(timezone) or pytz.UTC
|
||||
return pytz.UTC.localize(datetime.replace(tzinfo=None), is_dst=False).astimezone(ks_tz).replace(tzinfo=None)
|
||||
@@ -1,4 +0,0 @@
|
||||
from . import ks_chart_export
|
||||
from . import ks_list_export
|
||||
from . import ks_dashboard_export
|
||||
from . import ks_domain_fix
|
||||
@@ -1,131 +0,0 @@
|
||||
|
||||
import re
|
||||
import datetime
|
||||
import io
|
||||
import json
|
||||
import operator
|
||||
import logging
|
||||
|
||||
from odoo.addons.web.controllers.export import ExportXlsxWriter
|
||||
from odoo.tools.translate import _
|
||||
from werkzeug.exceptions import InternalServerError
|
||||
from odoo import http
|
||||
from odoo.http import content_disposition, request
|
||||
from odoo.tools.misc import xlwt
|
||||
from odoo.exceptions import UserError
|
||||
from odoo.tools import pycompat
|
||||
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class KsChartExport(http.Controller):
|
||||
|
||||
def base(self, data):
|
||||
params = json.loads(data)
|
||||
if not params.get('chart_data'):
|
||||
raise ValidationError("Chart data not present")
|
||||
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 = []
|
||||
excel_fields = []
|
||||
|
||||
for dataset in chart_data['datasets']:
|
||||
dataset['data'].insert(0, dataset['label'])
|
||||
import_data.append(dataset['data'])
|
||||
|
||||
for i in range(len(columns_headers)):
|
||||
ks_type_obj = {}
|
||||
if (len(import_data)):
|
||||
if isinstance(import_data[0][i],float):
|
||||
ks_type_obj['type'] = 'float'
|
||||
else:
|
||||
ks_type_obj['type'] = ''
|
||||
excel_fields.append((ks_type_obj))
|
||||
|
||||
return request.make_response(self.from_data(excel_fields, columns_headers, import_data),
|
||||
headers=[('Content-Disposition',
|
||||
content_disposition(self.filename(header))),
|
||||
('Content-Type', self.content_type)],
|
||||
# cookies={'fileToken': token}
|
||||
)
|
||||
|
||||
class KsChartExcelExport(KsChartExport, http.Controller):
|
||||
|
||||
# Excel needs raw data to correctly handle numbers and date values
|
||||
raw_data = True
|
||||
|
||||
@http.route('/ks_dashboard_ninja/export/chart_xls', type='http', auth="user")
|
||||
def index(self, data):
|
||||
try:
|
||||
return self.base(data)
|
||||
except Exception as exc:
|
||||
_logger.exception("Exception during request handling.")
|
||||
payload = json.dumps({
|
||||
'code': 200,
|
||||
'message': "Odoo Server Error",
|
||||
'data': http.serialize_exception(exc)
|
||||
})
|
||||
raise InternalServerError(payload) from exc
|
||||
|
||||
@property
|
||||
def content_type(self):
|
||||
return 'application/vnd.ms-excel'
|
||||
|
||||
def filename(self, base):
|
||||
return base + '.xlsx'
|
||||
|
||||
def from_data(self, fields, columns_headers, rows):
|
||||
with ExportXlsxWriter(fields, columns_headers, len(rows)) as xlsx_writer:
|
||||
for row_index, row in enumerate(rows):
|
||||
for cell_index, cell_value in enumerate(row):
|
||||
xlsx_writer.write_cell(row_index + 1, cell_index, cell_value)
|
||||
|
||||
return xlsx_writer.value
|
||||
|
||||
|
||||
class KsChartCsvExport(KsChartExport, http.Controller):
|
||||
|
||||
@http.route('/ks_dashboard_ninja/export/chart_csv', type='http', auth="user")
|
||||
def index(self, data):
|
||||
try:
|
||||
return self.base(data)
|
||||
except Exception as exc:
|
||||
_logger.exception("Exception during request handling.")
|
||||
payload = json.dumps({
|
||||
'code': 200,
|
||||
'message': "Odoo Server Error",
|
||||
'data': http.serialize_exception(exc)
|
||||
})
|
||||
raise InternalServerError(payload) from exc
|
||||
|
||||
@property
|
||||
def content_type(self):
|
||||
return 'text/csv;charset=utf8'
|
||||
|
||||
def filename(self, base):
|
||||
return base + '.csv'
|
||||
|
||||
def from_data(self, fields,columns_headers, rows):
|
||||
fp = io.BytesIO()
|
||||
writer = pycompat.csv_writer(fp, quoting=1)
|
||||
|
||||
writer.writerow(columns_headers)
|
||||
|
||||
for data in rows:
|
||||
row = []
|
||||
for d in data:
|
||||
# Spreadsheet apps tend to detect formulas on leading =, + and -
|
||||
if isinstance(d, str) and d.startswith(('=', '-', '+')):
|
||||
d = "'" + d
|
||||
|
||||
row.append(pycompat.to_text(d))
|
||||
writer.writerow(row)
|
||||
|
||||
return fp.getvalue()
|
||||
@@ -1,88 +0,0 @@
|
||||
import io
|
||||
import json
|
||||
import operator
|
||||
import logging
|
||||
|
||||
# from odoo.addons.web.controllers.main import ExportFormat
|
||||
from odoo.addons.web.controllers.export import ExportXlsxWriter
|
||||
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
from odoo.http import content_disposition,request
|
||||
from werkzeug.exceptions import InternalServerError
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class KsDashboardExport(http.Controller):
|
||||
|
||||
def base(self, data):
|
||||
params = json.loads(data)
|
||||
header, dashboard_data = operator.itemgetter('header', 'dashboard_data')(params)
|
||||
return request.make_response(self.from_data(dashboard_data),
|
||||
headers=[('Content-Disposition',
|
||||
content_disposition(self.filename(header))),
|
||||
('Content-Type', self.content_type)],
|
||||
# cookies={'fileToken': token}
|
||||
)
|
||||
|
||||
|
||||
class KsDashboardJsonExport(KsDashboardExport, http.Controller):
|
||||
|
||||
@http.route('/ks_dashboard_ninja/export/dashboard_json', type='http', auth="user")
|
||||
def index(self, data):
|
||||
try:
|
||||
return self.base(data)
|
||||
except Exception as exc:
|
||||
_logger.exception("Exception during request handling.")
|
||||
payload = json.dumps({
|
||||
'code': 200,
|
||||
'message': "Odoo Server Error",
|
||||
'data': http.serialize_exception(exc)
|
||||
})
|
||||
raise InternalServerError(payload) from exc
|
||||
|
||||
@property
|
||||
def content_type(self):
|
||||
return 'text/csv;charset=utf8'
|
||||
|
||||
def filename(self, base):
|
||||
return base + '.json'
|
||||
|
||||
def from_data(self, dashboard_data):
|
||||
fp = io.StringIO()
|
||||
fp.write(json.dumps(dashboard_data))
|
||||
|
||||
return fp.getvalue()
|
||||
|
||||
class KsItemJsonExport(KsDashboardExport, http.Controller):
|
||||
|
||||
@http.route('/ks_dashboard_ninja/export/item_json', type='http', auth="user")
|
||||
def index(self, data):
|
||||
try:
|
||||
data = json.loads(data)
|
||||
item_id = data["item_id"]
|
||||
data['dashboard_data'] = request.env['ks_dashboard_ninja.board'].ks_export_item(item_id)
|
||||
data = json.dumps(data)
|
||||
return self.base(data)
|
||||
except Exception as exc:
|
||||
_logger.exception("Exception during request handling.")
|
||||
payload = json.dumps({
|
||||
'code': 200,
|
||||
'message': "Odoo Server Error",
|
||||
'data': http.serialize_exception(exc)
|
||||
})
|
||||
raise InternalServerError(payload) from exc
|
||||
|
||||
|
||||
@property
|
||||
def content_type(self):
|
||||
return 'text/csv;charset=utf8'
|
||||
|
||||
def filename(self, base):
|
||||
return base + '.json'
|
||||
|
||||
def from_data(self, dashboard_data):
|
||||
fp = io.StringIO()
|
||||
fp.write(json.dumps(dashboard_data))
|
||||
|
||||
return fp.getvalue()
|
||||
@@ -1,21 +0,0 @@
|
||||
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)
|
||||
|
||||
@@ -1,217 +0,0 @@
|
||||
import datetime
|
||||
import io
|
||||
import json
|
||||
import logging
|
||||
import operator
|
||||
import os
|
||||
|
||||
import pytz
|
||||
from dateutil.parser import parse
|
||||
from odoo.exceptions import ValidationError
|
||||
from odoo.http import content_disposition, request
|
||||
from odoo.tools import pycompat
|
||||
from odoo.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
|
||||
from werkzeug.exceptions import InternalServerError
|
||||
|
||||
from odoo import http
|
||||
from odoo.addons.web.controllers.export import ExportXlsxWriter
|
||||
from ..common_lib.ks_date_filter_selections import ks_get_date, ks_convert_into_local
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class KsListExport(http.Controller):
|
||||
|
||||
def base(self, data):
|
||||
params = json.loads(data)
|
||||
# header,list_data = operator.itemgetter('header','chart_data')(params)
|
||||
header, list_data, item_id, ks_export_boolean, context, params = operator.itemgetter('header', 'chart_data',
|
||||
'ks_item_id',
|
||||
'ks_export_boolean',
|
||||
'context', 'params')(
|
||||
params)
|
||||
list_data = json.loads(list_data)
|
||||
if not list_data or not list_data.get('label', False):
|
||||
raise ValidationError("List data not present")
|
||||
if ks_export_boolean:
|
||||
item = request.env['ks_dashboard_ninja.item'].browse(int(item_id))
|
||||
ks_timezone = item._context.get('tz') or item.env.user.tz
|
||||
if not ks_timezone:
|
||||
ks_tzone = os.environ.get('TZ')
|
||||
if ks_tzone:
|
||||
ks_timezone = ks_tzone
|
||||
elif os.path.exists('/etc/timezone'):
|
||||
ks_tzone = open('/etc/timezone').read()
|
||||
ks_timezone = ks_tzone[0:-1]
|
||||
try:
|
||||
datetime.now(pytz.timezone(ks_timezone))
|
||||
except Exception as e:
|
||||
_logger.info('Please set the local timezone')
|
||||
|
||||
else:
|
||||
_logger.info('Please set the local timezone')
|
||||
orderby = item.ks_sort_by_field.id
|
||||
sort_order = item.ks_sort_by_order
|
||||
ks_start_date = context.get('ksDateFilterStartDate', False)
|
||||
ks_end_date = context.get('ksDateFilterEndDate', False)
|
||||
ksDateFilterSelection = context.get('ksDateFilterSelection', False)
|
||||
if context.get('allowed_company_ids', False):
|
||||
item = item.with_context(allowed_company_ids=context.get('allowed_company_ids'))
|
||||
if item.ks_data_calculation_type == 'query':
|
||||
query_start_date = item.ks_query_start_date
|
||||
query_end_date = item.ks_query_end_date
|
||||
ks_query = str(item.ks_custom_query)
|
||||
if ks_start_date and ks_end_date:
|
||||
ks_start_date = parse(ks_start_date)
|
||||
ks_end_date = parse(ks_end_date)
|
||||
item = item.with_context(ksDateFilterStartDate=ks_start_date)
|
||||
item = item.with_context(ksDateFilterEndDate=ks_end_date)
|
||||
item = item.with_context(ksDateFilterSelection=ksDateFilterSelection)
|
||||
|
||||
if item._context.get('ksDateFilterSelection', False):
|
||||
ks_date_filter_selection = item._context['ksDateFilterSelection']
|
||||
if ks_date_filter_selection == 'l_custom':
|
||||
item = item.with_context(ksDateFilterStartDate=ks_start_date)
|
||||
item = item.with_context(ksDateFilterEndDate=ks_end_date)
|
||||
item = item.with_context(ksIsDefultCustomDateFilter=False)
|
||||
|
||||
else:
|
||||
ks_date_filter_selection = item.ks_dashboard_ninja_board_id.ks_date_filter_selection
|
||||
item = item.with_context(ksDateFilterStartDate=item.ks_dashboard_ninja_board_id.ks_dashboard_start_date)
|
||||
item = item.with_context(ksDateFilterEndDate=item.ks_dashboard_ninja_board_id.ks_dashboard_end_date)
|
||||
item = item.with_context(ksDateFilterSelection=ks_date_filter_selection)
|
||||
item = item.with_context(ksIsDefultCustomDateFilter=True)
|
||||
|
||||
if ks_date_filter_selection not in ['l_custom', 'l_none']:
|
||||
ks_date_data = ks_get_date(ks_date_filter_selection, request, 'datetime')
|
||||
item = item.with_context(ksDateFilterStartDate=ks_date_data["selected_start_date"])
|
||||
item = item.with_context(ksDateFilterEndDate=ks_date_data["selected_end_date"])
|
||||
|
||||
item_domain = params.get('ks_domain_1', [])
|
||||
ks_chart_domain = item.ks_convert_into_proper_domain(item.ks_domain, item,item_domain)
|
||||
# list_data = item.ks_fetch_list_view_data(item,ks_chart_domain, ks_export_all=
|
||||
if list_data['type'] == 'ungrouped':
|
||||
list_data = item.ks_fetch_list_view_data(item, ks_chart_domain, ks_export_all=True)
|
||||
elif list_data['type'] == 'grouped':
|
||||
list_data = item.get_list_view_record(orderby, sort_order, ks_chart_domain, ks_export_all=True)
|
||||
elif item.ks_data_calculation_type == 'query':
|
||||
if ks_start_date or ks_end_date:
|
||||
query_start_date = ks_start_date
|
||||
query_end_date = ks_end_date
|
||||
ks_query_result = item.ks_get_list_query_result(ks_query, query_start_date, query_end_date, ks_offset=0,
|
||||
ks_export_all=True)
|
||||
list_data = item.ks_format_query_result(ks_query_result)
|
||||
|
||||
# chart_data['labels'].insert(0,'Measure')
|
||||
columns_headers = list_data['label']
|
||||
import_data = []
|
||||
excel_fields = []
|
||||
for dataset in list_data['data_rows']:
|
||||
if not list_data['type'] == 'grouped':
|
||||
for count, index in enumerate(dataset['ks_column_type']):
|
||||
if index == 'datetime':
|
||||
ks_converted_date = False
|
||||
date_string = dataset['data'][count]
|
||||
if dataset['data'][count]:
|
||||
ks_converted_date = ks_convert_into_local(datetime.datetime.strptime(date_string, '%m/%d/%y %H:%M:%S'),ks_timezone)
|
||||
dataset['data'][count] = ks_converted_date
|
||||
for ks_count, val in enumerate(dataset['data']):
|
||||
if isinstance(val, (float, int)):
|
||||
if val >= 0:
|
||||
try:
|
||||
ks_precision = item.sudo().env.ref('ks_dashboard_ninja.ks_dashboard_ninja_precision').digits
|
||||
except Exception as e:
|
||||
ks_precision = 2
|
||||
dataset['data'][ks_count] = item.env['ir.qweb.field.float'].sudo().value_to_html(val,
|
||||
{'precision': ks_precision})
|
||||
import_data.append(dataset['data'])
|
||||
for i in range(len(columns_headers)):
|
||||
ks_type_obj = {}
|
||||
if (len(import_data)):
|
||||
if isinstance(import_data[0][i], float):
|
||||
ks_type_obj['type'] = 'float'
|
||||
else:
|
||||
ks_type_obj['type'] = ''
|
||||
excel_fields.append((ks_type_obj))
|
||||
|
||||
return request.make_response(self.from_data(excel_fields, columns_headers, import_data),
|
||||
headers=[('Content-Disposition',
|
||||
content_disposition(self.filename(header))),
|
||||
('Content-Type', self.content_type)],
|
||||
# cookies={'fileToken': token}
|
||||
)
|
||||
|
||||
|
||||
class KsListExcelExport(KsListExport, http.Controller):
|
||||
|
||||
# Excel needs raw data to correctly handle numbers and date values
|
||||
raw_data = True
|
||||
|
||||
@http.route('/ks_dashboard_ninja/export/list_xls', type='http', auth="user")
|
||||
def index(self, data):
|
||||
try:
|
||||
return self.base(data)
|
||||
except Exception as exc:
|
||||
_logger.exception("Exception during request handling.")
|
||||
payload = json.dumps({
|
||||
'code': 200,
|
||||
'message': "Odoo Server Error",
|
||||
'data': http.serialize_exception(exc)
|
||||
})
|
||||
raise InternalServerError(payload) from exc
|
||||
|
||||
@property
|
||||
def content_type(self):
|
||||
return 'application/vnd.ms-excel'
|
||||
|
||||
def filename(self, base):
|
||||
return base + '.xlsx'
|
||||
|
||||
def from_data(self, fields, columns_headers, rows):
|
||||
with ExportXlsxWriter(fields, columns_headers, len(rows)) as xlsx_writer:
|
||||
for row_index, row in enumerate(rows):
|
||||
for cell_index, cell_value in enumerate(row):
|
||||
xlsx_writer.write_cell(row_index + 1, cell_index, cell_value)
|
||||
|
||||
return xlsx_writer.value
|
||||
|
||||
|
||||
class KsListCsvExport(KsListExport, http.Controller):
|
||||
|
||||
@http.route('/ks_dashboard_ninja/export/list_csv', type='http', auth="user")
|
||||
def index(self, data):
|
||||
try:
|
||||
return self.base(data)
|
||||
except Exception as exc:
|
||||
_logger.exception("Exception during request handling.")
|
||||
payload = json.dumps({
|
||||
'code': 200,
|
||||
'message': "Odoo Server Error",
|
||||
'data': http.serialize_exception(exc)
|
||||
})
|
||||
raise InternalServerError(payload) from exc
|
||||
|
||||
@property
|
||||
def content_type(self):
|
||||
return 'text/csv;charset=utf8'
|
||||
|
||||
def filename(self, base):
|
||||
return base + '.csv'
|
||||
|
||||
def from_data(self, fields, column_headers,rows):
|
||||
fp = io.BytesIO()
|
||||
writer = pycompat.csv_writer(fp, quoting=1)
|
||||
|
||||
writer.writerow(column_headers)
|
||||
|
||||
for data in rows:
|
||||
row = []
|
||||
for d in data:
|
||||
# Spreadsheet apps tend to detect formulas on leading =, + and -
|
||||
if isinstance(d, str) and d.startswith(('=', '-', '+')):
|
||||
d = "'" + d
|
||||
|
||||
row.append(pycompat.to_text(d))
|
||||
writer.writerow(row)
|
||||
|
||||
return fp.getvalue()
|
||||
@@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="config_dn_url" model="ir.config_parameter">
|
||||
<field name="key">ks_dashboard_ninja.url</field>
|
||||
<field name="value">https://dn16ai.kappso.com</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -1,614 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<data>
|
||||
<!-- Default Templates -->
|
||||
<record id="ks_blank" model="ks_dashboard_ninja.board_template">
|
||||
<field name="name">Blank</field>
|
||||
<field name="ks_item_count">0</field>
|
||||
</record>
|
||||
|
||||
<record id="ks_template_1" model="ks_dashboard_ninja.board_template">
|
||||
<field name="name">Template 1</field>
|
||||
<field name="ks_gridstack_config">[
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_1", "data": {"x": 0, "y": 10, "w": 3, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_2", "data": {"x": 0, "y": 8, "w": 3, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_3", "data": {"x": 3, "y": 0, "w": 3, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_4", "data": {"x": 0, "y": 2, "w": 3, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_5", "data": {"x": 6, "y": 12, "w": 6, "h": 6}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_6", "data": {"x": 0, "y": 28, "w": 12, "h":
|
||||
4}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_7", "data": {"x": 0, "y": 43, "w": 5, "h":
|
||||
4}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_8", "data": {"x": 6, "y": 6, "w": 6, "h": 6}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_9", "data": {"x": 5, "y": 36, "w": 7, "h": 7}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_10", "data": {"x": 4, "y": 23, "w": 4, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_11", "data": {"x": 6, "y": 18, "w": 6, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_12", "data": {"x": 0, "y": 6, "w": 3, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_13", "data": {"x": 3, "y": 8, "w": 3, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_15", "data": {"x": 0, "y": 18, "w": 6, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_16", "data": {"x": 0, "y": 0, "w": 3, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_17", "data": {"x": 3, "y": 6, "w": 3, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_18", "data": {"x": 3, "y": 4, "w": 3, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_19", "data": {"x": 3, "y": 10, "w": 3, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_20", "data": {"x": 5, "y": 43, "w": 7, "h":
|
||||
4}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_21", "data": {"x": 0, "y": 12, "w": 6, "h":
|
||||
6}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_22", "data": {"x": 0, "y": 36, "w": 5, "h":
|
||||
7}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_23", "data": {"x": 0, "y": 32, "w": 12, "h":
|
||||
4}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_24", "data": {"x": 8, "y": 23, "w": 4, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_25", "data": {"x": 0, "y": 23, "w": 4, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_26", "data": {"x": 0, "y": 4, "w": 3, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_27", "data": {"x": 3, "y": 3, "w": 3, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_28", "data": {"x": 6, "y": 0, "w": 6, "h":
|
||||
6}}
|
||||
]
|
||||
</field>
|
||||
<field name="ks_item_count">7</field>
|
||||
</record>
|
||||
|
||||
<record id="ks_template_2" model="ks_dashboard_ninja.board_template">
|
||||
<field name="name">Template 2</field>
|
||||
<field name="ks_gridstack_config">[
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_1", "data": {"x": 0, "y": 0, "w": 2, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_2", "data": {"x": 4, "y": 0, "w": 2, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_3", "data": {"x": 2, "y": 0, "w": 2, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_4", "data": {"x": 8, "y": 0, "w": 2, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_5", "data": {"x": 4, "y": 18, "w": 8, "h": 5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_6", "data": {"x": 8, "y": 27, "w": 4, "h":
|
||||
6}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_7", "data": {"x": 0, "y": 18, "w": 4, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_8", "data": {"x": 4, "y": 27, "w": 4, "h":
|
||||
6}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_9", "data": {"x": 4, "y": 13, "w": 8, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_10", "data": {"x": 0, "y": 23, "w": 4, "h":
|
||||
4}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_11", "data": {"x": 0, "y": 4, "w": 4, "h":
|
||||
4}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_12", "data": {"x": 6, "y": 0, "w": 2, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_13", "data": {"x": 10, "y": 2, "w": 2, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_15", "data": {"x":0, "y": 33, "w": 6, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_16", "data": {"x": 2, "y": 2, "w": 2, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_17", "data": {"x": 8, "y": 2, "w": 2, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_18", "data": {"x": 6, "y": 2, "w": 2, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_19", "data": {"x": 0, "y": 2, "w": 2, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_20", "data": {"x": 4, "y": 8, "w": 8, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_21", "data": {"x": 0, "y": 13, "w": 4, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_22", "data": {"x": 4, "y": 23, "w": 8, "h":
|
||||
4}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_23", "data": {"x": 6, "y": 33, "w": 6, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_24", "data": {"x": 4, "y": 4, "w": 8, "h":
|
||||
4}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_25", "data": {"x": 0, "y": 8, "w": 4, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_26", "data": {"x": 4, "y": 2, "w": 2, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_27", "data": {"x": 10, "y": 2, "w": 2, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_28", "data": {"x": 0, "y": 27, "w": 4, "h":
|
||||
6}}
|
||||
]
|
||||
</field>
|
||||
<field name="ks_item_count">7</field>
|
||||
</record>
|
||||
|
||||
<record id="ks_template_3" model="ks_dashboard_ninja.board_template">
|
||||
<field name="name">Template 3</field>
|
||||
<field name="ks_gridstack_config">[
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_1", "data": {"x": 0, "y": 0, "w": 3, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_2", "data": {"x": 6, "y": 0, "w": 3, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_3", "data": {"x": 3, "y": 0, "w": 3, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_4", "data": {"x": 0, "y": 2, "w": 3, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_5", "data": {"x": 7, "y": 2, "w": 5, "h": 4}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_6", "data": {"x": 0, "y": 28, "w": 12, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_7", "data": {"x": 4, "y": 14, "w": 4, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_8", "data": {"x": 0, "y": 33, "w": 3, "h": 5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_9", "data": {"x": 8, "y": 23, "w": 4, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_10", "data": {"x": 8, "y": 14, "w": 4, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_11", "data": {"x": 0, "y": 23, "w": 4, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_12", "data": {"x": 9, "y": 0, "w": 3, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_13", "data": {"x": 3, "y": 2, "w": 4, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_15", "data": {"x":0, "y": 19, "w": 12, "h":
|
||||
4}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_16", "data": {"x": 0, "y": 8, "w": 3, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_17", "data": {"x": 3, "y": 4, "w": 4, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_18", "data": {"x": 0, "y": 12, "w": 3, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_19", "data": {"x": 0, "y": 4, "w": 3, "h": 2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_20", "data": {"x": 3, "y": 6, "w": 9, "h":
|
||||
4}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_21", "data": {"x": 0, "y": 14, "w": 4, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_22", "data": {"x": 6, "y": 33, "w": 6, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_23", "data": {"x": 0, "y": 19, "w": 12, "h":
|
||||
4}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_24", "data": {"x": 3, "y": 10, "w": 9, "h":
|
||||
4}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_25", "data": {"x": 4, "y": 23, "w": 4, "h":
|
||||
5}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_26", "data": {"x": 0, "y": 8, "w": 3, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_27", "data": {"x": 0, "y": 6, "w": 3, "h":
|
||||
2}},
|
||||
{"item_id":"ks_dashboard_ninja.ks_default_item_28", "data": {"x": 3, "y": 33, "w": 3, "h":
|
||||
5}}
|
||||
]
|
||||
</field>
|
||||
<field name="ks_item_count">7</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!--Default items (7 right now) created here that will be used for default templates in future dashboards-->
|
||||
|
||||
<record id="ks_default_item_1" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Tile (layout 1)</field>
|
||||
<field name="ks_dashboard_item_type">ks_tile</field>
|
||||
<field name="ks_record_count_type">count</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_domain">[["id",">",150]]</field>
|
||||
<field name="ks_default_icon">bar-chart</field>
|
||||
<field name="ks_dashboard_item_theme">blue</field>
|
||||
<field name="ks_background_color">#FFE2E5,0.99</field>
|
||||
<field name="ks_font_color">#000000,0.99</field>
|
||||
<field name="ks_default_icon_color">#000000,0.99</field>
|
||||
<field name="ks_layout">layout1</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
|
||||
</record>
|
||||
|
||||
<record id="ks_default_item_2" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Tile (layout 3)</field>
|
||||
<field name="ks_dashboard_item_type">ks_tile</field>
|
||||
<field name="ks_record_count_type">count</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_default_icon">users</field>
|
||||
<field name="ks_dashboard_item_theme">red</field>
|
||||
<field name="ks_background_color">#FFF4DE,0.99</field>
|
||||
<field name="ks_font_color">#000000,0.99</field>
|
||||
<field name="ks_default_icon_color">#000000,0.99</field>
|
||||
<field name="ks_layout">layout3</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
|
||||
</record>
|
||||
|
||||
<record id="ks_default_item_3" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Tile (layout 2)</field>
|
||||
<field name="ks_dashboard_item_type">ks_tile</field>
|
||||
<field name="ks_record_count_type">count</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_domain">[["id","<",50]]</field>
|
||||
<field name="ks_default_icon">money</field>
|
||||
<field name="ks_dashboard_item_theme">green</field>
|
||||
<field name="ks_background_color">#DCFCE7,0.99</field>
|
||||
<field name="ks_font_color">#000000,0.99</field>
|
||||
<field name="ks_default_icon_color">#000000,0.99</field>
|
||||
<field name="ks_layout">layout2</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
|
||||
</record>
|
||||
|
||||
<record id="ks_default_item_4" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Tile (layout 5)</field>
|
||||
<field name="ks_dashboard_item_type">ks_tile</field>
|
||||
<field name="ks_record_count_type">count</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_domain">[["id","<",100]]</field>
|
||||
<field name="ks_default_icon">paper-plane</field>
|
||||
<field name="ks_dashboard_item_theme">yellow</field>
|
||||
<field name="ks_background_color">#F3E8FF,0.99</field>
|
||||
<field name="ks_font_color">#000000,0.99</field>
|
||||
<field name="ks_default_icon_color">#000000,0.99</field>
|
||||
<field name="ks_layout">layout5</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
|
||||
</record>
|
||||
|
||||
<record id="ks_default_item_5" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Bar Chart</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<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="[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","<",40]]</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"/>
|
||||
|
||||
</record>
|
||||
|
||||
|
||||
<record id="ks_default_item_6" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Line Chart</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<!-- <field name="ks_chart_measure_field" eval="[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_domain">[["id","<",10]]</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"/>
|
||||
|
||||
</record>
|
||||
|
||||
<record id="ks_default_item_7" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Pie Chart</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<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__currency_id')"/>
|
||||
<field name="ks_domain">[["id","<",10]]</field>
|
||||
<field name="ks_dashboard_item_type">ks_pie_chart</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
|
||||
</record>
|
||||
<record id="ks_default_item_8" model="ks_dashboard_ninja.item">
|
||||
<field name="name">list view (Un-Grouped)</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_list_view_type">grouped</field>
|
||||
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__phone_code')"/>
|
||||
<field name="ks_list_view_group_fields" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
|
||||
<field name="ks_domain">[["id","<",10]]</field>
|
||||
<field name="ks_dashboard_item_type">ks_list_view</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_9" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Horizontal Bar</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<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__currency_id')"/>
|
||||
<field name="ks_domain">[["id","<",10]]</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>
|
||||
<record id="ks_default_item_10" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Polar Area</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<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__currency_id')"/>
|
||||
<field name="ks_domain">[["id","<",10]]</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>
|
||||
<record id="ks_default_item_11" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Doughnut chart</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<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_domain">[["id","<",10]]</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>
|
||||
<field name="ks_dashboard_item_type">ks_doughnut_chart</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_12" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Tile (layout 4)</field>
|
||||
<field name="ks_dashboard_item_type">ks_tile</field>
|
||||
<field name="ks_record_count_type">count</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_domain">[["id","<",50]]</field>
|
||||
<field name="ks_default_icon">shopping-cart</field>
|
||||
<field name="ks_dashboard_item_theme">red</field>
|
||||
<field name="ks_background_color">#FFE2E5,0.99</field>
|
||||
<field name="ks_font_color">#000000,0.99</field>
|
||||
<field name="ks_default_icon_color">#000000,0.99</field>
|
||||
<field name="ks_layout">layout4</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_13" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Tile (layout 6)</field>
|
||||
<field name="ks_dashboard_item_type">ks_tile</field>
|
||||
<field name="ks_record_count_type">count</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_domain">[["id","<",100]]</field>
|
||||
<field name="ks_default_icon">car</field>
|
||||
<field name="ks_dashboard_item_theme">red</field>
|
||||
<field name="ks_background_color">#FFF4DE,0.53</field>
|
||||
<field name="ks_font_color">#000000,0.70</field>
|
||||
<field name="ks_default_icon_color">#000000,0.99</field>
|
||||
<field name="ks_layout">layout6</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_14" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Pie Chart</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<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__currency_id')"/>
|
||||
<field name="ks_domain">[["id","<",10]]</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>
|
||||
<record id="ks_default_item_15" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Area Chart</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<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">default</field>
|
||||
<field name="ks_dashboard_item_type">ks_area_chart</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
</data>
|
||||
<record id="ks_default_item_16" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Kpi Ratio</field>
|
||||
<field name="ks_dashboard_item_type">ks_kpi</field>
|
||||
<field name="ks_record_count_type">count</field>
|
||||
<field name="ks_record_count_type_2">count</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_model_id_2" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_data_comparison">Ratio</field>
|
||||
<field name="ks_domain">[["id","<",100]]</field>
|
||||
<field name="ks_default_icon">user</field>
|
||||
<field name="ks_dashboard_item_theme">blue</field>
|
||||
<field name="ks_background_color">#DCFCE7,0.99</field>
|
||||
<field name="ks_font_color">#000000,0.99</field>
|
||||
<field name="ks_default_icon_color">#000000,0.99</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_17" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Kpi ( Percentage)</field>
|
||||
<field name="ks_dashboard_item_type">ks_kpi</field>
|
||||
<field name="ks_record_count_type">count</field>
|
||||
<field name="ks_record_count_type_2">count</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_model_id_2" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_domain">[["id","<",100]]</field>
|
||||
<field name="ks_data_comparison">Percentage</field>
|
||||
<field name="ks_default_icon">paper-plane</field>
|
||||
<field name="ks_dashboard_item_theme">red</field>
|
||||
<field name="ks_background_color">#F3E8FF,0.99</field>
|
||||
<field name="ks_font_color">#000000,0.99</field>
|
||||
<field name="ks_default_icon_color">#000000,0.99</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_18" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Kpi ( Number)</field>
|
||||
<field name="ks_dashboard_item_type">ks_kpi</field>
|
||||
<field name="ks_record_count_type">count</field>
|
||||
<field name="ks_record_count_type_2">count</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_model_id_2" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_target_view">Number</field>
|
||||
<field name="ks_goal_enable">1</field>
|
||||
<field name="ks_domain">[["id","<",100]]</field>
|
||||
<field name="ks_data_comparison">Sum</field>
|
||||
<field name="ks_default_icon">money</field>
|
||||
<field name="ks_dashboard_item_theme">green</field>
|
||||
<field name="ks_background_color">#F3E8FF,0.63</field>
|
||||
<field name="ks_font_color">#000000,0.99</field>
|
||||
<field name="ks_default_icon_color">#000000,0.99</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_19" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Kpi (sum)</field>
|
||||
<field name="ks_dashboard_item_type">ks_kpi</field>
|
||||
<field name="ks_record_count_type">count</field>
|
||||
<field name="ks_record_count_type_2">count</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_model_id_2" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_data_comparison">Sum</field>
|
||||
<field name="ks_domain">[["id","<",100]]</field>
|
||||
<field name="ks_default_icon">bar-chart</field>
|
||||
<field name="ks_dashboard_item_theme">yellow</field>
|
||||
<field name="ks_background_color">#FFF4DE,0.99</field>
|
||||
<field name="ks_font_color">#000000,0.99</field>
|
||||
<field name="ks_default_icon_color">#000000,0.99</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_20" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Bar Chart With Data Values</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<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_domain">[["id","<",40]]</field>
|
||||
<field name="ks_chart_item_color">default</field>
|
||||
<field name="ks_dashboard_item_type">ks_bar_chart</field>
|
||||
<field name="ks_show_data_value">1</field>
|
||||
<field name="ks_unit_selection">monetary</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
|
||||
</record>
|
||||
<record id="ks_default_item_21" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Semi Circle Pie Chart</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<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_semi_circle_chart">1</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>
|
||||
<field name="ks_dashboard_item_type">ks_pie_chart</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_22" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Horizontal Bar(sub-group)</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<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_relation_sub_groupby" eval="ref('base.field_res_country__name')"/>
|
||||
<field name="ks_chart_item_color">default</field>
|
||||
<field name="ks_domain">[["id","<",10]]</field>
|
||||
<field name="ks_show_data_value">1</field>
|
||||
<field name="ks_unit_selection">monetary</field>
|
||||
<field name="ks_dashboard_item_type">ks_horizontalBar_chart</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_23" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Area Chart with data values</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<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">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>
|
||||
<field name="ks_dashboard_item_type">ks_area_chart</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_24" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Line Chart with values</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<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">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>
|
||||
<field name="ks_dashboard_item_type">ks_line_chart</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_25" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Doughnut semi circle</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<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">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>
|
||||
<field name="ks_unit_selection">monetary</field>
|
||||
<field name="ks_dashboard_item_type">ks_doughnut_chart</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_26" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Kpi 26(Average)</field>
|
||||
<field name="ks_dashboard_item_type">ks_kpi</field>
|
||||
<field name="ks_record_field" eval="ref('base.field_res_country__name')"/>
|
||||
<field name="ks_record_field_2" eval="ref('base.field_res_country__name')"/>
|
||||
<field name="ks_data_format">indian</field>
|
||||
<field name="ks_record_count_type">average</field>
|
||||
<field name="ks_record_count_type_2">average</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_model_id_2" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_target_view">Number</field>
|
||||
<field name="ks_goal_enable">1</field>
|
||||
<field name="ks_domain">[["id","<",100]]</field>
|
||||
<field name="ks_data_comparison">Sum</field>
|
||||
<field name="ks_default_icon">money</field>
|
||||
<field name="ks_dashboard_item_theme">blue</field>
|
||||
<field name="ks_background_color">#DCFCE7,0.99</field>
|
||||
<field name="ks_font_color">#000000,0.99</field>
|
||||
<field name="ks_default_icon_color">#000000,0.99</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_27" model="ks_dashboard_ninja.item">
|
||||
<field name="name">Kpi (previous)</field>
|
||||
<field name="ks_dashboard_item_type">ks_kpi</field>
|
||||
<field name="ks_record_count_type">count</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_domain">[["id","<",100]]</field>
|
||||
<field name="ks_previous_period">1</field>
|
||||
<field name="ks_date_filter_selection">t_week</field>
|
||||
<field name="ks_default_icon">money</field>
|
||||
<field name="ks_dashboard_item_theme">green</field>
|
||||
<field name="ks_background_color">#FFE2E5,0.59</field>
|
||||
<field name="ks_font_color">#000000,0.99</field>
|
||||
<field name="ks_default_icon_color">#000000,0.99</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_28" model="ks_dashboard_ninja.item">
|
||||
<field name="name">list view (grouped)</field>
|
||||
<field name="ks_chart_data_count_type">sum</field>
|
||||
<field name="ks_chart_groupby_type">relational_type</field>
|
||||
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
|
||||
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__name')"/>
|
||||
<field name="ks_list_view_type">ungrouped</field>
|
||||
<field name="ks_list_view_group_fields" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
|
||||
<field name="ks_list_view_fields"
|
||||
eval="[(6, 0, [ref('base.field_res_country__phone_code'),ref('base.field_res_country__name')])]"/>
|
||||
<field name="ks_domain">[["id","<",10]]</field>
|
||||
<field name="ks_dashboard_item_type">ks_list_view</field>
|
||||
<field name="ks_company_id" eval="0"/>
|
||||
</record>
|
||||
<record id="ks_default_item_10_action" model="ks_dashboard_ninja.item_action">
|
||||
<field name="ks_dashboard_item_id" ref="ks_default_item_10"/>
|
||||
<field name="ks_chart_type">ks_bar_chart</field>
|
||||
<field name="ks_item_action_field" ref='base.field_res_country__phone_code'/>
|
||||
</record>
|
||||
<record id="ks_default_item_10_action1" model="ks_dashboard_ninja.item_action">
|
||||
<field name="ks_dashboard_item_id" ref="ks_default_item_10"/>
|
||||
<field name="ks_chart_type">ks_pie_chart</field>
|
||||
<field name="ks_item_action_field" ref='base.field_res_country__name'/>
|
||||
</record>
|
||||
|
||||
<!-- Default dashboard Data -->
|
||||
<data noupdate="1">
|
||||
|
||||
<record id="ks_my_default_dashboard_board" model="ks_dashboard_ninja.board">
|
||||
<field name="name">My Dashboard</field>
|
||||
<field name="ks_dashboard_state">Locked</field>
|
||||
<field name="ks_dashboard_menu_name">My Dashboard</field>
|
||||
<field name="ks_dashboard_active">1</field>
|
||||
<field name="ks_dashboard_default_template" ref="ks_dashboard_ninja.ks_blank"/>
|
||||
<field name="ks_dashboard_group_access" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record forcecreate="True" id="ks_dashboard_ninja_precision" model="decimal.precision">
|
||||
<field name="name">Dashboard Ninja Decimal Precision</field>
|
||||
<field name="digits" eval="2"/>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="ir_cron_send_target_email" model="ir.cron">
|
||||
<field name="name">Kpi mail cron</field>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="model_id" ref="model_ks_dashboard_ninja_item"/>
|
||||
<field name="code">model.check_target()</field>
|
||||
<field name="state">code</field>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="ks_dashboard_item_seq" model="ir.sequence">
|
||||
<field name="name">Dashboard Seq</field>
|
||||
<field name="code">ks_dashboard_ninja.item</field>
|
||||
<field name="padding">2</field>
|
||||
<field name="company_id" eval="False"/>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -1,34 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<!-- Three Default Demo Dashboard with Templates : Template1, Template2, Template3-->
|
||||
|
||||
<record id="demo_template1_dashboard" model="ks_dashboard_ninja.board">
|
||||
<field name="name">Template1 Dashboard</field>
|
||||
<field name="ks_dashboard_menu_name">Template1</field>
|
||||
<field name="ks_dashboard_top_menu_id" eval="ref('ks_dashboard_ninja.dashboards_menu_root')"/>
|
||||
<field name="ks_dashboard_default_template" eval="ref('ks_dashboard_ninja.ks_template_1')"/>
|
||||
<field name="ks_dashboard_active">1</field>
|
||||
<field name="ks_dashboard_group_access" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record id="demo_template2_dashboard" model="ks_dashboard_ninja.board">
|
||||
<field name="name">Template2 Dashboard</field>
|
||||
<field name="ks_dashboard_menu_name">Template2</field>
|
||||
<field name="ks_dashboard_top_menu_id" eval="ref('ks_dashboard_ninja.dashboards_menu_root')"/>
|
||||
<field name="ks_dashboard_default_template" eval="ref('ks_dashboard_ninja.ks_template_2')"/>
|
||||
<field name="ks_dashboard_active">1</field>
|
||||
<field name="ks_dashboard_group_access" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record id="demo_template3_dashboard" model="ks_dashboard_ninja.board">
|
||||
<field name="name">Template3 Dashboard</field>
|
||||
<field name="ks_dashboard_menu_name">Template3</field>
|
||||
<field name="ks_dashboard_top_menu_id" eval="ref('ks_dashboard_ninja.dashboards_menu_root')"/>
|
||||
<field name="ks_dashboard_default_template" eval="ref('ks_dashboard_ninja.ks_template_3')"/>
|
||||
<field name="ks_dashboard_active">1</field>
|
||||
<field name="ks_dashboard_group_access" eval="False"/>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -1,11 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from odoo import models, fields
|
||||
|
||||
|
||||
class KpSendMail(models.Model):
|
||||
_name = 'ks_dashboard_ninja.kpi_mail'
|
||||
_description = 'Dashboard Ninja Kpi mail'
|
||||
|
||||
|
||||
name = fields.Char(string="Email To:")
|
||||
@@ -1,17 +0,0 @@
|
||||
from . import ks_dashboard_ninja
|
||||
from . import ks_dashboard_ninja_items
|
||||
from . import ks_item_action
|
||||
from . import ks_child_dashboard
|
||||
from . import ks_dashboard_filters
|
||||
from . import ks_dashboard_templates
|
||||
from . import ks_dn_to_do_item
|
||||
from . import ks_import_dashboard
|
||||
from . import Kpi_mail
|
||||
from . import res_settings
|
||||
from . import ks_ai_ninja_dashboard
|
||||
from . import ks_ai_whole_dashboard
|
||||
from . import ks_key_fetch
|
||||
from . import ks_chat_channel
|
||||
from . import base_model_extend
|
||||
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from odoo import models, api
|
||||
|
||||
|
||||
class BaseExtend(models.AbstractModel):
|
||||
_inherit = 'base'
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals):
|
||||
recs = super(BaseExtend, self).create(vals)
|
||||
if 'ir.' not in self._name and 'bus.' not in self._name and self.env.user.has_group('base.group_user'):
|
||||
# items = self.env['ks_dashboard_ninja.item'].search(
|
||||
# [['ks_model_id.model', '=', self._name]])
|
||||
# if items:
|
||||
# online_partners = self.env["bus.presence"].sudo().search([('status', '=', 'online')]).mapped('user_id.partner_id').ids
|
||||
# updates = [ for partner_id in online_partners]
|
||||
self.env['bus.bus']._sendone('ks_notification', 'Update: Dashboard Items', {'model': self._name})
|
||||
return recs
|
||||
|
||||
def write(self, vals):
|
||||
recs = super(BaseExtend, self).write(vals)
|
||||
if 'ir.' not in self._name and 'bus.' not in self._name and self.env.user.has_group('base.group_user') and 'res.partner' not in self._name:
|
||||
# items = self.env['ks_dashboard_ninja.item'].search(
|
||||
# [['ks_model_id.model', '=', self._name]])
|
||||
# if items:
|
||||
# online_partner = self.env["bus.presence"].search([('status', '=', 'online')]).mapped('user_id.partner_id').ids
|
||||
# updates = [[
|
||||
# (self._cr.dbname, 'res.partner', partner_id),
|
||||
# {'type': 'ks_notification', 'model': self._name},
|
||||
# {'id': self.id}
|
||||
# ] for partner_id in online_partner]
|
||||
self.env['bus.bus']._sendone('ks_notification', 'Update: Dashboard Items', {'model': self._name})
|
||||
return recs
|
||||
@@ -1,402 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import base64
|
||||
import io
|
||||
import json
|
||||
import logging
|
||||
from urllib.parse import quote
|
||||
|
||||
import pandas as pd
|
||||
import requests
|
||||
from gtts import gTTS
|
||||
from odoo.exceptions import ValidationError
|
||||
from odoo.tools import config
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class KsDashboardNInjaAI(models.TransientModel):
|
||||
_name = 'ks_dashboard_ninja.arti_int'
|
||||
_description = 'AI Dashboard'
|
||||
|
||||
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 ID',
|
||||
domain="[('access_ids','!=',False),('transient','=',False),"
|
||||
"('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. ")
|
||||
|
||||
ks_import_model = fields.Many2one('ir.model', string='Model',
|
||||
domain="[('access_ids','!=',False),('transient','=',False),"
|
||||
"('model','not ilike','base_import%'),('model','not 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. ")
|
||||
ks_input_keywords = fields.Char("Ks Keywords")
|
||||
ks_model_show = fields.Boolean(default = False, compute='_compute_show_model')
|
||||
|
||||
@api.onchange('ks_input_keywords')
|
||||
def _compute_show_model(self):
|
||||
if self.ks_input_keywords and self.ks_type=="ks_keyword":
|
||||
api_key = self.env['ir.config_parameter'].sudo().get_param('ks_dashboard_ninja.dn_api_key')
|
||||
url = self.env['ir.config_parameter'].sudo().get_param('ks_dashboard_ninja.url')
|
||||
if api_key and url:
|
||||
json_data = {'name': api_key,
|
||||
'type': self.ks_type,
|
||||
'keyword': self.ks_input_keywords
|
||||
}
|
||||
url = url + "/api/v1/ks_dn_keyword_gen"
|
||||
ks_response = requests.post(url, data=json_data)
|
||||
if json.loads(ks_response.text) == False:
|
||||
self.ks_model_show = True
|
||||
else:
|
||||
self.ks_model_show = False
|
||||
else:
|
||||
self.ks_model_show = False
|
||||
else:
|
||||
self.ks_model_show = False
|
||||
|
||||
@api.model
|
||||
def ks_get_keywords(self):
|
||||
url = self.env['ir.config_parameter'].sudo().get_param(
|
||||
'ks_dashboard_ninja.url')
|
||||
if url:
|
||||
url = url + "/api/v1/ks_dn_get_keyword"
|
||||
ks_response = requests.post(url)
|
||||
if ks_response.status_code == 200:
|
||||
return json.loads(ks_response.text)
|
||||
else:
|
||||
return []
|
||||
|
||||
|
||||
def ks_do_action(self):
|
||||
headers = {"Content-Type": "application/json",
|
||||
"Accept": "application/json",
|
||||
"Catch-Control": "no-cache",
|
||||
}
|
||||
|
||||
if self.ks_import_model_id:
|
||||
ks_model_name = self.ks_import_model_id.model
|
||||
ks_fields = self.env[ks_model_name].fields_get()
|
||||
ks_filtered_fields = {key: val for key, val in ks_fields.items() if val['type'] not in ['many2many', 'one2many', 'binary'] and'name' in val and val['name'] != 'id' and val['name'] != 'sequence' and val['store'] == True}
|
||||
ks_fields_name = {val['name']:val['type'] for val in ks_filtered_fields.values()}
|
||||
question = ("columns: "+ f"{ks_fields_name}")
|
||||
|
||||
api_key = self.env['ir.config_parameter'].sudo().get_param(
|
||||
'ks_dashboard_ninja.dn_api_key')
|
||||
url = self.env['ir.config_parameter'].sudo().get_param(
|
||||
'ks_dashboard_ninja.url')
|
||||
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
|
||||
}
|
||||
url = url+"/api/v1/ks_dn_main_api"
|
||||
ks_ai_response = requests.post(url, data=json_data)
|
||||
if ks_ai_response.status_code == 200:
|
||||
ks_ai_response = json.loads(ks_ai_response.text)
|
||||
# create dummy dash to create items on the dashboard, later deleted it.
|
||||
ks_create_record = self.env['ks_dashboard_ninja.board'].create({
|
||||
'name': 'AI dashboard',
|
||||
'ks_dashboard_menu_name': 'AI menu',
|
||||
'ks_dashboard_default_template': self.env.ref('ks_dashboard_ninja.ks_blank', False).id,
|
||||
'ks_dashboard_top_menu_id': self.env['ir.ui.menu'].search([('name', '=', 'My Dashboards')])[0].id,
|
||||
})
|
||||
ks_dash_id = ks_create_record.id
|
||||
|
||||
ks_result = self.env['ks_dashboard_ninja.item'].create_ai_dash(ks_ai_response, ks_dash_id,
|
||||
ks_model_name)
|
||||
context = {'ks_dash_id': self._context['ks_dashboard_id'],
|
||||
'ks_dash_name': self.env['ks_dashboard_ninja.board'].search([
|
||||
('id','=',self._context['ks_dashboard_id'])]).name,'ks_delete_dash_id':ks_dash_id }
|
||||
|
||||
# return client action created through js for AI dashboard to render items on dummy dashboard
|
||||
if (ks_result == "success"):
|
||||
return {
|
||||
'type': 'ir.actions.client',
|
||||
'name': 'Generate items with AI',
|
||||
'params': {'ks_dashboard_id': ks_create_record.id, 'explain_ai_whole': True},
|
||||
'tag': 'ks_ai_dashboard_ninja',
|
||||
'context': context,
|
||||
'target':'new'
|
||||
}
|
||||
else:
|
||||
self.env['ks_dashboard_ninja.board'].browse(ks_dash_id).unlink()
|
||||
raise ValidationError(_("Items didn't render because AI provides invalid response for this model.Please try again"))
|
||||
else:
|
||||
raise ValidationError(_("AI Responds with the following status:- %s") % ks_ai_response.text)
|
||||
else:
|
||||
raise ValidationError(_("Please enter URL and API Key in General Settings"))
|
||||
else:
|
||||
raise ValidationError(_("Please enter the Model"))
|
||||
|
||||
|
||||
|
||||
def ks_generate_item(self):
|
||||
if self.ks_input_keywords:
|
||||
api_key = self.env['ir.config_parameter'].sudo().get_param(
|
||||
'ks_dashboard_ninja.dn_api_key')
|
||||
url = self.env['ir.config_parameter'].sudo().get_param(
|
||||
'ks_dashboard_ninja.url')
|
||||
if api_key and url:
|
||||
json_data = {'name': api_key,
|
||||
'type': self.ks_type,
|
||||
'keyword':self.ks_input_keywords
|
||||
}
|
||||
url = url + "/api/v1/ks_dn_keyword_gen"
|
||||
ks_response = requests.post(url, data=json_data)
|
||||
else:
|
||||
raise ValidationError(_("Please put API key and URL"))
|
||||
if json.loads(ks_response.text) != False and ks_response.status_code==200 :
|
||||
ks_ai_response = json.loads(ks_response.text)
|
||||
ks_dash_id = self._context['ks_dashboard_id']
|
||||
ks_model_name = ks_ai_response[0]['model']
|
||||
ks_result = self.env['ks_dashboard_ninja.item'].create_ai_dash(ks_ai_response, ks_dash_id,
|
||||
ks_model_name)
|
||||
if ks_result == "success":
|
||||
return{
|
||||
'type': 'ir.actions.client',
|
||||
'tag': 'reload',
|
||||
}
|
||||
else:
|
||||
raise ValidationError(_("Items didn't render, please try again!"))
|
||||
else:
|
||||
ks_model_name = self.ks_import_model.model
|
||||
ks_fields = self.env[ks_model_name].fields_get()
|
||||
ks_filtered_fields = {key: val for key, val in ks_fields.items() if
|
||||
val['type'] not in ['many2many', 'one2many', 'binary'] and 'name' in val and val[
|
||||
'name'] != 'id' and val['name'] != 'sequence' and val['store'] == True}
|
||||
ks_fields_name = {val['name']: val['type'] for val in ks_filtered_fields.values()}
|
||||
question = ("schema: " + f"{ks_fields_name}")
|
||||
model =("model:" + f"{ks_model_name}")
|
||||
api_key = self.env['ir.config_parameter'].sudo().get_param(
|
||||
'ks_dashboard_ninja.dn_api_key')
|
||||
url = self.env['ir.config_parameter'].sudo().get_param(
|
||||
'ks_dashboard_ninja.url')
|
||||
if api_key and url:
|
||||
json_data = {'name': api_key,
|
||||
'question': self.ks_input_keywords,
|
||||
'type':self.ks_type,
|
||||
'schema':question,
|
||||
'model':model,
|
||||
'url': self.env['ir.config_parameter'].sudo().get_param('web.base.url'),
|
||||
'db_name': self.env.cr.dbname
|
||||
}
|
||||
url = url + "/api/v1/ks_dn_main_api"
|
||||
ks_ai_response = requests.post(url, data=json_data)
|
||||
if ks_ai_response.status_code == 200:
|
||||
ks_ai_response = json.loads(ks_ai_response.text)
|
||||
ks_dash_id = self._context['ks_dashboard_id']
|
||||
ks_model_name = (ks_ai_response[0]['model']).lower()
|
||||
if self.env['ir.model'].search([('model','=',ks_model_name)]).id or self.env['ir.model'].search([('name','=',ks_model_name)]).id:
|
||||
if self.env['ir.model'].search([('name','=',ks_model_name)]).id:
|
||||
ks_model_name = self.env['ir.model'].search([('name','=',ks_model_name)]).model
|
||||
else:
|
||||
ks_model_name = (ks_ai_response[0]['model']).lower()
|
||||
ks_result = self.env['ks_dashboard_ninja.item'].create_ai_dash(ks_ai_response, ks_dash_id,ks_model_name)
|
||||
if ks_result == "success":
|
||||
return {
|
||||
'type': 'ir.actions.client',
|
||||
'tag': 'reload',
|
||||
}
|
||||
else:
|
||||
raise ValidationError(_("Items didn't render, please try again!"))
|
||||
else:
|
||||
raise ValidationError(_("%s model does not exist.Please install")% ks_model_name)
|
||||
else:
|
||||
raise ValidationError(
|
||||
_("AI Responds with the following status:- %s") % ks_ai_response.text)
|
||||
|
||||
else:
|
||||
raise ValidationError(_("Please enter URL and API Key in General Settings"))
|
||||
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'] or 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): #len(result)
|
||||
if self.env.context.get('explain_items_with_ai', False):
|
||||
self.env['ks_dashboard_ninja.board'].browse(dashboard_id).write({
|
||||
'ks_ai_explain_dash': False
|
||||
})
|
||||
else:
|
||||
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:
|
||||
if self.env.context.get('explain_items_with_ai', False):
|
||||
self.env['ks_dashboard_ninja.board'].browse(dashboard_id).write({
|
||||
'ks_ai_explain_dash': False
|
||||
})
|
||||
else:
|
||||
self.env['ks_dashboard_ninja.board'].browse(dashboard_id).write({
|
||||
'ks_ai_explain_dash': True
|
||||
})
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def get_ai_explain(self, item_id):
|
||||
print(item_id)
|
||||
res = self.env['ks_dashboard_ninja.item'].browse(item_id).ks_ai_analysis
|
||||
return res
|
||||
|
||||
@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)
|
||||
audio_data = io.BytesIO()
|
||||
ks_myobj.write_to_fp(audio_data)
|
||||
audio_data.seek(0)
|
||||
binary_data = audio_data.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:
|
||||
_logger.error(e)
|
||||
raise ValidationError(_("Some problem in audio generation."))
|
||||
|
||||
else:
|
||||
return False
|
||||
|
||||
@api.model
|
||||
def ks_gen_chat_res(self,**kwargs):
|
||||
ks_question = kwargs.get('ks_question')
|
||||
url = self.env['ir.config_parameter'].sudo().get_param(
|
||||
'ks_dashboard_ninja.url') + "/api/v1/get_sql_query"
|
||||
data = {
|
||||
"question": ks_question,
|
||||
}
|
||||
try:
|
||||
ks_response = requests.post(url,data=data)
|
||||
if (ks_response.status_code == 200):
|
||||
ks_response = json.loads(ks_response.text)['response']['Query']
|
||||
return self.ks_gen_dataframe(ks_response,ks_question)
|
||||
else:
|
||||
_logger.error('Unexpected error occurs')
|
||||
return False
|
||||
except Exception as e:
|
||||
_logger.error(e)
|
||||
return False
|
||||
|
||||
|
||||
|
||||
def ks_gen_dataframe(self,ks_query,question):
|
||||
host = config.get('db_host', False)
|
||||
user = quote(config.get('db_user', False))
|
||||
port = config.get('db_port', False) or 5432
|
||||
password = quote(config.get('db_password', False))
|
||||
db = config.get('db_name', False) or self.env.cr.dbname
|
||||
if not all([host, user, port, password, db]):
|
||||
_logger.error('some credentials are missing')
|
||||
return False
|
||||
else:
|
||||
sql_uri = f"postgresql+psycopg2://{user}:{password}@{host}:{port}/{db}"
|
||||
ks_fixed_url = self.env['ir.config_parameter'].sudo().get_param(
|
||||
'ks_dashboard_ninja.url') + "/api/v1/get_fixed_query"
|
||||
try:
|
||||
df = pd.read_sql(ks_query, sql_uri)
|
||||
except Exception as e:
|
||||
ks_query_data = {
|
||||
'query':ks_query,
|
||||
'error':e
|
||||
}
|
||||
fixed_query = requests.post(ks_fixed_url, data=ks_query_data)
|
||||
if fixed_query.status_code == 200:
|
||||
ks_corrected_query = fixed_query.text
|
||||
df = pd.read_sql(ks_corrected_query, sql_uri)
|
||||
else:
|
||||
_logger.error('Error in generating Dataframe')
|
||||
return False
|
||||
if any(df.dtypes == 'datetime64[ns]'):
|
||||
datetime_columns = [col for col in df.columns if df[col].dtype == 'datetime64[ns]']
|
||||
df[datetime_columns] = df[datetime_columns].astype(str)
|
||||
|
||||
# Convert DataFrame to JSON
|
||||
if len(df) >= 100:
|
||||
df = df.head(100)
|
||||
partial_data = True
|
||||
|
||||
df_json = df.to_json(orient='records')
|
||||
|
||||
ans = "As dataframe having more data to analyse we are not showing dataframe summary"
|
||||
# Generate answer
|
||||
if len(df) < 13:
|
||||
ks_ans_url = self.env['ir.config_parameter'].sudo().get_param(
|
||||
'ks_dashboard_ninja.url') + "/api/v1/get_answer"
|
||||
ks_ans_data = {'df':df.to_dict(orient='records'),'question':question}
|
||||
ans = requests.post(ks_ans_url, json = ks_ans_data)
|
||||
if ans.status_code == 200:
|
||||
ans = ans.text
|
||||
response_json = {
|
||||
"Dataframe": df_json,
|
||||
"Answer": ans,
|
||||
}
|
||||
else:
|
||||
_logger.error('Error in generating answer')
|
||||
return False
|
||||
else:
|
||||
response_json = {
|
||||
"Dataframe": df_json,
|
||||
"Answer": ans,
|
||||
}
|
||||
return response_json
|
||||
@@ -1,92 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import json
|
||||
import logging
|
||||
|
||||
import requests
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
from odoo import fields, models, _
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class KsAIDashboardninja(models.TransientModel):
|
||||
_name = 'ks_dashboard_ninja.ai_dashboard'
|
||||
_description = 'AI Dashboard'
|
||||
|
||||
ks_import_model_id = fields.Many2one('ir.model', string='Model',
|
||||
domain="[('access_ids','!=',False),('transient','=',False),"
|
||||
"('model','not ilike','base_import%'),('model','not 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. ", required=True)
|
||||
|
||||
ks_dash_name = fields.Char(string="Dashboard Name", required=True, size=35)
|
||||
ks_menu_name = fields.Char(string="Menu Name", required=True, size=35)
|
||||
ks_top_menu_id = fields.Many2one('ir.ui.menu',
|
||||
domain="[('parent_id','=',False)]",
|
||||
string="Show Under Menu", required=True,
|
||||
default=lambda self: self.env['ir.ui.menu'].search(
|
||||
[('name', '=', 'My Dashboards')])[0])
|
||||
ks_template = fields.Many2one('ks_dashboard_ninja.board_template',
|
||||
default=lambda self: self.env.ref('ks_dashboard_ninja.ks_blank',
|
||||
False),
|
||||
string="Dashboard Template")
|
||||
|
||||
def ks_do_action(self):
|
||||
headers = {"Content-Type": "application/json",
|
||||
"Accept": "application/json",
|
||||
"Catch-Control": "no-cache",
|
||||
}
|
||||
|
||||
if self.ks_import_model_id:
|
||||
ks_model_name = self.ks_import_model_id.model
|
||||
ks_fields = self.env[ks_model_name].fields_get()
|
||||
ks_filtered_fields = {key: val for key, val in ks_fields.items() if val['type'] not in ['many2many', 'one2many', 'binary'] and'name' in val and val['name'] != 'id' and val['name'] != 'sequence' and val['store'] == True}
|
||||
ks_fields_name = {val['name']:val['type'] for val in ks_filtered_fields.values()}
|
||||
question = ("columns: "+ f"{ks_fields_name}")
|
||||
|
||||
api_key = self.env['ir.config_parameter'].sudo().get_param(
|
||||
'ks_dashboard_ninja.dn_api_key')
|
||||
url = self.env['ir.config_parameter'].sudo().get_param(
|
||||
'ks_dashboard_ninja.url')
|
||||
if api_key and url:
|
||||
json_data = {'name': api_key,
|
||||
'question':question,
|
||||
'url':self.env['ir.config_parameter'].sudo().get_param('web.base.url'),
|
||||
'db_name':self.env.cr.dbname
|
||||
}
|
||||
url = url+"/api/v1/ks_dn_main_api"
|
||||
ks_ai_response = requests.post(url, data=json_data)
|
||||
if ks_ai_response.status_code == 200:
|
||||
ks_ai_response = json.loads(ks_ai_response.text)
|
||||
ks_create_record = self.env['ks_dashboard_ninja.board'].create({
|
||||
'name': self.ks_dash_name,
|
||||
'ks_dashboard_menu_name': self.ks_menu_name,
|
||||
'ks_dashboard_default_template': self.ks_template.id,
|
||||
'ks_dashboard_top_menu_id': self.ks_top_menu_id.id,
|
||||
})
|
||||
ks_dash_id = ks_create_record.id
|
||||
|
||||
ks_result = self.env['ks_dashboard_ninja.item'].create_ai_dash(ks_ai_response, ks_dash_id,
|
||||
ks_model_name)
|
||||
|
||||
if (ks_result == "success"):
|
||||
return {
|
||||
'type': 'ir.actions.client',
|
||||
'tag': 'reload',
|
||||
}
|
||||
else:
|
||||
self.env['ks_dashboard_ninja.board'].browse(ks_dash_id).unlink()
|
||||
raise ValidationError(_("Items didn't render, please try again!"))
|
||||
else:
|
||||
raise ValidationError(_("AI Responds with the following status:- %s") % ks_ai_response.text)
|
||||
else:
|
||||
raise ValidationError(_("Please enter URL and API Key in General Settings"))
|
||||
else:
|
||||
raise ValidationError(_("Please enter the Model"))
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from markupsafe import Markup
|
||||
|
||||
from odoo import models, fields, _
|
||||
|
||||
|
||||
class ChatChannel(models.Model):
|
||||
_inherit = 'discuss.channel'
|
||||
|
||||
ks_dashboard_board_id = fields.Many2one('ks_dashboard_ninja.board')
|
||||
ks_dashboard_item_id = fields.Many2one('ks_dashboard_ninja.item')
|
||||
|
||||
def ks_chat_wizard_channel_id(self, **kwargs):
|
||||
item_id = kwargs.get('item_id')
|
||||
dashboard_id = kwargs.get('dashboard_id')
|
||||
item_name = kwargs.get('item_name')
|
||||
dashboard_name = kwargs.get('dashboard_name')
|
||||
|
||||
channel = self.search([('ks_dashboard_item_id', '=', item_id)], limit=1)
|
||||
|
||||
if not channel:
|
||||
users = self.env['res.users'].search([('groups_id', 'in', self.env.ref('base.group_user').ids)]).mapped('partner_id.id')
|
||||
|
||||
channel = self.create({
|
||||
'name': f"{dashboard_name} - {item_name}",
|
||||
'ks_dashboard_board_id': dashboard_id,
|
||||
'ks_dashboard_item_id': item_id,
|
||||
'channel_member_ids': [(0, 0, {'partner_id': partner_id}) for partner_id in users]
|
||||
})
|
||||
|
||||
notification = Markup('<div class="o_mail_notification">%s</div>') % _("created this channel.")
|
||||
channel.message_post(body=notification, message_type="notification", subtype_xmlid="mail.mt_comment")
|
||||
self.env.user._bus_send_store(channel)
|
||||
|
||||
return channel.id if channel else None
|
||||
@@ -1,26 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from odoo import models, fields, api
|
||||
|
||||
|
||||
class KsDashboardNinjaBoardItemAction(models.Model):
|
||||
_name = 'ks_dashboard_ninja.child_board'
|
||||
_description = 'Dashboard Ninja Child Board'
|
||||
|
||||
name = fields.Char()
|
||||
ks_dashboard_ninja_id = fields.Many2one("ks_dashboard_ninja.board", string="Select Dashboard")
|
||||
ks_gridstack_config = fields.Char('Item Configurations')
|
||||
# ks_board_active_user_ids = fields.Many2many('res.users')
|
||||
ks_active = fields.Boolean("Is Selected")
|
||||
ks_dashboard_menu_name = fields.Char(string="Menu Name", related='ks_dashboard_ninja_id.ks_dashboard_menu_name', store=True)
|
||||
board_type = fields.Selection([('default', 'Default'), ('child', 'Child')])
|
||||
company_id = fields.Many2one('res.company', required=True, default=lambda self: self.env.company)
|
||||
ks_computed_group_access = fields.Many2many('res.groups', compute='_compute_ks_computed_group_access', store=True)
|
||||
|
||||
@api.depends('ks_dashboard_ninja_id', 'ks_dashboard_ninja_id.ks_dashboard_group_access')
|
||||
def _compute_ks_computed_group_access(self):
|
||||
for record in self:
|
||||
record.ks_computed_group_access = record.ks_dashboard_ninja_id.ks_dashboard_group_access
|
||||
|
||||
def write(self,vals):
|
||||
return super(KsDashboardNinjaBoardItemAction, self).write(vals)
|
||||
@@ -1,182 +0,0 @@
|
||||
country = {
|
||||
'AF': ('Afghanistan', (60.5284298033, 29.318572496, 75.1580277851, 38.4862816432)),
|
||||
'AO': ('Angola', (11.6400960629, -17.9306364885, 24.0799052263, -4.43802336998)),
|
||||
'AL': ('Albania', (19.3044861183, 39.624997667, 21.0200403175, 42.6882473822)),
|
||||
'AE': ('United Arab Emirates', (51.5795186705, 22.4969475367, 56.3968473651, 26.055464179)),
|
||||
'AR': ('Argentina', (-73.4154357571, -55.25, -53.628348965, -21.8323104794)),
|
||||
'AM': ('Armenia', (43.5827458026, 38.7412014837, 46.5057198423, 41.2481285671)),
|
||||
'AQ': ('Antarctica', (-180.0, -90.0, 180.0, -63.2706604895)),
|
||||
'TF': ('Fr. S. and Antarctic Lands', (68.72, -49.775, 70.56, -48.625)),
|
||||
'AU': ('Australia', (113.338953078, -43.6345972634, 153.569469029, -10.6681857235)),
|
||||
'AT': ('Austria', (9.47996951665, 46.4318173285, 16.9796667823, 49.0390742051)),
|
||||
'AZ': ('Azerbaijan', (44.7939896991, 38.2703775091, 50.3928210793, 41.8606751572)),
|
||||
'BI': ('Burundi', (29.0249263852, -4.49998341229, 30.752262811, -2.34848683025)),
|
||||
'BE': ('Belgium', (2.51357303225, 49.5294835476, 6.15665815596, 51.4750237087)),
|
||||
'BJ': ('Benin', (0.772335646171, 6.14215770103, 3.79711225751, 12.2356358912)),
|
||||
'BF': ('Burkina Faso', (-5.47056494793, 9.61083486576, 2.17710778159, 15.1161577418)),
|
||||
'BD': ('Bangladesh', (88.0844222351, 20.670883287, 92.6727209818, 26.4465255803)),
|
||||
'BG': ('Bulgaria', (22.3805257504, 41.2344859889, 28.5580814959, 44.2349230007)),
|
||||
'BS': ('Bahamas', (-78.98, 23.71, -77.0, 27.04)),
|
||||
'BA': ('Bosnia and Herz.', (15.7500260759, 42.65, 19.59976, 45.2337767604)),
|
||||
'BY': ('Belarus', (23.1994938494, 51.3195034857, 32.6936430193, 56.1691299506)),
|
||||
'BZ': ('Belize', (-89.2291216703, 15.8869375676, -88.1068129138, 18.4999822047)),
|
||||
'BO': ('Bolivia', (-69.5904237535, -22.8729187965, -57.4983711412, -9.76198780685)),
|
||||
'BR': ('Brazil', (-73.9872354804, -33.7683777809, -34.7299934555, 5.24448639569)),
|
||||
'BN': ('Brunei', (114.204016555, 4.007636827, 115.450710484, 5.44772980389)),
|
||||
'BT': ('Bhutan', (88.8142484883, 26.7194029811, 92.1037117859, 28.2964385035)),
|
||||
'BW': ('Botswana', (19.8954577979, -26.8285429827, 29.4321883481, -17.6618156877)),
|
||||
'CF': ('Central African Rep.', (14.4594071794, 2.2676396753, 27.3742261085, 11.1423951278)),
|
||||
'CA': ('Canada', (-140.99778, 41.6751050889, -52.6480987209, 83.23324)),
|
||||
'CH': ('Switzerland', (6.02260949059, 45.7769477403, 10.4427014502, 47.8308275417)),
|
||||
'CL': ('Chile', (-75.6443953112, -55.61183, -66.95992, -17.5800118954)),
|
||||
'CN': ('China', (73.6753792663, 18.197700914, 135.026311477, 53.4588044297)),
|
||||
'CI': ('Ivory Coast', (-8.60288021487, 4.33828847902, -2.56218950033, 10.5240607772)),
|
||||
'CM': ('Cameroon', (8.48881554529, 1.72767263428, 16.0128524106, 12.8593962671)),
|
||||
'CD': ('Congo (Kinshasa)', (12.1823368669, -13.2572266578, 31.1741492042, 5.25608775474)),
|
||||
'CG': ('Congo (Brazzaville)', (11.0937728207, -5.03798674888, 18.4530652198, 3.72819651938)),
|
||||
'CO': ('Colombia', (-78.9909352282, -4.29818694419, -66.8763258531, 12.4373031682)),
|
||||
'CR': ('Costa Rica', (-85.94172543, 8.22502798099, -82.5461962552, 11.2171192489)),
|
||||
'CU': ('Cuba', (-84.9749110583, 19.8554808619, -74.1780248685, 23.1886107447)),
|
||||
'CY': ('Cyprus', (32.2566671079, 34.5718694118, 34.0048808123, 35.1731247015)),
|
||||
'CZ': ('Czech Rep.', (12.2401111182, 48.5553052842, 18.8531441586, 51.1172677679)),
|
||||
'DE': ('Germany', (5.98865807458, 47.3024876979, 15.0169958839, 54.983104153)),
|
||||
'DJ': ('Djibouti', (41.66176, 10.9268785669, 43.3178524107, 12.6996385767)),
|
||||
'DK': ('Denmark', (8.08997684086, 54.8000145534, 12.6900061378, 57.730016588)),
|
||||
'DO': ('Dominican Rep.', (-71.9451120673, 17.598564358, -68.3179432848, 19.8849105901)),
|
||||
'DZ': ('Algeria', (-8.68439978681, 19.0573642034, 11.9995056495, 37.1183806422)),
|
||||
'EC': ('Ecuador', (-80.9677654691, -4.95912851321, -75.2337227037, 1.3809237736)),
|
||||
'EG': ('Egypt', (24.70007, 22.0, 36.86623, 31.58568)),
|
||||
'ER': ('Eritrea', (36.3231889178, 12.4554157577, 43.0812260272, 17.9983074)),
|
||||
'ES': ('Spain', (-9.39288367353, 35.946850084, 3.03948408368, 43.7483377142)),
|
||||
'EE': ('Estonia', (23.3397953631, 57.4745283067, 28.1316992531, 59.6110903998)),
|
||||
'ET': ('Ethiopia', (32.95418, 3.42206, 47.78942, 14.95943)),
|
||||
'FI': ('Finland', (20.6455928891, 59.846373196, 31.5160921567, 70.1641930203)),
|
||||
'FJ': ('Fiji', (-180.0, -18.28799, 180.0, -16.0208822567)),
|
||||
'FK': ('Falkland Is.', (-61.2, -52.3, -57.75, -51.1)),
|
||||
'FR': ('France', (-54.5247541978, 2.05338918702, 9.56001631027, 51.1485061713)),
|
||||
'GA': ('Gabon', (8.79799563969, -3.97882659263, 14.4254557634, 2.32675751384)),
|
||||
'GB': ('United Kingdom', (-7.57216793459, 49.959999905, 1.68153079591, 58.6350001085)),
|
||||
'GE': ('Georgia', (39.9550085793, 41.0644446885, 46.6379081561, 43.553104153)),
|
||||
'GH': ('Ghana', (-3.24437008301, 4.71046214438, 1.0601216976, 11.0983409693)),
|
||||
'GN': ('Guinea', (-15.1303112452, 7.3090373804, -7.83210038902, 12.5861829696)),
|
||||
'GM': ('Gambia', (-16.8415246241, 13.1302841252, -13.8449633448, 13.8764918075)),
|
||||
'GW': ('Guinea Bissau', (-16.6774519516, 11.0404116887, -13.7004760401, 12.6281700708)),
|
||||
'GQ': ('Eq. Guinea', (9.3056132341, 1.01011953369, 11.285078973, 2.28386607504)),
|
||||
'GR': ('Greece', (20.1500159034, 34.9199876979, 26.6041955909, 41.8269046087)),
|
||||
'GL': ('Greenland', (-73.297, 60.03676, -12.20855, 83.64513)),
|
||||
'GT': ('Guatemala', (-92.2292486234, 13.7353376327, -88.2250227526, 17.8193260767)),
|
||||
'GY': ('Guyana', (-61.4103029039, 1.26808828369, -56.5393857489, 8.36703481692)),
|
||||
'HN': ('Honduras', (-89.3533259753, 12.9846857772, -83.147219001, 16.0054057886)),
|
||||
'HR': ('Croatia', (13.6569755388, 42.47999136, 19.3904757016, 46.5037509222)),
|
||||
'HT': ('Haiti', (-74.4580336168, 18.0309927434, -71.6248732164, 19.9156839055)),
|
||||
'HU': ('Hungary', (16.2022982113, 45.7594811061, 22.710531447, 48.6238540716)),
|
||||
'ID': ('Indonesia', (95.2930261576, -10.3599874813, 141.03385176, 5.47982086834)),
|
||||
'IN': ('India', (68.1766451354, 7.96553477623, 97.4025614766, 35.4940095078)),
|
||||
'IE': ('Ireland', (-9.97708574059, 51.6693012559, -6.03298539878, 55.1316222195)),
|
||||
'IR': ('Iran', (44.1092252948, 25.0782370061, 63.3166317076, 39.7130026312)),
|
||||
'IQ': ('Iraq', (38.7923405291, 29.0990251735, 48.5679712258, 37.3852635768)),
|
||||
'IS': ('Iceland', (-24.3261840479, 63.4963829617, -13.609732225, 66.5267923041)),
|
||||
'IL': ('Israel', (34.2654333839, 29.5013261988, 35.8363969256, 33.2774264593)),
|
||||
'IT': ('Italy', (6.7499552751, 36.619987291, 18.4802470232, 47.1153931748)),
|
||||
'JM': ('Jamaica', (-78.3377192858, 17.7011162379, -76.1996585761, 18.5242184514)),
|
||||
'JO': ('Jordan', (34.9226025734, 29.1974946152, 39.1954683774, 33.3786864284)),
|
||||
'JP': ('Japan', (129.408463169, 31.0295791692, 145.543137242, 45.5514834662)),
|
||||
'KZ': ('Kazakhstan', (46.4664457538, 40.6623245306, 87.3599703308, 55.3852501491)),
|
||||
'KE': ('Kenya', (33.8935689697, -4.67677, 41.8550830926, 5.506)),
|
||||
'KG': ('Kyrgyzstan', (69.464886916, 39.2794632025, 80.2599902689, 43.2983393418)),
|
||||
'KH': ('Cambodia', (102.3480994, 10.4865436874, 107.614547968, 14.5705838078)),
|
||||
'KR': ('S. Korea', (126.117397903, 34.3900458847, 129.468304478, 38.6122429469)),
|
||||
'KW': ('Kuwait', (46.5687134133, 28.5260627304, 48.4160941913, 30.0590699326)),
|
||||
'LA': ('Laos', (100.115987583, 13.88109101, 107.564525181, 22.4647531194)),
|
||||
'LB': ('Lebanon', (35.1260526873, 33.0890400254, 36.6117501157, 34.6449140488)),
|
||||
'LR': ('Liberia', (-11.4387794662, 4.35575511313, -7.53971513511, 8.54105520267)),
|
||||
'LY': ('Libya', (9.31941084152, 19.58047, 25.16482, 33.1369957545)),
|
||||
'LK': ('Sri Lanka', (79.6951668639, 5.96836985923, 81.7879590189, 9.82407766361)),
|
||||
'LS': ('Lesotho', (26.9992619158, -30.6451058896, 29.3251664568, -28.6475017229)),
|
||||
'LT': ('Lithuania', (21.0558004086, 53.9057022162, 26.5882792498, 56.3725283881)),
|
||||
'LU': ('Luxembourg', (5.67405195478, 49.4426671413, 6.24275109216, 50.1280516628)),
|
||||
'LV': ('Latvia', (21.0558004086, 55.61510692, 28.1767094256, 57.9701569688)),
|
||||
'MA': ('Morocco', (-17.0204284327, 21.4207341578, -1.12455115397, 35.7599881048)),
|
||||
'MD': ('Moldova', (26.6193367856, 45.4882831895, 30.0246586443, 48.4671194525)),
|
||||
'MG': ('Madagascar', (43.2541870461, -25.6014344215, 50.4765368996, -12.0405567359)),
|
||||
'MX': ('Mexico', (-117.12776, 14.5388286402, -86.811982388, 32.72083)),
|
||||
'MK': ('Macedonia', (20.46315, 40.8427269557, 22.9523771502, 42.3202595078)),
|
||||
'ML': ('Mali', (-12.1707502914, 10.0963607854, 4.27020999514, 24.9745740829)),
|
||||
'MM': ('Myanmar', (92.3032344909, 9.93295990645, 101.180005324, 28.335945136)),
|
||||
'ME': ('Montenegro', (18.45, 41.87755, 20.3398, 43.52384)),
|
||||
'MN': ('Mongolia', (87.7512642761, 41.5974095729, 119.772823928, 52.0473660345)),
|
||||
'MZ': ('Mozambique', (30.1794812355, -26.7421916643, 40.7754752948, -10.3170960425)),
|
||||
'MR': ('Mauritania', (-17.0634232243, 14.6168342147, -4.92333736817, 27.3957441269)),
|
||||
'MW': ('Malawi', (32.6881653175, -16.8012997372, 35.7719047381, -9.23059905359)),
|
||||
'MY': ('Malaysia', (100.085756871, 0.773131415201, 119.181903925, 6.92805288332)),
|
||||
'NA': ('Namibia', (11.7341988461, -29.045461928, 25.0844433937, -16.9413428687)),
|
||||
'NC': ('New Caledonia', (164.029605748, -22.3999760881, 167.120011428, -20.1056458473)),
|
||||
'NE': ('Niger', (0.295646396495, 11.6601671412, 15.9032466977, 23.4716684026)),
|
||||
'NG': ('Nigeria', (2.69170169436, 4.24059418377, 14.5771777686, 13.8659239771)),
|
||||
'NI': ('Nicaragua', (-87.6684934151, 10.7268390975, -83.147219001, 15.0162671981)),
|
||||
'NL': ('Netherlands', (3.31497114423, 50.803721015, 7.09205325687, 53.5104033474)),
|
||||
'NO': ('Norway', (4.99207807783, 58.0788841824, 31.29341841, 80.6571442736)),
|
||||
'NP': ('Nepal', (80.0884245137, 26.3978980576, 88.1748043151, 30.4227169866)),
|
||||
'NZ': ('New Zealand', (166.509144322, -46.641235447, 178.517093541, -34.4506617165)),
|
||||
'OM': ('Oman', (52.0000098, 16.6510511337, 59.8080603372, 26.3959343531)),
|
||||
'PK': ('Pakistan', (60.8742484882, 23.6919650335, 77.8374507995, 37.1330309108)),
|
||||
'PA': ('Panama', (-82.9657830472, 7.2205414901, -77.2425664944, 9.61161001224)),
|
||||
'PE': ('Peru', (-81.4109425524, -18.3479753557, -68.6650797187, -0.0572054988649)),
|
||||
'PH': ('Philippines', (117.17427453, 5.58100332277, 126.537423944, 18.5052273625)),
|
||||
'PG': ('Papua New Guinea', (141.000210403, -10.6524760881, 156.019965448, -2.50000212973)),
|
||||
'PL': ('Poland', (14.0745211117, 49.0273953314, 24.0299857927, 54.8515359564)),
|
||||
'PR': ('Puerto Rico', (-67.2424275377, 17.946553453, -65.5910037909, 18.5206011011)),
|
||||
'KP': ('N. Korea', (124.265624628, 37.669070543, 130.780007359, 42.9853868678)),
|
||||
'PT': ('Portugal', (-9.52657060387, 36.838268541, -6.3890876937, 42.280468655)),
|
||||
'PY': ('Paraguay', (-62.6850571357, -27.5484990374, -54.2929595608, -19.3427466773)),
|
||||
'QA': ('Qatar', (50.7439107603, 24.5563308782, 51.6067004738, 26.1145820175)),
|
||||
'RO': ('Romania', (20.2201924985, 43.6884447292, 29.62654341, 48.2208812526)),
|
||||
'RU': ('Russia', (-180.0, 41.151416124, 180.0, 81.2504)),
|
||||
'RW': ('Rwanda', (29.0249263852, -2.91785776125, 30.8161348813, -1.13465911215)),
|
||||
'SA': ('Saudi Arabia', (34.6323360532, 16.3478913436, 55.6666593769, 32.161008816)),
|
||||
'SD': ('Sudan', (21.93681, 8.61972971293, 38.4100899595, 22.0)),
|
||||
'SS': ('S. Sudan', (23.8869795809, 3.50917, 35.2980071182, 12.2480077571)),
|
||||
'SN': ('Senegal', (-17.6250426905, 12.332089952, -11.4678991358, 16.5982636581)),
|
||||
'SB': ('Solomon Is.', (156.491357864, -10.8263672828, 162.398645868, -6.59933847415)),
|
||||
'SL': ('Sierra Leone', (-13.2465502588, 6.78591685631, -10.2300935531, 10.0469839543)),
|
||||
'SV': ('El Salvador', (-90.0955545723, 13.1490168319, -87.7235029772, 14.4241327987)),
|
||||
'SO': ('Somalia', (40.98105, -1.68325, 51.13387, 12.02464)),
|
||||
'RS': ('Serbia', (18.82982, 42.2452243971, 22.9860185076, 46.1717298447)),
|
||||
'SR': ('Suriname', (-58.0446943834, 1.81766714112, -53.9580446031, 6.0252914494)),
|
||||
'SK': ('Slovakia', (16.8799829444, 47.7584288601, 22.5581376482, 49.5715740017)),
|
||||
'SI': ('Slovenia', (13.6981099789, 45.4523163926, 16.5648083839, 46.8523859727)),
|
||||
'SE': ('Sweden', (11.0273686052, 55.3617373725, 23.9033785336, 69.1062472602)),
|
||||
'SZ': ('Swaziland', (30.6766085141, -27.2858794085, 32.0716654803, -25.660190525)),
|
||||
'SY': ('Syria', (35.7007979673, 32.312937527, 42.3495910988, 37.2298725449)),
|
||||
'TD': ('Chad', (13.5403935076, 7.42192454674, 23.88689, 23.40972)),
|
||||
'TG': ('Togo', (-0.0497847151599, 5.92883738853, 1.86524051271, 11.0186817489)),
|
||||
'TH': ('Thailand', (97.3758964376, 5.69138418215, 105.589038527, 20.4178496363)),
|
||||
'TJ': ('Tajikistan', (67.4422196796, 36.7381712916, 74.9800024759, 40.9602133245)),
|
||||
'TM': ('Turkmenistan', (52.5024597512, 35.2706639674, 66.5461503437, 42.7515510117)),
|
||||
'TL': ('East Timor', (124.968682489, -9.39317310958, 127.335928176, -8.27334482181)),
|
||||
'TT': ('Trinidad and Tobago', (-61.95, 10.0, -60.895, 10.89)),
|
||||
'TN': ('Tunisia', (7.52448164229, 30.3075560572, 11.4887874691, 37.3499944118)),
|
||||
'TR': ('Turkey', (26.0433512713, 35.8215347357, 44.7939896991, 42.1414848903)),
|
||||
'TW': ('Taiwan', (120.106188593, 21.9705713974, 121.951243931, 25.2954588893)),
|
||||
'TZ': ('Tanzania', (29.3399975929, -11.7209380022, 40.31659, -0.95)),
|
||||
'UG': ('Uganda', (29.5794661801, -1.44332244223, 35.03599, 4.24988494736)),
|
||||
'UA': ('Ukraine', (22.0856083513, 44.3614785833, 40.0807890155, 52.3350745713)),
|
||||
'UY': ('Uruguay', (-58.4270741441, -34.9526465797, -53.209588996, -30.1096863746)),
|
||||
'US': ('United States', (-171.791110603, 18.91619, -66.96466, 71.3577635769)),
|
||||
'UZ': ('Uzbekistan', (55.9289172707, 37.1449940049, 73.055417108, 45.5868043076)),
|
||||
'VE': ('Venezuela', (-73.3049515449, 0.724452215982, -59.7582848782, 12.1623070337)),
|
||||
'VN': ('Vietnam', (102.170435826, 8.59975962975, 109.33526981, 23.3520633001)),
|
||||
'VU': ('Vanuatu', (166.629136998, -16.5978496233, 167.844876744, -14.6264970842)),
|
||||
'PS': ('West Bank', (34.9274084816, 31.3534353704, 35.5456653175, 32.5325106878)),
|
||||
'YE': ('Yemen', (42.6048726743, 12.5859504257, 53.1085726255, 19.0000033635)),
|
||||
'ZA': ('South Africa', (16.3449768409, -34.8191663551, 32.830120477, -22.0913127581)),
|
||||
'ZM': ('Zambia', (21.887842645, -17.9612289364, 33.4856876971, -8.23825652429)),
|
||||
'ZW': ('Zimbabwe', (25.2642257016, -22.2716118303, 32.8498608742, -15.5077869605)),
|
||||
}
|
||||
|
||||
|
||||
def get_country_code(country_id):
|
||||
if country_id in country.keys():
|
||||
return country.get(country_id)
|
||||
else:
|
||||
return {}
|
||||
@@ -1,92 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from odoo.addons.ks_dashboard_ninja.common_lib.filter_tools import replace_company_domain
|
||||
from odoo.exceptions import ValidationError
|
||||
from odoo.tools.safe_eval import safe_eval
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
|
||||
|
||||
class KsDashboardNinjaTemplate(models.Model):
|
||||
_name = 'ks_dashboard_ninja.board_defined_filters'
|
||||
_description = 'Dashboard Ninja Defined Filters'
|
||||
|
||||
name = fields.Char('Filter Label')
|
||||
ks_dashboard_board_id = fields.Many2one('ks_dashboard_ninja.board', string="Dashboard")
|
||||
ks_model_id = fields.Many2one('ir.model', string='Model',
|
||||
domain="[('access_ids','!=',False),('transient','=',False),"
|
||||
"('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. ")
|
||||
ks_domain = fields.Char(string="Domain", help="Define conditions for filter. ")
|
||||
ks_domain_temp = fields.Char(string="Domain Substitute")
|
||||
ks_model_name = fields.Char(related='ks_model_id.model', string="Model Name")
|
||||
display_type = fields.Selection([
|
||||
('line_section', "Section")], default=False, help="Technical field for UX purpose.")
|
||||
sequence = fields.Integer(default=10,
|
||||
help="Gives the sequence order when displaying a list of payment terms lines.")
|
||||
ks_is_active = fields.Boolean(string="Active")
|
||||
|
||||
@api.onchange('ks_domain')
|
||||
def ks_domain_onchange(self):
|
||||
for rec in self:
|
||||
if rec.ks_model_id:
|
||||
try:
|
||||
ks_domain = rec.ks_domain
|
||||
if ks_domain and "%UID" in ks_domain:
|
||||
ks_domain = ks_domain.replace('"%UID"', str(self.env.user.id))
|
||||
if ks_domain and "%MYCOMPANY" in ks_domain:
|
||||
ks_domain = replace_company_domain(ks_domain, self.env.company.id, self.env.companies.ids)
|
||||
self.env[rec.ks_model_id.model].search_count(safe_eval(ks_domain))
|
||||
except Exception as e:
|
||||
raise ValidationError(_("Something went wrong . Possibly it is due to wrong input type for domain"))
|
||||
|
||||
@api.constrains('ks_domain', 'ks_model_id')
|
||||
def ks_domain_check(self):
|
||||
for rec in self:
|
||||
if rec.ks_model_id and not rec.ks_domain:
|
||||
raise ValidationError(_("Domain can not be empty"))
|
||||
|
||||
|
||||
|
||||
class KsDashboardNinjaTemplate(models.Model):
|
||||
_name = 'ks_dashboard_ninja.board_custom_filters'
|
||||
_description = 'Dashboard Ninja Custom Filters'
|
||||
|
||||
name = fields.Char("Filter Label")
|
||||
ks_dashboard_board_id = fields.Many2one('ks_dashboard_ninja.board', string="Dashboard")
|
||||
ks_model_id = fields.Many2one('ir.model', string='Model',
|
||||
domain="[('access_ids','!=',False),('transient','=',False),"
|
||||
"('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. ")
|
||||
ks_domain_field_id = fields.Many2one('ir.model.fields',
|
||||
domain="[('model_id','=',ks_model_id),"
|
||||
"('name','!=','id'),('store','=',True),"
|
||||
"('ttype', 'in', ['boolean', 'char', "
|
||||
"'date', 'datetime', 'float', 'integer', 'html', 'many2many', "
|
||||
"'many2one', 'monetary', 'one2many', 'text', 'selection'])]",
|
||||
string="Domain Field")
|
||||
|
||||
@api.onchange('ks_model_id')
|
||||
def on_change_ks_model_id(self):
|
||||
self.ks_domain_field_id = False
|
||||
|
||||
|
||||
class KsDashboardNinjaTemplateFilters(models.Model):
|
||||
_name = 'ks_dashboard_ninja.favourite_filters'
|
||||
_description = 'Dashboard Ninja Favourite Filters'
|
||||
|
||||
name = fields.Char("Filter Label")
|
||||
ks_dashboard_board_id = fields.Many2one('ks_dashboard_ninja.board', string="Dashboard")
|
||||
ks_filter = fields.Char("Filter")
|
||||
ks_access_id = fields.Integer("Access Id")
|
||||
ks_filter_type = fields.Char(default='favourite')
|
||||
|
||||
_sql_constraints = [
|
||||
('name_uniq', 'UNIQUE (name)', 'The name of the filter must be unique!'),
|
||||
]
|
||||
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from odoo import models, fields, api
|
||||
|
||||
|
||||
class KsDashboardNinjaTemplate(models.Model):
|
||||
_name = 'ks_dashboard_ninja.board_template'
|
||||
_description = 'Dashboard Ninja Template'
|
||||
|
||||
name = fields.Char()
|
||||
ks_gridstack_config = fields.Char()
|
||||
ks_item_count = fields.Integer()
|
||||
ks_template_type = fields.Selection([('ks_default', 'Predefined'), ('ks_custom', 'Custom')],
|
||||
string="Template Format")
|
||||
ks_dashboard_item_ids = fields.One2many('ks_dashboard_ninja.item', 'ks_dashboard_board_template_id',
|
||||
string="Template Type")
|
||||
ks_dashboard_board_id = fields.Many2one('ks_dashboard_ninja.board', string="Dashboard", help="""
|
||||
Items Configuration and their position in the dashboard will be copied from the selected dashboard
|
||||
and will be saved as template.
|
||||
""")
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
for val in vals_list:
|
||||
if val.get('ks_template_type', False) and val.get('ks_dashboard_board_id', False):
|
||||
dashboard_id = self.env['ks_dashboard_ninja.board'].browse(val.get('ks_dashboard_board_id'))
|
||||
val['ks_gridstack_config'] = dashboard_id.ks_gridstack_config
|
||||
val['ks_item_count'] = len(dashboard_id.ks_dashboard_items_ids)
|
||||
val['ks_dashboard_item_ids'] = [(4, x.copy({'ks_dashboard_ninja_board_id': False}).id) for x in
|
||||
dashboard_id.ks_dashboard_items_ids]
|
||||
recs = super(KsDashboardNinjaTemplate, self).create(vals_list)
|
||||
return recs
|
||||
|
||||
def write(self, val):
|
||||
if val.get('ks_dashboard_board_id', False):
|
||||
dashboard_id = self.env['ks_dashboard_ninja.board'].browse(val.get('ks_dashboard_board_id'))
|
||||
val['ks_gridstack_config'] = dashboard_id.ks_gridstack_config
|
||||
val['ks_item_count'] = len(dashboard_id.ks_dashboard_items_ids)
|
||||
val['ks_dashboard_item_ids'] = [(6, 0,
|
||||
[x.copy({'ks_dashboard_ninja_board_id': False}).id for x in
|
||||
dashboard_id.ks_dashboard_items_ids])]
|
||||
recs = super(KsDashboardNinjaTemplate, self).write(val)
|
||||
return recs
|
||||
@@ -1,145 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import json
|
||||
import re
|
||||
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
|
||||
|
||||
class KsDashboardNinjaItems(models.Model):
|
||||
_inherit = 'ks_dashboard_ninja.item'
|
||||
|
||||
ks_to_do_preview = fields.Char("To Do Preview", default="To Do Preview")
|
||||
ks_dn_header_lines = fields.One2many('ks_to.do.headers', 'ks_dn_item_id')
|
||||
ks_to_do_data = fields.Char(string="To Do Data in JSon", compute='ks_get_to_do_view_data', compute_sudo=False)
|
||||
ks_header_bg_color = fields.Char(string="Header Background Color", default="#8e24aa,0.99",
|
||||
help=' Select the background color with transparency. ')
|
||||
|
||||
@api.depends('ks_dn_header_lines', 'ks_dashboard_item_type')
|
||||
def ks_get_to_do_view_data(self):
|
||||
for rec in self:
|
||||
ks_to_do_data = rec._ksGetToDOData()
|
||||
rec.ks_to_do_data = ks_to_do_data
|
||||
|
||||
def _ksGetToDOData(self):
|
||||
ks_to_do_data = {
|
||||
'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))
|
||||
|
||||
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:
|
||||
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:
|
||||
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):
|
||||
_name = 'ks_to.do.headers'
|
||||
_description = "to do headers"
|
||||
|
||||
ks_dn_item_id = fields.Many2one('ks_dashboard_ninja.item')
|
||||
ks_to_do_header = fields.Char('Header')
|
||||
ks_to_do_description_lines = fields.One2many('ks_to.do.description', 'ks_to_do_header_id')
|
||||
|
||||
@api.constrains('ks_to_do_header')
|
||||
def ks_to_do_header_check(self):
|
||||
for rec in self:
|
||||
if rec.ks_to_do_header:
|
||||
ks_check = bool(re.match('^[A-Z, a-z,0-9,_]+$', rec.ks_to_do_header))
|
||||
if not ks_check:
|
||||
raise ValidationError(_("Special characters are not allowed only string and digits allow for section header"))
|
||||
|
||||
@api.onchange('ks_to_do_header')
|
||||
def ks_to_do_header_onchange(self):
|
||||
for rec in self:
|
||||
if rec.ks_to_do_header:
|
||||
ks_check = bool(re.match('^[A-Z, a-z,0-9,_]+$', rec.ks_to_do_header))
|
||||
if not ks_check:
|
||||
raise ValidationError(_("Special characters are not allowed only string and digits allow for section header"))
|
||||
|
||||
class KsToDODescription(models.Model):
|
||||
_name = 'ks_to.do.description'
|
||||
_description = 'to do description'
|
||||
|
||||
ks_to_do_header_id = fields.Many2one('ks_to.do.headers')
|
||||
ks_description = fields.Text('Description')
|
||||
ks_active = fields.Boolean('Active Description', default=True)
|
||||
@@ -1,34 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import base64
|
||||
import logging
|
||||
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
from odoo import fields, models, _
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class KsDashboardNInjaImport(models.TransientModel):
|
||||
_name = 'ks_dashboard_ninja.import'
|
||||
_description = 'Import Dashboard'
|
||||
|
||||
ks_import_dashboard = fields.Binary(string="Upload Dashboard", attachment=True)
|
||||
ks_top_menu_id = fields.Many2one('ir.ui.menu', string="Show Under Menu", domain="[('parent_id','=',False)]",
|
||||
required=True,
|
||||
default=lambda self: self.env['ir.ui.menu'].search(
|
||||
[('name', '=', 'My Dashboards')]))
|
||||
|
||||
def ks_do_action(self):
|
||||
for rec in self:
|
||||
try:
|
||||
ks_result = base64.b64decode(rec.ks_import_dashboard)
|
||||
self.env['ks_dashboard_ninja.board'].ks_import_dashboard(ks_result, self.ks_top_menu_id)
|
||||
return {
|
||||
'type': 'ir.actions.client',
|
||||
'tag': 'reload',
|
||||
}
|
||||
except Exception as E:
|
||||
_logger.warning(E)
|
||||
raise ValidationError(_(str(E)))
|
||||
@@ -1,28 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from odoo import models, fields
|
||||
|
||||
|
||||
class KsDashboardNinjaBoardItemAction(models.TransientModel):
|
||||
_name = 'ks_ninja_dashboard.item_action'
|
||||
_description = 'Dashboard Ninja Item Actions'
|
||||
|
||||
name = fields.Char()
|
||||
ks_dashboard_item_ids = fields.Many2many("ks_dashboard_ninja.item", string="Dashboard Items")
|
||||
ks_action = fields.Selection([('move', 'Move'),
|
||||
('duplicate', 'Duplicate'),
|
||||
], string="Action")
|
||||
ks_dashboard_ninja_id = fields.Many2one("ks_dashboard_ninja.board", string="Select Dashboard")
|
||||
ks_dashboard_ninja_ids = fields.Many2many("ks_dashboard_ninja.board", string="Select Dashboards")
|
||||
|
||||
# Move or Copy item to another dashboard action
|
||||
|
||||
def action_item_move_copy_action(self):
|
||||
if self.ks_action == 'move':
|
||||
for item in self.ks_dashboard_item_ids:
|
||||
item.ks_dashboard_ninja_board_id = self.ks_dashboard_ninja_id
|
||||
elif self.ks_action == 'duplicate':
|
||||
# Using sudo here to allow creating same item without any security error
|
||||
for dashboard_id in self.ks_dashboard_ninja_ids:
|
||||
for item in self.ks_dashboard_item_ids:
|
||||
item.sudo().copy({'ks_dashboard_ninja_board_id': dashboard_id.id})
|
||||
@@ -1,34 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import json
|
||||
import logging
|
||||
|
||||
import requests
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
from odoo import fields, models, _
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class KsAIDashboardFetch(models.TransientModel):
|
||||
_name = 'ks_dashboard_ninja.fetch_key'
|
||||
_description = 'Fetch API key'
|
||||
|
||||
ks_email_id = fields.Char(string="Email ID")
|
||||
ks_api_key =fields.Char(string="Generated AI API Key")
|
||||
ks_show_api_key = fields.Boolean(string="Show key",default=False)
|
||||
|
||||
def ks_fetch_details(self):
|
||||
url = self.env['ir.config_parameter'].sudo().get_param(
|
||||
'ks_dashboard_ninja.url')
|
||||
if url and self.ks_email_id:
|
||||
url = url + "/api/v1/ks_dn_fetch_api"
|
||||
json_data = {'email':self.ks_email_id}
|
||||
ks_ai_response = requests.post(url,data=json_data)
|
||||
if ks_ai_response.status_code == 200:
|
||||
ks_ai_response = json.loads(ks_ai_response.text)
|
||||
self.ks_api_key = ks_ai_response
|
||||
self.ks_show_api_key = True
|
||||
else:
|
||||
raise ValidationError(_("Error generates with following status %s"),ks_ai_response.status_code)
|
||||
@@ -1,57 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import json
|
||||
|
||||
import requests
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
from odoo import fields, models, _
|
||||
|
||||
|
||||
class ResConfig(models.TransientModel):
|
||||
_inherit = "res.config.settings"
|
||||
|
||||
dn_api_key = fields.Char(string="Dashboard AI API Key",store=True,
|
||||
config_parameter='ks_dashboard_ninja.dn_api_key')
|
||||
enable_chart_zoom = fields.Boolean(string="Enable Zooming for charts", store=True,
|
||||
config_parameter='ks_dashboard_ninja.enable_chart_zoom')
|
||||
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:
|
||||
url = self.url + "/api/v1/ks_dn_fetch_api"
|
||||
json_data = {'email':self.ks_email_id,
|
||||
'url':self.env['ir.config_parameter'].sudo().get_param('web.base.url'),
|
||||
'db_name':self.env.cr.dbname
|
||||
}
|
||||
ks_ai_response = requests.post(url,data=json_data)
|
||||
except Exception as e:
|
||||
raise ValidationError(_("Please enter correct URL"))
|
||||
if ks_ai_response.status_code == 200:
|
||||
try:
|
||||
ks_ai_response = json.loads(ks_ai_response.text)
|
||||
except Exception as e:
|
||||
ks_ai_response = False
|
||||
if ks_ai_response == "success":
|
||||
return {
|
||||
'type': 'ir.actions.client',
|
||||
'tag': 'display_notification',
|
||||
'params': {
|
||||
'title': _('Success'),
|
||||
'message': 'API key sent on Email ID',
|
||||
'sticky': False,
|
||||
}
|
||||
}
|
||||
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(_("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"))
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
xlrd==2.0.1
|
||||
openpyxl == 3.1.2
|
||||
gTTS == 2.5.1
|
||||
pandas==2.1.2
|
||||
SQLAlchemy==2.0.32
|
||||
@@ -1,36 +0,0 @@
|
||||
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,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,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,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,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
|
||||
access_ks_dashboard_ninja_favourite_filters,ks_dashboard_ninja.favourite_filters,model_ks_dashboard_ninja_favourite_filters,,1,1,1,1
|
||||
|
@@ -1,59 +0,0 @@
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
|
||||
<record id="ir_rule_ks_dashboard_item_company_restrictions" model="ir.rule">
|
||||
<field name="name">Dashboard Item Company Restriction: User Can only view their company and sub companies
|
||||
items.
|
||||
</field>
|
||||
<field name="model_id" ref="model_ks_dashboard_ninja_item"/>
|
||||
<field name="domain_force">
|
||||
['|',('ks_company_id','in', company_ids),('ks_company_id','=',False)]</field>
|
||||
<field name="perm_create" eval="True"/>
|
||||
<field name="perm_unlink" eval="True"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="True"/>
|
||||
</record>
|
||||
|
||||
<record id="ir_rule_ks_accessible_dashboards" model="ir.rule">
|
||||
<field name="name">Dashboard Record Level Groups Access: Show dashboards matching user's assigned groups.</field>
|
||||
<field name="model_id" ref="model_ks_dashboard_ninja_board"/>
|
||||
<field name="domain_force">['|', ('ks_dashboard_group_access', '=' , False), ('ks_dashboard_group_access','in', user.groups_id.ids)]</field>
|
||||
<field name="groups" eval="[(4, ref('base.group_user'))]" />
|
||||
</record>
|
||||
|
||||
<record id="ir_rule_ks_accessible_child_dashboards" model="ir.rule">
|
||||
<field name="name">Child Dashboard Record Level Groups Access: Show dashboards matching user's assigned groups.</field>
|
||||
<field name="model_id" ref="model_ks_dashboard_ninja_child_board"/>
|
||||
<field name="domain_force">['|', ('ks_computed_group_access', '=', False), ('ks_computed_group_access', 'in', user.groups_id.ids)]</field>
|
||||
<field name="groups" eval="[(4, ref('base.group_user'))]" />
|
||||
</record>
|
||||
|
||||
<record id="ir_rule_ks_admin_accessible_dashboards" model="ir.rule">
|
||||
<field name="name">Dashboard Record Level Groups Access: Show all dashboards to admin regardless of assigned groups.</field>
|
||||
<field name="model_id" ref="model_ks_dashboard_ninja_board"/>
|
||||
<field name="domain_force">[(1, '=', 1)]</field>
|
||||
<field name="groups" eval="[Command.link(ref('base.group_system'))]"/>
|
||||
</record>
|
||||
|
||||
<record id="ir_rule_ks_admin_accessible_child_dashboards" model="ir.rule">
|
||||
<field name="name">Child Dashboard Record Level Groups Access: Show all dashboards to admin regardless of assigned groups.</field>
|
||||
<field name="model_id" ref="model_ks_dashboard_ninja_child_board"/>
|
||||
<field name="domain_force">[(1, '=', 1)]</field>
|
||||
<field name="groups" eval="[Command.link(ref('base.group_system'))]"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.module.category" id="ks_dashboard_ninja_security_groups">
|
||||
<field name="name">Dashboard Ninja Rights</field>
|
||||
</record>
|
||||
|
||||
<record model="res.groups" id="ks_dashboard_ninja_group_manager">
|
||||
<field name="name">Show Full Dashboard Features</field>
|
||||
<field name="category_id" ref="ks_dashboard_ninja.ks_dashboard_ninja_security_groups"/>
|
||||
</record>
|
||||
|
||||
<record id="base.group_system" model="res.groups">
|
||||
<field name="implied_ids" eval="[(4, ref('ks_dashboard_ninja.ks_dashboard_ninja_group_manager'))]"/>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
Before Width: | Height: | Size: 2.1 MiB |
|
Before Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 923 KiB |
|
Before Width: | Height: | Size: 362 KiB |
|
Before Width: | Height: | Size: 777 KiB |
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 910 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 459 KiB |
|
Before Width: | Height: | Size: 592 KiB |
|
Before Width: | Height: | Size: 128 KiB |
|
Before Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 170 KiB |
|
Before Width: | Height: | Size: 175 KiB |
|
Before Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 608 KiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 298 KiB |
|
Before Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 137 KiB |
|
Before Width: | Height: | Size: 7.5 MiB |
|
Before Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 730 KiB |
|
Before Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 200 KiB |
|
Before Width: | Height: | Size: 368 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 282 B |
@@ -1,3 +0,0 @@
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5.19727 11.62L9.0006 7.81667C9.44977 7.3675 9.44977 6.6325 9.0006 6.18334L5.19727 2.38" fill="#E84A5F"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 218 B |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 663 B |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 902 B |
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 148 KiB |
@@ -1,4 +0,0 @@
|
||||
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M14.3951 2.03003H9.69505C8.65505 2.03003 7.80505 2.87003 7.80505 3.91003V4.85003C7.80505 5.89003 8.64505 6.73003 9.68505 6.73003H14.3951C15.4351 6.73003 16.2751 5.89003 16.2751 4.85003V3.91003C16.2851 2.87003 15.4351 2.03003 14.3951 2.03003Z" fill="white"/>
|
||||
<path d="M17.2851 4.85001C17.2851 6.44001 15.9851 7.74001 14.3951 7.74001H9.69508C8.10508 7.74001 6.80508 6.44001 6.80508 4.85001C6.80508 4.29001 6.20508 3.94001 5.70508 4.20001C4.29508 4.95001 3.33508 6.44001 3.33508 8.15001V17.56C3.33508 20.02 5.34508 22.03 7.80508 22.03H16.2851C18.7451 22.03 20.7551 20.02 20.7551 17.56V8.15001C20.7551 6.44001 19.7951 4.95001 18.3851 4.20001C17.8851 3.94001 17.2851 4.29001 17.2851 4.85001ZM12.4251 16.98H8.04508C7.63508 16.98 7.29508 16.64 7.29508 16.23C7.29508 15.82 7.63508 15.48 8.04508 15.48H12.4251C12.8351 15.48 13.1751 15.82 13.1751 16.23C13.1751 16.64 12.8351 16.98 12.4251 16.98ZM15.0451 12.98H8.04508C7.63508 12.98 7.29508 12.64 7.29508 12.23C7.29508 11.82 7.63508 11.48 8.04508 11.48H15.0451C15.4551 11.48 15.7951 11.82 15.7951 12.23C15.7951 12.64 15.4551 12.98 15.0451 12.98Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,4 +0,0 @@
|
||||
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M16 13.3502V17.5502C16 21.0502 14.6 22.4502 11.1 22.4502H6.9C3.4 22.4502 2 21.0502 2 17.5502V13.3502C2 9.85019 3.4 8.4502 6.9 8.4502H11.1C14.6 8.4502 16 9.85019 16 13.3502Z" fill="#E84A5F"/>
|
||||
<path d="M17.0998 2.4502H12.8998C9.81668 2.4502 8.37074 3.54428 8.06951 6.18921C8.00649 6.74254 8.46476 7.2002 9.02167 7.2002H11.0998C15.2998 7.2002 17.2498 9.1502 17.2498 13.3502V15.4283C17.2498 15.9852 17.7074 16.4435 18.2608 16.3805C20.9057 16.0792 21.9998 14.6333 21.9998 11.5502V7.3502C21.9998 3.8502 20.5998 2.4502 17.0998 2.4502Z" fill="#E84A5F"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 658 B |
@@ -1,288 +0,0 @@
|
||||
<svg width="308" height="308" viewBox="0 0 308 308" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M154.12 297.228C75.3497 297.228 11.4935 260.361 11.4935 214.882C11.4935 169.404 75.3497 132.537 154.12 132.537C232.891 132.537 296.747 169.404 296.747 214.882C296.747 260.361 232.891 297.228 154.12 297.228Z" fill="white"/>
|
||||
<path d="M108.479 236.589C108.436 235.301 108.881 233.847 109.618 232.585C109.769 232.325 109.933 232.076 110.107 231.836C110.116 231.825 110.124 231.813 110.132 231.801C110.302 231.571 110.48 231.352 110.667 231.145C110.683 231.127 110.7 231.11 110.717 231.092C110.902 230.892 111.094 230.704 111.294 230.533C111.312 230.518 111.33 230.505 111.348 230.49C111.553 230.318 111.764 230.16 111.981 230.024C112.105 229.947 112.228 229.878 112.349 229.817C112.406 229.789 112.461 229.768 112.516 229.743C112.58 229.715 112.645 229.682 112.708 229.658C112.801 229.623 112.891 229.597 112.982 229.571C113.006 229.564 113.032 229.553 113.056 229.547C113.163 229.52 113.268 229.5 113.372 229.486C113.378 229.485 113.385 229.483 113.391 229.482C113.828 229.425 114.226 229.489 114.567 229.662L114.569 229.663C114.571 229.664 114.574 229.664 114.576 229.666L114.577 229.664C117.835 231.299 136.613 243.245 145.253 248.63L149.536 251.23C149.661 251.297 149.763 251.404 149.852 251.529C149.863 251.544 149.873 251.559 149.884 251.575C149.92 251.632 149.953 251.692 149.982 251.759C150 251.799 150.013 251.844 150.027 251.888C150.045 251.943 150.064 251.995 150.077 252.055C150.085 252.091 150.088 252.131 150.095 252.168C150.292 252.274 150.532 252.405 150.802 252.556L151.435 252.897C152.787 251.59 154.421 250.374 156.319 249.278C162.242 245.858 170.091 243.975 178.419 243.975C186.748 243.975 194.596 245.859 200.518 249.278C206.654 252.82 210.033 257.605 210.033 262.749C210.033 267.893 206.654 272.677 200.519 276.219C194.596 279.639 186.748 281.522 178.419 281.522C170.091 281.522 162.242 279.638 156.319 276.219C150.183 272.677 146.805 267.893 146.805 262.749C146.805 260.43 147.497 258.185 148.814 256.093L148.249 255.788C147.784 256.044 147.356 256.078 147.036 255.906L147.01 255.892C144.077 254.277 115.494 242.096 109.65 238.962L109.648 238.962C109.647 238.961 109.646 238.96 109.644 238.96C108.961 238.591 108.518 237.773 108.479 236.589ZM159.02 271.539C164.135 274.493 171.024 276.119 178.418 276.119C185.813 276.119 192.703 274.493 197.817 271.539C202.211 269.003 204.63 265.881 204.63 262.748C204.63 259.615 202.211 256.492 197.817 253.956C192.703 251.003 185.814 249.377 178.418 249.377C171.023 249.377 164.134 251.003 159.02 253.956C154.626 256.492 152.206 259.615 152.206 262.748C152.207 265.881 154.626 269.003 159.02 271.539Z" fill="#E0E0E0"/>
|
||||
<path d="M104.114 164.228L133.107 147.453C134.58 146.603 136.969 146.603 138.442 147.453L285.72 232.484C287.192 233.335 287.192 234.714 285.72 235.564L256.727 252.339C255.254 253.19 252.865 253.19 251.392 252.339L196.2 220.473L187.716 225.405C183.224 227.999 175.94 228 171.447 225.407L146.156 210.912C141.663 208.319 141.662 204.115 146.155 201.521L154.632 196.592L104.114 167.307C102.641 166.457 102.641 165.078 104.114 164.228Z" fill="#E0E0E0"/>
|
||||
<path d="M171.444 222.959L149.653 210.359C147.407 209.063 146.284 207.363 146.284 205.664C146.284 203.963 146.275 202.632 146.275 202.632L166.779 190.994C167.977 190.302 168.948 188.62 168.948 187.237V160.372L207.009 182.365L207.01 209.23C207.01 210.614 206.039 212.295 204.841 212.987L187.713 222.959C183.22 225.552 175.936 225.552 171.444 222.959Z" fill="#37474F"/>
|
||||
<path d="M197.872 213.988V217.005L204.847 212.985C206.037 212.297 207.014 210.618 207.014 209.228V182.366L199.763 178.183C199.612 180.024 199.45 181.927 199.3 183.781L204.384 186.724V207.714C204.384 209.104 203.42 210.782 202.217 211.471L197.872 213.988Z" fill="#263238"/>
|
||||
<path d="M204.385 207.718C204.385 209.101 203.414 210.783 202.216 211.475L187.716 219.928C183.224 222.522 175.939 222.523 171.447 219.93L149.646 207.332C145.152 204.739 145.152 200.535 149.644 197.941L164.155 189.48C165.353 188.788 166.324 187.107 166.324 185.723V164.731L204.386 186.724L204.385 207.718Z" fill="#455A64"/>
|
||||
<path opacity="0.15" d="M159.736 192.035V192.032L164.154 189.481C165.352 188.789 166.324 187.107 166.324 185.724V164.732L204.385 186.725V207.718C204.385 209.102 203.414 210.783 202.216 211.475L197.874 213.982L159.736 192.035Z" fill="black"/>
|
||||
<path d="M146.279 202.635C146.279 202.635 146.279 203.962 146.279 205.665C146.279 207.369 147.407 209.059 149.648 210.362L171.442 222.954C173.596 224.206 176.389 224.832 179.207 224.883V221.864C176.389 221.827 173.596 221.176 171.442 219.936L149.648 207.331C147.407 206.041 146.279 204.338 146.279 202.635Z" fill="#37474F"/>
|
||||
<path d="M265.497 236.701C264.092 237.512 261.739 237.468 260.241 236.604C241.529 225.8 131.758 162.426 113.049 151.624C111.551 150.759 110.339 148.657 110.339 146.928V18.0924C110.339 16.3633 111.477 14.304 112.882 13.4934C114.286 12.6827 116.64 12.7258 118.136 13.5907L265.327 98.5697C266.825 99.4346 268.039 101.537 268.039 103.266L268.04 232.101C268.04 233.83 266.901 235.89 265.497 236.701Z" fill="#455A64"/>
|
||||
<path d="M260.241 236.601L113.049 151.621C111.552 150.756 110.337 148.654 110.337 146.925V18.0891C110.337 16.3599 111.551 15.6589 113.049 16.5238L260.239 101.503C261.737 102.368 262.951 104.471 262.951 106.2L262.953 235.035C262.953 236.764 261.739 237.465 260.241 236.601Z" fill="#37474F"/>
|
||||
<path d="M257.866 218.016L257.865 107.888C257.865 106.851 257.137 105.589 256.238 105.07L117.055 24.7119C116.156 24.1932 115.428 24.6139 115.428 25.6513L115.424 135.782C115.424 136.819 116.152 138.08 117.05 138.599L256.24 218.955C257.138 219.474 257.866 219.053 257.866 218.016Z" fill="#E84A5F"/>
|
||||
<path opacity="0.7" d="M257.866 218.016L257.865 107.888C257.865 106.851 257.137 105.589 256.238 105.07L117.055 24.7119C116.156 24.1932 115.428 24.6139 115.428 25.6513L115.424 135.782C115.424 136.819 116.152 138.08 117.05 138.599L256.24 218.955C257.138 219.474 257.866 219.053 257.866 218.016Z" fill="white"/>
|
||||
<path d="M186.923 188.897C187.219 188.897 187.494 188.826 187.739 188.685C188.319 188.35 188.639 187.671 188.639 186.771C188.639 185.024 187.453 182.972 185.941 182.098C185.161 181.649 184.412 181.586 183.834 181.92C183.254 182.254 182.935 182.934 182.935 183.834C182.934 185.581 184.119 187.633 185.633 188.507C186.081 188.765 186.521 188.897 186.923 188.897ZM184.651 182.324C184.945 182.324 185.279 182.427 185.632 182.631C186.95 183.392 188.022 185.249 188.022 186.771C188.022 187.44 187.812 187.931 187.431 188.151C187.05 188.37 186.52 188.306 185.939 187.972C184.621 187.211 183.549 185.354 183.549 183.832C183.549 183.163 183.759 182.672 184.141 182.452C184.29 182.367 184.462 182.324 184.651 182.324Z" fill="#E84A5F"/>
|
||||
<path d="M91.2493 45.436L234.599 128.101L234.598 233.753C234.599 235.16 233.076 236.045 231.858 235.341L229.303 233.866L93.9221 155.807C92.4498 154.957 91.2493 152.889 91.2493 151.179V45.436Z" fill="#F0F0F0"/>
|
||||
<path d="M91.8652 46.5023V151.18C91.8652 152.659 92.9482 154.533 94.2295 155.273L229.611 233.333L232.166 234.809C232.355 234.918 232.556 234.972 232.765 234.972C233.076 234.972 233.385 234.847 233.614 234.627C233.851 234.398 233.983 234.088 233.982 233.753L233.983 128.457L91.8652 46.5023ZM91.2493 45.436L234.599 128.101L234.598 233.753C234.599 234.821 233.721 235.588 232.765 235.588C232.462 235.588 232.151 235.511 231.858 235.342L229.303 233.867L93.9221 155.807C92.4498 154.957 91.2493 152.889 91.2493 151.18V45.436Z" fill="#E0E0E0"/>
|
||||
<path opacity="0.8" d="M94.6492 43.4731L238.008 126.134L234.599 128.102L91.2495 45.4363L94.6492 43.4731Z" fill="#455A64"/>
|
||||
<path d="M233.638 235.367C233.638 235.367 234.598 234.897 234.598 233.754L234.598 131.144C234.598 130.303 234.598 128.101 234.598 128.101L238.007 126.133L238.012 231.201C238.012 231.331 238.003 231.461 237.986 231.591C237.864 232.457 237.353 233.228 236.591 233.661L233.777 235.289L233.638 235.367Z" fill="#EBEBEB"/>
|
||||
<path d="M238.008 126.179V119.051C238.008 118.2 237.413 117.163 236.678 116.734L95.9792 35.6243C95.2449 35.195 94.0523 35.1919 93.3156 35.6175L92.5831 36.0407C91.8464 36.4658 91.2495 37.5 91.2495 38.3507V45.4908L234.599 128.146L238.008 126.179Z" fill="#E84A5F"/>
|
||||
<path opacity="0.3" d="M238.008 126.179V119.051C238.008 118.2 237.413 117.163 236.678 116.734L95.9792 35.6243C95.2449 35.195 94.0523 35.1919 93.3156 35.6175L92.5831 36.0407C91.8464 36.4658 91.2495 37.5 91.2495 38.3507V45.4908L234.599 128.146L238.008 126.179Z" fill="black"/>
|
||||
<path d="M234.599 121.019C234.599 120.169 234.004 119.131 233.269 118.703L92.5786 37.5877C91.8443 37.1584 91.2493 37.5002 91.2493 38.3509V45.491L234.599 128.146V121.019Z" fill="#E84A5F"/>
|
||||
<path opacity="0.4" d="M234.599 121.019C234.599 120.169 234.004 119.131 233.269 118.703L92.5786 37.5877C91.8443 37.1584 91.2493 37.5002 91.2493 38.3509V45.491L234.599 128.146V121.019Z" fill="black"/>
|
||||
<path d="M234.211 119.702C234.451 120.121 234.599 120.595 234.599 121.02V128.147L238.005 126.182V119.049C238.005 118.624 237.858 118.156 237.617 117.737L234.211 119.702Z" fill="#E84A5F"/>
|
||||
<path opacity="0.5" d="M234.211 119.702C234.451 120.121 234.599 120.595 234.599 121.02V128.147L238.005 126.182V119.049C238.005 118.624 237.858 118.156 237.617 117.737L234.211 119.702Z" fill="black"/>
|
||||
<path d="M97.5049 45.1668C97.5049 45.9645 96.945 46.2879 96.2538 45.8894C95.5627 45.4902 95.0027 44.52 95.0027 43.7223C95.0027 42.9246 95.5627 42.6012 96.2538 42.9997C96.945 43.3989 97.5049 44.3691 97.5049 45.1668Z" fill="#FAFAFA"/>
|
||||
<path d="M102.509 48.057C102.509 48.8547 101.949 49.1781 101.258 48.7795C100.567 48.3804 100.007 47.4102 100.007 46.6124C100.007 45.8147 100.567 45.4913 101.258 45.8899C101.949 46.2884 102.509 47.2586 102.509 48.057Z" fill="#FAFAFA"/>
|
||||
<path d="M107.514 50.9456C107.514 51.7433 106.954 52.0667 106.263 51.6682C105.571 51.2696 105.011 50.2988 105.011 49.5011C105.011 48.7034 105.571 48.38 106.263 48.7785C106.954 49.1777 107.514 50.1479 107.514 50.9456Z" fill="#FAFAFA"/>
|
||||
<path d="M234.599 128.149L234.598 233.754C234.599 235.161 233.076 236.046 231.858 235.342L229.303 233.867L197.977 215.805V107.03L234.599 128.147V128.149Z" fill="#FAFAFA"/>
|
||||
<path d="M195.474 108.814V211.385L94.2542 152.946L94.2548 50.3755L195.474 108.814Z" fill="#FAFAFA"/>
|
||||
<path d="M206.359 119.424L229.721 132.923C230.154 133.173 230.504 133.78 230.504 134.279L230.505 136.711C230.505 137.21 230.154 137.413 229.722 137.163L206.36 123.664C205.927 123.414 205.577 122.807 205.577 122.308L205.576 119.876C205.577 119.376 205.926 119.174 206.359 119.424Z" fill="#E84A5F"/>
|
||||
<path opacity="0.8" d="M206.359 119.424L229.721 132.923C230.154 133.173 230.504 133.78 230.504 134.279L230.505 136.711C230.505 137.21 230.154 137.413 229.722 137.163L206.36 123.664C205.927 123.414 205.577 122.807 205.577 122.308L205.576 119.876C205.577 119.376 205.926 119.174 206.359 119.424Z" fill="#FAFAFA"/>
|
||||
<path d="M201.158 120.389L201.847 119.727C201.71 119.379 201.628 118.997 201.628 118.626C201.628 118.064 201.816 117.633 202.143 117.444C202.392 117.301 202.691 117.313 202.981 117.481C203.588 117.832 204.063 118.814 204.063 119.719C204.063 120.281 203.875 120.712 203.548 120.901C203.433 120.967 203.308 121 203.178 121C203.026 121 202.866 120.954 202.71 120.864C202.481 120.732 202.271 120.51 202.099 120.237L201.534 120.78C201.481 120.831 201.414 120.856 201.346 120.856C201.274 120.856 201.204 120.828 201.15 120.773C201.046 120.665 201.05 120.493 201.158 120.389ZM202.981 120.394C203.1 120.463 203.201 120.475 203.276 120.431C203.388 120.366 203.52 120.141 203.52 119.718C203.52 119.013 203.149 118.204 202.71 117.95C202.637 117.908 202.572 117.887 202.514 117.887C202.477 117.887 202.443 117.896 202.413 117.913C202.301 117.978 202.17 118.203 202.17 118.626C202.17 119.331 202.541 120.141 202.981 120.394Z" fill="#455A64"/>
|
||||
<path d="M229.934 144.301L230.458 144.604C230.489 144.622 230.514 144.603 230.514 144.561V143.143C230.514 143.102 230.489 143.053 230.458 143.036L229.934 142.734C229.903 142.716 229.878 142.735 229.878 142.776V144.195C229.878 144.236 229.903 144.284 229.934 144.301Z" fill="#455A64"/>
|
||||
<path d="M229.149 143.849L229.673 144.151C229.704 144.169 229.729 144.15 229.729 144.109V142.69C229.729 142.649 229.704 142.601 229.673 142.584L229.149 142.281C229.118 142.263 229.093 142.282 229.093 142.324V143.742C229.093 143.784 229.118 143.831 229.149 143.849Z" fill="#455A64"/>
|
||||
<path d="M228.365 143.395L228.889 143.698C228.92 143.715 228.945 143.696 228.945 143.656V142.237C228.945 142.196 228.92 142.148 228.889 142.13L228.365 141.828C228.334 141.81 228.309 141.829 228.309 141.87V143.289C228.309 143.329 228.334 143.377 228.365 143.395Z" fill="#455A64"/>
|
||||
<path d="M229.934 146.132L230.458 146.434C230.489 146.452 230.514 146.433 230.514 146.391V144.973C230.514 144.932 230.489 144.884 230.458 144.866L229.934 144.564C229.903 144.546 229.878 144.565 229.878 144.606V146.025C229.878 146.066 229.903 146.114 229.934 146.132Z" fill="#455A64"/>
|
||||
<path d="M229.149 145.678L229.673 145.98C229.704 145.998 229.729 145.979 229.729 145.938V144.519C229.729 144.478 229.704 144.431 229.673 144.413L229.149 144.11C229.118 144.092 229.093 144.111 229.093 144.153V145.571C229.093 145.612 229.118 145.66 229.149 145.678Z" fill="#455A64"/>
|
||||
<path d="M228.364 145.224L228.888 145.527C228.919 145.545 228.944 145.526 228.944 145.484V144.066C228.944 144.024 228.919 143.977 228.888 143.959L228.364 143.657C228.333 143.639 228.308 143.658 228.308 143.699V145.118C228.308 145.158 228.333 145.206 228.364 145.224Z" fill="#455A64"/>
|
||||
<path d="M229.851 150.965L230.496 150.572C230.52 150.557 230.52 150.5 230.496 150.456L229.851 149.318C229.819 149.263 229.774 149.271 229.774 149.332V150.862C229.774 150.923 229.819 150.984 229.851 150.965Z" fill="#455A64"/>
|
||||
<path d="M230.123 150.096L229.274 149.606V150.009L230.123 150.5C230.195 150.542 230.254 150.484 230.254 150.373C230.254 150.263 230.195 150.138 230.123 150.096Z" fill="#455A64"/>
|
||||
<path d="M229.116 149.515L228.826 149.348V149.751L229.116 149.919V149.515Z" fill="#455A64"/>
|
||||
<path d="M228.044 149.098V150.584C228.044 150.697 228.103 150.82 228.175 150.861C228.247 150.903 228.306 150.848 228.306 150.735V149.452L228.666 149.66V149.256L228.175 148.973C228.103 148.93 228.044 148.988 228.044 149.098Z" fill="#455A64"/>
|
||||
<path d="M229.6 154.293C230.202 154.707 230.61 155.85 230.495 156.695C230.389 157.468 229.93 157.439 229.88 157.797C229.874 157.836 229.849 157.85 229.821 157.834L229.247 157.508C229.219 157.492 229.194 157.449 229.188 157.403C229.128 156.93 228.542 156.358 228.538 155.208C228.534 154.324 229.018 153.892 229.6 154.293Z" fill="#455A64"/>
|
||||
<path d="M229.257 158.434L229.812 158.754C229.85 158.776 229.881 158.753 229.881 158.703V158.192C229.881 158.141 229.85 158.082 229.812 158.061L229.257 157.74C229.219 157.718 229.188 157.742 229.188 157.792V158.303C229.189 158.353 229.22 158.412 229.257 158.434Z" fill="#455A64"/>
|
||||
<path d="M229.467 142.311C229.977 142.731 230.388 143.603 230.471 144.437C230.52 144.922 230.459 145.318 230.325 145.599L230.512 146.568C230.527 146.648 230.483 146.69 230.437 146.64L229.879 146.031C229.646 146.105 229.365 146.039 229.066 145.793C228.555 145.37 228.141 144.498 228.06 143.663C227.929 142.307 228.636 141.627 229.467 142.311ZM229.266 145.487C229.78 145.784 230.198 145.381 230.198 144.59C230.198 143.798 229.78 142.914 229.266 142.617C228.752 142.32 228.334 142.723 228.334 143.514C228.334 144.305 228.752 145.19 229.266 145.487Z" fill="#455A64"/>
|
||||
<path d="M229.467 161.005C229.977 161.426 230.388 162.298 230.471 163.131C230.52 163.617 230.459 164.013 230.325 164.294L230.512 165.263C230.527 165.343 230.483 165.385 230.437 165.334L229.879 164.725C229.646 164.799 229.365 164.733 229.066 164.487C228.555 164.065 228.141 163.192 228.06 162.358C227.929 161.002 228.636 160.322 229.467 161.005ZM229.266 164.181C229.78 164.478 230.198 164.076 230.198 163.284C230.198 162.493 229.78 161.608 229.266 161.311C228.752 161.014 228.334 161.416 228.334 162.208C228.334 162.999 228.752 163.885 229.266 164.181Z" fill="#455A64"/>
|
||||
<path d="M228.679 167.855C228.679 168.273 228.899 168.74 229.171 168.896C229.442 169.053 229.662 168.841 229.662 168.423C229.662 168.005 229.442 167.538 229.171 167.382C228.899 167.225 228.679 167.437 228.679 167.855Z" fill="#455A64"/>
|
||||
<path d="M227.834 168.004C227.834 168.283 227.981 168.593 228.162 168.698C228.343 168.803 228.49 168.662 228.49 168.383C228.49 168.104 228.343 167.794 228.162 167.689C227.981 167.584 227.834 167.725 227.834 168.004Z" fill="#455A64"/>
|
||||
<path d="M228.59 170.838L229.751 171.509V170.039C229.751 169.729 229.563 169.37 229.331 169.236L229.01 169.051C228.778 168.917 228.59 169.059 228.59 169.369L228.59 170.838Z" fill="#455A64"/>
|
||||
<path d="M228.11 168.867L228.43 169.051V170.746L227.827 170.398V169.081C227.826 168.873 227.953 168.777 228.11 168.867Z" fill="#455A64"/>
|
||||
<path d="M230.507 169.548C230.507 169.826 230.361 169.967 230.18 169.863C229.999 169.758 229.852 169.448 229.852 169.169C229.852 168.891 229.999 168.75 230.18 168.854C230.361 168.959 230.507 169.269 230.507 169.548Z" fill="#455A64"/>
|
||||
<path d="M230.231 170.092L229.912 169.908V171.602L230.515 171.95V170.634C230.515 170.425 230.388 170.182 230.231 170.092Z" fill="#455A64"/>
|
||||
<path d="M224.833 140.978L211.154 133.08C210.785 132.868 210.487 133.019 210.487 133.418C210.487 133.817 210.786 134.312 211.154 134.525L224.833 142.423C225.202 142.636 225.5 142.485 225.5 142.085C225.5 141.686 225.201 141.19 224.833 140.978Z" fill="#E0E0E0"/>
|
||||
<path d="M224.833 147.417L211.154 139.519C210.785 139.307 210.487 139.458 210.487 139.857C210.487 140.256 210.786 140.751 211.154 140.964L224.833 148.862C225.202 149.075 225.5 148.924 225.5 148.524C225.5 148.125 225.201 147.629 224.833 147.417Z" fill="#E0E0E0"/>
|
||||
<path d="M224.833 153.856L211.154 145.959C210.785 145.746 210.487 145.897 210.487 146.296C210.487 146.695 210.786 147.191 211.154 147.404L224.833 155.301C225.202 155.514 225.5 155.363 225.5 154.964C225.5 154.565 225.201 154.069 224.833 153.856Z" fill="#E0E0E0"/>
|
||||
<path d="M224.833 160.295L211.154 152.398C210.785 152.185 210.487 152.336 210.487 152.735C210.487 153.134 210.786 153.63 211.154 153.843L224.833 161.74C225.202 161.953 225.5 161.802 225.5 161.403C225.5 161.004 225.201 160.508 224.833 160.295Z" fill="#E0E0E0"/>
|
||||
<path d="M224.833 166.734L211.154 158.836C210.785 158.624 210.487 158.774 210.487 159.174C210.487 159.573 210.786 160.069 211.154 160.281L224.833 168.179C225.202 168.391 225.5 168.241 225.5 167.841C225.5 167.442 225.201 166.946 224.833 166.734Z" fill="#E0E0E0"/>
|
||||
<path d="M222.331 171.991L208.652 164.093C208.284 163.881 207.985 164.032 207.985 164.431C207.985 164.83 208.284 165.326 208.652 165.539L222.331 173.436C222.7 173.649 222.999 173.498 222.999 173.099C222.998 172.7 222.699 172.204 222.331 171.991Z" fill="#455A64"/>
|
||||
<path d="M222.331 176.341L208.652 168.443C208.284 168.231 207.985 168.382 207.985 168.781C207.985 169.18 208.284 169.676 208.652 169.889L222.331 177.786C222.7 177.999 222.999 177.848 222.999 177.449C222.998 177.05 222.699 176.554 222.331 176.341Z" fill="#E0E0E0"/>
|
||||
<path d="M222.331 180.691L208.652 172.793C208.284 172.581 207.985 172.731 207.985 173.131C207.985 173.53 208.284 174.025 208.652 174.238L222.331 182.136C222.7 182.348 222.999 182.198 222.999 181.798C222.998 181.399 222.699 180.903 222.331 180.691Z" fill="#E0E0E0"/>
|
||||
<path d="M219.668 183.455L205.989 175.558C205.62 175.345 205.322 175.496 205.322 175.895C205.322 176.294 205.621 176.79 205.989 177.003L219.668 184.901C220.037 185.113 220.335 184.962 220.335 184.563C220.335 184.164 220.037 183.668 219.668 183.455Z" fill="#E0E0E0"/>
|
||||
<path d="M222.866 187.198L221.755 185.238C221.713 185.164 221.713 185.065 221.755 185.039L222.866 184.362C222.919 184.329 222.998 184.432 222.998 184.537V187.174C222.998 187.279 222.919 187.293 222.866 187.198Z" fill="#455A64"/>
|
||||
<path d="M219.668 187.79L205.989 179.893C205.62 179.68 205.322 179.831 205.322 180.23C205.322 180.629 205.621 181.125 205.989 181.338L219.668 189.235C220.037 189.447 220.335 189.297 220.335 188.897C220.335 188.499 220.037 188.003 219.668 187.79Z" fill="#E0E0E0"/>
|
||||
<path d="M222.866 191.533L221.755 189.573C221.713 189.498 221.713 189.4 221.755 189.374L222.866 188.696C222.919 188.663 222.998 188.767 222.998 188.872V191.509C222.998 191.613 222.919 191.627 222.866 191.533Z" fill="#455A64"/>
|
||||
<path d="M219.668 192.124L205.989 184.227C205.62 184.014 205.322 184.165 205.322 184.564C205.322 184.963 205.621 185.459 205.989 185.672L219.668 193.57C220.037 193.782 220.335 193.631 220.335 193.232C220.335 192.833 220.037 192.337 219.668 192.124Z" fill="#E0E0E0"/>
|
||||
<path d="M222.866 195.866L221.755 193.906C221.713 193.832 221.713 193.733 221.755 193.707L222.866 193.03C222.919 192.997 222.998 193.1 222.998 193.205V195.842C222.998 195.947 222.919 195.961 222.866 195.866Z" fill="#455A64"/>
|
||||
<path d="M219.668 196.459L205.989 188.562C205.62 188.349 205.322 188.5 205.322 188.899C205.322 189.298 205.621 189.794 205.989 190.007L219.668 197.905C220.037 198.117 220.335 197.966 220.335 197.567C220.335 197.168 220.037 196.672 219.668 196.459Z" fill="#E0E0E0"/>
|
||||
<path d="M222.866 200.202L221.755 198.241C221.713 198.167 221.713 198.068 221.755 198.042L222.866 197.366C222.919 197.333 222.998 197.436 222.998 197.541V200.178C222.998 200.282 222.919 200.296 222.866 200.202Z" fill="#455A64"/>
|
||||
<path d="M219.668 200.793L205.989 192.896C205.62 192.683 205.322 192.834 205.322 193.233C205.322 193.632 205.621 194.128 205.989 194.341L219.668 202.238C220.037 202.451 220.335 202.3 220.335 201.901C220.335 201.502 220.037 201.006 219.668 200.793Z" fill="#E0E0E0"/>
|
||||
<path d="M222.866 204.535L221.755 202.575C221.713 202.5 221.713 202.402 221.755 202.376L222.866 201.699C222.919 201.666 222.998 201.77 222.998 201.875V204.512C222.998 204.616 222.919 204.63 222.866 204.535Z" fill="#455A64"/>
|
||||
<path d="M219.668 205.127L205.989 197.23C205.62 197.017 205.322 197.168 205.322 197.567C205.322 197.966 205.621 198.462 205.989 198.675L219.668 206.572C220.037 206.785 220.335 206.634 220.335 206.235C220.335 205.836 220.037 205.34 219.668 205.127Z" fill="#E0E0E0"/>
|
||||
<path d="M222.866 208.87L221.755 206.91C221.713 206.835 221.713 206.737 221.755 206.711L222.866 206.034C222.919 206.001 222.998 206.105 222.998 206.21V208.847C222.998 208.951 222.919 208.964 222.866 208.87Z" fill="#455A64"/>
|
||||
<path d="M219.668 209.462L205.989 201.565C205.62 201.352 205.322 201.503 205.322 201.902C205.322 202.301 205.621 202.797 205.989 203.01L219.668 210.907C220.037 211.12 220.335 210.969 220.335 210.57C220.335 210.171 220.037 209.675 219.668 209.462Z" fill="#E0E0E0"/>
|
||||
<path d="M222.866 213.204L221.755 211.244C221.713 211.17 221.713 211.071 221.755 211.045L222.866 210.368C222.919 210.336 222.998 210.439 222.998 210.544V213.182C222.998 213.285 222.919 213.299 222.866 213.204Z" fill="#455A64"/>
|
||||
<path d="M219.668 213.796L205.989 205.899C205.62 205.686 205.322 205.837 205.322 206.236C205.322 206.635 205.621 207.131 205.989 207.344L219.668 215.241C220.037 215.454 220.335 215.303 220.335 214.904C220.335 214.505 220.037 214.009 219.668 213.796Z" fill="#E0E0E0"/>
|
||||
<path d="M222.866 217.539L221.755 215.579C221.713 215.504 221.713 215.406 221.755 215.38L222.866 214.703C222.919 214.67 222.998 214.774 222.998 214.878V217.516C222.998 217.62 222.919 217.633 222.866 217.539Z" fill="#455A64"/>
|
||||
<path d="M192.305 122.882L147.343 96.923C146.974 96.7105 146.676 96.193 146.676 95.768V84.3061C146.676 83.881 146.974 83.7085 147.343 83.9211L192.305 109.875C192.673 110.088 192.972 110.605 192.972 111.03V122.497C192.972 122.922 192.673 123.094 192.305 122.882Z" fill="#F0F0F0"/>
|
||||
<path d="M188.385 114.793C188.385 114.787 188.383 114.778 188.38 114.765L188.085 113.534L188.492 113.769C188.502 113.775 188.511 113.775 188.518 113.767C188.526 113.76 188.529 113.749 188.529 113.733V113.511C188.529 113.496 188.526 113.48 188.518 113.464C188.511 113.449 188.502 113.438 188.492 113.432L187.839 113.055C187.828 113.05 187.82 113.05 187.812 113.057C187.805 113.064 187.801 113.076 187.801 113.091V113.286C187.801 113.308 187.809 113.349 187.823 113.406L188.119 114.64C188.123 114.654 188.128 114.669 188.134 114.683C188.139 114.696 188.148 114.707 188.158 114.713L188.351 114.824C188.36 114.829 188.367 114.829 188.373 114.823C188.381 114.817 188.385 114.807 188.385 114.793Z" fill="#455A64"/>
|
||||
<path d="M187.294 112.72C187.226 112.68 187.167 112.662 187.117 112.664C187.068 112.666 187.027 112.685 186.995 112.718C186.963 112.751 186.939 112.798 186.923 112.858C186.907 112.918 186.898 112.985 186.895 113.059C186.893 113.119 186.892 113.181 186.892 113.247C186.892 113.313 186.893 113.375 186.895 113.434C186.898 113.511 186.906 113.589 186.923 113.668C186.939 113.747 186.963 113.821 186.995 113.892C187.027 113.962 187.068 114.027 187.117 114.087C187.167 114.146 187.226 114.195 187.294 114.234C187.362 114.274 187.42 114.292 187.47 114.29C187.519 114.287 187.56 114.27 187.592 114.237C187.625 114.203 187.649 114.156 187.664 114.096C187.68 114.036 187.69 113.969 187.693 113.895C187.695 113.838 187.696 113.777 187.696 113.711C187.696 113.646 187.695 113.582 187.693 113.521C187.69 113.443 187.68 113.365 187.664 113.286C187.649 113.208 187.625 113.133 187.592 113.063C187.56 112.992 187.519 112.927 187.47 112.868C187.42 112.808 187.363 112.759 187.294 112.72ZM187.148 113.569C187.144 113.448 187.144 113.33 187.148 113.216C187.149 113.182 187.153 113.152 187.158 113.125C187.164 113.099 187.171 113.077 187.182 113.062C187.193 113.046 187.207 113.037 187.226 113.035C187.244 113.033 187.266 113.04 187.294 113.056C187.321 113.072 187.344 113.091 187.362 113.115C187.38 113.138 187.395 113.164 187.406 113.192C187.417 113.219 187.424 113.25 187.43 113.283C187.435 113.315 187.439 113.349 187.44 113.385C187.444 113.504 187.444 113.622 187.44 113.738C187.439 113.773 187.436 113.803 187.431 113.83C187.426 113.857 187.418 113.878 187.406 113.893C187.395 113.907 187.38 113.917 187.362 113.919C187.344 113.921 187.321 113.914 187.294 113.898C187.266 113.883 187.244 113.863 187.226 113.84C187.207 113.817 187.193 113.791 187.181 113.763C187.17 113.734 187.162 113.703 187.157 113.671C187.152 113.639 187.148 113.606 187.148 113.569Z" fill="#455A64"/>
|
||||
<path d="M186.348 112.483C186.345 112.537 186.345 112.59 186.348 112.643C186.35 112.686 186.355 112.728 186.363 112.768C186.373 112.81 186.385 112.848 186.403 112.886C186.42 112.923 186.443 112.958 186.469 112.988C186.495 113.018 186.527 113.044 186.562 113.065C186.597 113.086 186.628 113.096 186.654 113.096C186.681 113.095 186.703 113.087 186.719 113.07C186.737 113.052 186.75 113.028 186.759 112.997C186.769 112.967 186.773 112.932 186.775 112.89C186.777 112.864 186.778 112.838 186.778 112.813C186.778 112.788 186.777 112.76 186.775 112.73C186.773 112.687 186.768 112.645 186.759 112.604C186.749 112.563 186.737 112.524 186.719 112.486C186.703 112.449 186.681 112.415 186.654 112.384C186.628 112.353 186.597 112.328 186.562 112.308C186.527 112.287 186.495 112.276 186.469 112.277C186.443 112.277 186.421 112.286 186.404 112.303C186.386 112.32 186.373 112.345 186.363 112.375C186.355 112.406 186.35 112.441 186.348 112.483ZM186.006 112.038C186 112.022 185.993 112.008 185.986 111.997C185.979 111.986 185.97 111.977 185.957 111.969L185.845 111.905C185.834 111.899 185.827 111.899 185.821 111.902C185.814 111.907 185.811 111.915 185.811 111.928C185.811 111.931 185.812 111.935 185.813 111.94C185.814 111.945 185.815 111.95 185.817 111.955L186.493 113.713C186.499 113.729 186.506 113.742 186.512 113.753C186.519 113.764 186.528 113.773 186.542 113.781L186.654 113.846C186.664 113.851 186.672 113.852 186.678 113.848C186.684 113.844 186.687 113.835 186.687 113.822C186.687 113.819 186.687 113.816 186.685 113.811C186.685 113.806 186.684 113.801 186.681 113.796L186.006 112.038ZM186.618 112.789C186.616 112.824 186.612 112.849 186.604 112.863C186.596 112.877 186.583 112.877 186.563 112.866C186.543 112.855 186.529 112.838 186.522 112.815C186.514 112.792 186.509 112.762 186.507 112.725C186.504 112.677 186.504 112.63 186.507 112.585C186.509 112.55 186.514 112.526 186.522 112.511C186.53 112.498 186.543 112.497 186.563 112.508C186.583 112.52 186.597 112.537 186.604 112.56C186.612 112.583 186.617 112.612 186.618 112.65C186.621 112.697 186.621 112.744 186.618 112.789ZM185.713 112.853C185.711 112.908 185.711 112.961 185.713 113.013C185.716 113.057 185.721 113.099 185.729 113.14C185.738 113.18 185.752 113.22 185.769 113.257C185.786 113.295 185.809 113.328 185.835 113.36C185.861 113.39 185.892 113.416 185.927 113.436C185.963 113.457 185.994 113.467 186.02 113.467C186.047 113.466 186.069 113.458 186.085 113.44C186.103 113.423 186.116 113.399 186.125 113.369C186.134 113.338 186.139 113.303 186.141 113.262C186.143 113.235 186.144 113.209 186.144 113.185C186.144 113.16 186.143 113.132 186.141 113.102C186.139 113.058 186.133 113.016 186.125 112.975C186.115 112.934 186.103 112.895 186.085 112.858C186.069 112.821 186.047 112.786 186.02 112.756C185.994 112.725 185.963 112.699 185.927 112.678C185.891 112.658 185.861 112.648 185.835 112.648C185.808 112.648 185.786 112.657 185.769 112.674C185.752 112.692 185.739 112.715 185.73 112.746C185.721 112.776 185.716 112.813 185.713 112.853ZM185.984 113.159C185.983 113.195 185.977 113.219 185.97 113.233C185.962 113.246 185.949 113.248 185.928 113.236C185.909 113.224 185.894 113.208 185.887 113.185C185.88 113.162 185.874 113.132 185.873 113.094C185.87 113.046 185.87 113 185.873 112.955C185.875 112.92 185.88 112.895 185.887 112.881C185.895 112.868 185.909 112.866 185.928 112.877C185.949 112.889 185.963 112.907 185.97 112.929C185.978 112.952 185.983 112.982 185.984 113.019C185.987 113.068 185.987 113.114 185.984 113.159Z" fill="#455A64"/>
|
||||
<path d="M188.391 111.261L188.842 110.565C189.338 111.406 189.716 112.412 189.909 113.44L189.18 113.384C189.037 112.624 188.757 111.883 188.391 111.261Z" fill="#455A64"/>
|
||||
<path d="M187.117 109.885V108.706C187.762 109.078 188.357 109.743 188.842 110.565L188.391 111.261C188.033 110.653 187.594 110.161 187.117 109.885Z" fill="#455A64"/>
|
||||
<path d="M189.286 114.477C189.286 114.117 189.248 113.748 189.18 113.384L189.909 113.44C190.002 113.933 190.053 114.432 190.053 114.919C190.053 115.407 190.002 115.847 189.909 116.233L189.18 115.447C189.248 115.162 189.286 114.838 189.286 114.477Z" fill="#455A64"/>
|
||||
<path d="M184.325 110.216C184.519 109.412 184.897 108.842 185.392 108.573C185.876 108.31 186.473 108.333 187.117 108.706V109.885C186.641 109.61 186.201 109.596 185.844 109.79C185.478 109.989 185.197 110.408 185.055 111.002C184.987 111.288 184.949 111.612 184.949 111.972C184.949 112.333 184.987 112.701 185.055 113.066C185.198 113.825 185.478 114.567 185.844 115.188C186.201 115.796 186.641 116.289 187.117 116.565C187.594 116.84 188.033 116.854 188.391 116.659C188.757 116.46 189.037 116.042 189.18 115.448L189.909 116.234C189.716 117.039 189.338 117.608 188.842 117.877C188.358 118.14 187.762 118.118 187.117 117.745C186.473 117.373 185.877 116.707 185.392 115.885C184.897 115.044 184.519 114.038 184.325 113.01C184.232 112.517 184.182 112.018 184.182 111.531C184.182 111.043 184.233 110.602 184.325 110.216Z" fill="#E84A5F"/>
|
||||
<path d="M179.794 106.985L166.114 99.0875C165.746 98.875 165.447 99.0259 165.447 99.4251C165.447 99.8243 165.746 100.32 166.114 100.533L179.794 108.43C180.163 108.643 180.461 108.492 180.461 108.093C180.461 107.694 180.162 107.198 179.794 106.985Z" fill="#455A64"/>
|
||||
<path d="M179.794 109.897L156.106 96.2247C155.737 96.0122 155.438 96.1631 155.438 96.5623C155.438 96.9615 155.737 97.4573 156.106 97.6699L179.794 111.343C180.163 111.555 180.461 111.404 180.461 111.005C180.461 110.606 180.162 110.11 179.794 109.897Z" fill="#E0E0E0"/>
|
||||
<path d="M143.516 94.7085L98.5546 68.7496C98.1863 68.5371 97.8881 68.0197 97.8881 67.5946V56.1327C97.8881 55.7077 98.1869 55.5352 98.5546 55.7477L143.516 81.7017C143.885 81.9142 144.184 82.4316 144.184 82.8566V94.3235C144.184 94.7485 143.885 94.921 143.516 94.7085Z" fill="#F0F0F0"/>
|
||||
<path d="M139.375 85.5675C139.375 85.4862 139.364 85.4067 139.342 85.3285C139.319 85.2503 139.29 85.1782 139.252 85.111C139.215 85.0445 139.172 84.9854 139.124 84.9336C139.075 84.8819 139.026 84.8412 138.975 84.8117C138.924 84.7821 138.875 84.7655 138.826 84.7618C138.778 84.7575 138.735 84.7667 138.698 84.7907C138.661 84.8141 138.631 84.8517 138.608 84.9047C138.586 84.957 138.574 85.0236 138.574 85.1049C138.574 85.1455 138.577 85.185 138.583 85.2225C138.589 85.2613 138.597 85.2977 138.607 85.3328C138.616 85.3691 138.626 85.4036 138.639 85.4381C138.65 85.472 138.662 85.5053 138.674 85.5373L138.934 86.2408C138.939 86.2506 138.944 86.2623 138.949 86.2759C138.955 86.2894 138.963 86.2999 138.976 86.3073L139.194 86.433C139.202 86.4379 139.208 86.4367 139.213 86.4305C139.218 86.4244 139.221 86.4151 139.221 86.4022C139.221 86.3948 139.22 86.3892 139.218 86.3843C139.217 86.3794 139.216 86.3751 139.213 86.3714L139.039 85.8915C139.084 85.9075 139.127 85.9137 139.167 85.9094C139.207 85.9057 139.243 85.8903 139.274 85.8644C139.305 85.8379 139.33 85.8003 139.348 85.7523C139.366 85.7036 139.375 85.642 139.375 85.5675ZM138.827 85.2509C138.827 85.2231 138.832 85.1997 138.84 85.1813C138.848 85.1628 138.859 85.1492 138.872 85.1412C138.886 85.1332 138.902 85.1295 138.92 85.1307C138.937 85.1314 138.956 85.1375 138.975 85.1486C138.994 85.1597 139.013 85.1745 139.031 85.1942C139.048 85.2139 139.064 85.2355 139.077 85.2595C139.091 85.2829 139.102 85.3088 139.111 85.3371C139.119 85.3648 139.123 85.3932 139.123 85.4209C139.123 85.4492 139.119 85.472 139.111 85.4905C139.102 85.5084 139.092 85.5219 139.077 85.5305C139.064 85.5392 139.048 85.5429 139.031 85.541C139.013 85.5398 138.994 85.5342 138.975 85.5231C138.956 85.512 138.938 85.4967 138.92 85.4776C138.902 85.4585 138.886 85.4369 138.872 85.4123C138.859 85.3882 138.848 85.3617 138.84 85.3346C138.832 85.3069 138.827 85.2792 138.827 85.2509Z" fill="#455A64"/>
|
||||
<path d="M138.059 84.2837C137.991 84.2443 137.932 84.2258 137.883 84.2282C137.834 84.2301 137.793 84.2486 137.761 84.2818C137.728 84.3151 137.704 84.3619 137.688 84.4217C137.673 84.482 137.664 84.5492 137.661 84.6231C137.659 84.6829 137.658 84.7451 137.658 84.811C137.658 84.8769 137.659 84.9391 137.661 84.9976C137.664 85.0752 137.673 85.1529 137.688 85.2317C137.704 85.3106 137.728 85.3851 137.761 85.4559C137.794 85.5262 137.834 85.5915 137.883 85.6506C137.932 85.7097 137.991 85.759 138.059 85.7984C138.128 85.8379 138.186 85.8563 138.236 85.8539C138.285 85.8514 138.326 85.8335 138.358 85.8009C138.391 85.767 138.415 85.7202 138.431 85.6605C138.446 85.6001 138.455 85.5329 138.458 85.459C138.46 85.4023 138.461 85.3414 138.461 85.2755C138.461 85.2095 138.46 85.1461 138.458 85.0845C138.455 85.0069 138.446 84.9293 138.431 84.8504C138.415 84.7722 138.39 84.6976 138.358 84.6268C138.325 84.556 138.285 84.4907 138.236 84.4315C138.186 84.373 138.128 84.3237 138.059 84.2837ZM137.914 85.1338C137.909 85.0124 137.909 84.8948 137.914 84.7808C137.915 84.7463 137.919 84.7167 137.924 84.6896C137.929 84.6631 137.937 84.6416 137.948 84.6262C137.959 84.6108 137.973 84.6015 137.991 84.5997C138.009 84.5979 138.032 84.6046 138.059 84.6206C138.087 84.6367 138.11 84.6558 138.128 84.6792C138.146 84.7026 138.161 84.7284 138.171 84.7562C138.182 84.7839 138.19 84.8147 138.196 84.8473C138.201 84.88 138.205 84.9132 138.205 84.9496C138.21 85.0685 138.21 85.1861 138.205 85.3026C138.205 85.3377 138.201 85.3678 138.197 85.3943C138.192 85.4214 138.183 85.4424 138.172 85.4572C138.161 85.472 138.146 85.4812 138.128 85.483C138.11 85.4849 138.087 85.4781 138.059 85.4621C138.032 85.4467 138.009 85.427 137.991 85.4042C137.973 85.3808 137.958 85.3549 137.947 85.3272C137.936 85.2989 137.927 85.2681 137.922 85.236C137.917 85.2034 137.914 85.1695 137.914 85.1338Z" fill="#455A64"/>
|
||||
<path d="M137.114 84.0471C137.112 84.1019 137.112 84.1549 137.114 84.2072C137.116 84.2504 137.121 84.2923 137.13 84.3329C137.139 84.3742 137.152 84.413 137.169 84.4506C137.186 84.4881 137.21 84.5226 137.236 84.5534C137.262 84.5836 137.293 84.6095 137.329 84.6298C137.364 84.6502 137.395 84.6606 137.421 84.6606C137.447 84.66 137.47 84.6514 137.487 84.6341C137.504 84.6163 137.518 84.5929 137.526 84.5621C137.536 84.5319 137.54 84.4955 137.543 84.4549C137.544 84.4284 137.545 84.4025 137.545 84.3773C137.545 84.3526 137.544 84.3249 137.543 84.2947C137.54 84.2516 137.536 84.2097 137.526 84.1684C137.517 84.1278 137.504 84.0884 137.487 84.0514C137.47 84.0138 137.447 83.9799 137.421 83.9491C137.395 83.9183 137.364 83.8931 137.329 83.8728C137.293 83.8524 137.262 83.8413 137.236 83.842C137.21 83.8426 137.188 83.8512 137.171 83.8691C137.153 83.8857 137.14 83.9103 137.131 83.9405C137.122 83.9707 137.116 84.0058 137.114 84.0471ZM136.773 83.6017C136.767 83.5857 136.76 83.5715 136.753 83.5611C136.746 83.55 136.737 83.5407 136.724 83.5333L136.612 83.4687C136.601 83.4631 136.594 83.4625 136.588 83.4662C136.581 83.4705 136.578 83.4791 136.578 83.4921C136.578 83.4952 136.579 83.4988 136.58 83.5038C136.581 83.5087 136.582 83.5136 136.584 83.5186L137.26 85.2766C137.266 85.2926 137.273 85.3062 137.279 85.3173C137.286 85.3277 137.296 85.337 137.309 85.3444L137.421 85.4091C137.431 85.4146 137.439 85.4158 137.445 85.4115C137.451 85.4072 137.454 85.3986 137.454 85.3857C137.454 85.3826 137.454 85.3795 137.452 85.3746C137.452 85.3696 137.451 85.3647 137.448 85.3598L136.773 83.6017ZM137.385 84.3532C137.383 84.3883 137.378 84.4136 137.371 84.4272C137.363 84.4413 137.35 84.4419 137.33 84.4309C137.309 84.4192 137.296 84.4025 137.289 84.3791C137.281 84.3563 137.276 84.3261 137.274 84.2892C137.271 84.2411 137.271 84.1949 137.274 84.15C137.276 84.1142 137.281 84.0902 137.289 84.076C137.297 84.0625 137.309 84.0613 137.33 84.073C137.35 84.0847 137.364 84.1013 137.371 84.1241C137.379 84.1475 137.384 84.1771 137.385 84.2146C137.388 84.2621 137.388 84.3083 137.385 84.3532ZM136.48 84.4179C136.477 84.4721 136.477 84.5257 136.48 84.5781C136.482 84.6212 136.488 84.6631 136.496 84.7037C136.504 84.7444 136.518 84.7838 136.535 84.8214C136.553 84.859 136.575 84.8929 136.602 84.9243C136.628 84.9551 136.659 84.9803 136.694 85.0007C136.73 85.0216 136.761 85.0321 136.787 85.0315C136.814 85.0308 136.836 85.0228 136.853 85.005C136.87 84.9877 136.884 84.9637 136.892 84.9335C136.902 84.9027 136.907 84.8676 136.908 84.8263C136.91 84.7992 136.912 84.7734 136.912 84.7493C136.912 84.7247 136.91 84.697 136.908 84.6662C136.907 84.623 136.901 84.5805 136.892 84.5399C136.883 84.4986 136.87 84.4598 136.853 84.4222C136.836 84.3853 136.814 84.3508 136.787 84.3206C136.761 84.2898 136.73 84.2639 136.694 84.2436C136.658 84.2233 136.628 84.2134 136.602 84.2134C136.575 84.2134 136.554 84.222 136.536 84.2393C136.519 84.2571 136.505 84.2806 136.496 84.3114C136.488 84.3409 136.482 84.3767 136.48 84.4179ZM136.751 84.7235C136.749 84.7592 136.743 84.7832 136.736 84.7974C136.729 84.8115 136.715 84.8122 136.695 84.8005C136.675 84.7887 136.661 84.7721 136.653 84.7493C136.646 84.7265 136.641 84.6963 136.64 84.6588C136.637 84.6107 136.637 84.5645 136.64 84.5196C136.641 84.4844 136.647 84.4598 136.653 84.4456C136.661 84.4321 136.675 84.4308 136.695 84.4419C136.715 84.4536 136.729 84.4715 136.736 84.4937C136.744 84.5165 136.75 84.5467 136.751 84.5836C136.753 84.6323 136.753 84.6785 136.751 84.7235Z" fill="#455A64"/>
|
||||
<path d="M137.924 81.4732V80.293C138.568 80.6656 139.164 81.3303 139.649 82.1527L139.197 82.8488C138.84 82.2414 138.4 81.7486 137.924 81.4732Z" fill="#455A64"/>
|
||||
<path d="M135.132 81.8049C135.325 80.9998 135.703 80.4306 136.199 80.1621C136.683 79.899 137.279 79.9218 137.924 80.2945V81.4748C137.447 81.1994 137.008 81.1852 136.65 81.3799C136.284 81.5789 136.005 81.9971 135.862 82.5916C135.793 82.8774 135.755 83.2014 135.755 83.5618C135.755 83.9221 135.793 84.2905 135.862 84.6552C136.005 85.4135 136.284 86.1545 136.649 86.7754C137.007 87.3822 137.448 87.8793 137.924 88.1541C138.401 88.4294 138.84 88.4436 139.198 88.2489C139.564 88.0499 139.844 87.6317 139.986 87.0372C140.055 86.7514 140.093 86.4274 140.093 86.067C140.093 85.7067 140.055 85.3383 139.986 84.9736C139.843 84.2141 139.564 83.4724 139.198 82.8509L139.649 82.1548C140.145 82.9957 140.523 84.0016 140.716 85.0297C140.809 85.5231 140.86 86.0215 140.86 86.5093C140.86 86.9966 140.809 87.4364 140.716 87.8233C140.523 88.6284 140.145 89.1976 139.649 89.4661C139.165 89.7292 138.569 89.7064 137.924 89.3337C137.279 88.961 136.683 88.2963 136.199 87.474L136.199 87.4715L136.199 87.4728C135.703 86.6319 135.325 85.626 135.132 84.5979C135.039 84.1045 134.988 83.6061 134.988 83.1183C134.988 82.631 135.039 82.1912 135.132 81.8049Z" fill="#E84A5F"/>
|
||||
<path d="M130.611 78.5741L116.932 70.6764C116.563 70.4639 116.265 70.6148 116.265 71.0139C116.265 71.4131 116.564 71.909 116.932 72.1215L130.612 80.0192C130.98 80.2318 131.278 80.0809 131.278 79.6817C131.278 79.2825 130.98 78.7866 130.611 78.5741Z" fill="#455A64"/>
|
||||
<path d="M130.611 81.4858L106.923 67.8131C106.555 67.6006 106.256 67.7515 106.256 68.1507C106.256 68.5498 106.555 69.0457 106.923 69.2582L130.612 82.931C130.98 83.1435 131.278 82.9926 131.278 82.5934C131.278 82.1948 130.98 81.699 130.611 81.4858Z" fill="#E0E0E0"/>
|
||||
<path d="M187.724 126.025L178.129 120.468C177.761 120.256 177.462 120.407 177.462 120.806C177.462 121.205 177.761 121.701 178.129 121.914L187.725 127.47C188.093 127.682 188.391 127.531 188.391 127.132C188.391 126.733 188.092 126.237 187.724 126.025Z" fill="#455A64"/>
|
||||
<path d="M98.5031 78.1016L98.5025 151.385C98.5025 151.59 98.6836 151.903 98.8617 152.006L192.355 205.983L192.356 132.7C192.356 132.494 192.175 132.181 191.997 132.078L190.828 131.403C190.272 131.083 189.853 130.357 189.853 129.715V125.476C189.853 125.271 189.672 124.958 189.494 124.855L176.071 117.107V121.047C176.071 121.764 175.576 122.139 175.086 122.139C174.883 122.139 174.68 122.08 174.481 121.965L98.5031 78.1016ZM98.2561 77.3267C98.3461 77.3267 98.4471 77.3562 98.5543 77.4178L174.789 121.432C174.896 121.493 174.997 121.523 175.087 121.523C175.305 121.523 175.456 121.348 175.456 121.047V116.808C175.456 116.506 175.606 116.332 175.825 116.332C175.915 116.332 176.016 116.361 176.122 116.423L189.802 124.321C190.17 124.533 190.469 125.051 190.469 125.476V129.714C190.469 130.139 190.768 130.657 191.136 130.869L192.305 131.544C192.673 131.756 192.972 132.274 192.972 132.699L192.971 206.281C192.971 206.583 192.821 206.757 192.602 206.757C192.512 206.757 192.411 206.729 192.305 206.666L98.5537 152.54C98.1853 152.327 97.8865 151.81 97.8865 151.385L97.8871 77.8022C97.8871 77.501 98.0374 77.3267 98.2561 77.3267Z" fill="#E0E0E0"/>
|
||||
<path d="M186.943 135.898C187.06 135.898 187.171 135.87 187.27 135.813C187.492 135.685 187.619 135.43 187.619 135.114V132.32C187.619 131.789 187.258 131.164 186.798 130.898L179.364 126.612C179.089 126.454 178.806 126.437 178.584 126.565C178.362 126.693 178.234 126.949 178.234 127.264V130.058C178.234 130.59 178.595 131.214 179.056 131.48L186.49 135.767C186.642 135.854 186.797 135.898 186.943 135.898ZM186.49 131.432C186.763 131.59 187.003 132.005 187.003 132.32V135.114C187.003 135.22 186.975 135.272 186.962 135.279C186.949 135.286 186.889 135.285 186.799 135.232L179.364 130.945C179.091 130.787 178.851 130.373 178.851 130.057V127.263C178.851 127.158 178.879 127.106 178.892 127.098C178.905 127.09 178.964 127.092 179.056 127.144L186.49 131.432Z" fill="#E0E0E0"/>
|
||||
<path d="M186.048 132.583L181.203 129.771C180.957 129.629 180.758 129.73 180.758 129.996C180.758 130.262 180.957 130.592 181.203 130.734L186.048 133.546C186.293 133.687 186.492 133.587 186.492 133.321C186.493 133.055 186.294 132.725 186.048 132.583Z" fill="#E0E0E0"/>
|
||||
<path d="M180.076 129.311L179.674 129.881C179.659 129.902 179.629 129.885 179.613 129.846L179.212 128.812C179.192 128.762 179.21 128.716 179.242 128.734L180.045 129.198C180.078 129.216 180.095 129.283 180.076 129.311Z" fill="#455A64"/>
|
||||
<path d="M187.968 162.97C187.613 162.765 187.325 162.931 187.325 163.341C187.325 163.751 187.613 164.25 187.968 164.455C188.323 164.66 188.611 164.494 188.611 164.083C188.611 163.673 188.324 163.175 187.968 162.97Z" fill="#E84A5F"/>
|
||||
<path d="M182.963 157.19C182.609 156.985 182.32 157.152 182.32 157.562C182.32 157.972 182.608 158.47 182.963 158.676C183.319 158.881 183.606 158.714 183.606 158.304C183.606 157.894 183.319 157.396 182.963 157.19Z" fill="#E84A5F"/>
|
||||
<path d="M177.959 154.302C177.604 154.097 177.316 154.263 177.316 154.673C177.316 155.083 177.604 155.582 177.959 155.787C178.314 155.992 178.603 155.826 178.603 155.415C178.603 155.005 178.315 154.507 177.959 154.302Z" fill="#E84A5F"/>
|
||||
<path d="M172.955 152.681C172.599 152.475 172.311 152.642 172.311 153.052C172.311 153.462 172.599 153.961 172.955 154.166C173.309 154.371 173.598 154.205 173.598 153.794C173.598 153.384 173.31 152.886 172.955 152.681Z" fill="#E84A5F"/>
|
||||
<path d="M167.945 147.479C167.589 147.274 167.302 147.44 167.302 147.85C167.302 148.261 167.589 148.759 167.945 148.964C168.3 149.169 168.588 149.003 168.588 148.593C168.588 148.182 168.3 147.684 167.945 147.479Z" fill="#E84A5F"/>
|
||||
<path d="M162.946 145.634C162.591 145.429 162.303 145.595 162.303 146.005C162.303 146.415 162.59 146.914 162.946 147.119C163.301 147.324 163.589 147.158 163.589 146.747C163.589 146.338 163.301 145.839 162.946 145.634Z" fill="#E84A5F"/>
|
||||
<path d="M157.942 139.855C157.586 139.65 157.299 139.816 157.299 140.226C157.299 140.637 157.586 141.135 157.942 141.34C158.297 141.545 158.585 141.379 158.585 140.969C158.585 140.558 158.297 140.06 157.942 139.855Z" fill="#E84A5F"/>
|
||||
<path d="M152.937 138.41C152.582 138.205 152.294 138.371 152.294 138.782C152.294 139.192 152.582 139.69 152.937 139.895C153.292 140.1 153.58 139.934 153.58 139.524C153.58 139.114 153.292 138.615 152.937 138.41Z" fill="#E84A5F"/>
|
||||
<path d="M147.933 122.519C147.577 122.314 147.289 122.48 147.289 122.89C147.289 123.301 147.577 123.799 147.933 124.004C148.288 124.209 148.576 124.043 148.576 123.633C148.576 123.222 148.287 122.724 147.933 122.519Z" fill="#E84A5F"/>
|
||||
<path d="M142.928 131.187C142.573 130.982 142.285 131.148 142.285 131.558C142.285 131.969 142.573 132.467 142.928 132.672C143.284 132.877 143.571 132.711 143.571 132.301C143.571 131.89 143.283 131.392 142.928 131.187Z" fill="#E84A5F"/>
|
||||
<path d="M137.924 131.187C137.569 130.982 137.281 131.148 137.281 131.558C137.281 131.969 137.569 132.467 137.924 132.672C138.28 132.877 138.567 132.711 138.567 132.301C138.567 131.89 138.279 131.392 137.924 131.187Z" fill="#E84A5F"/>
|
||||
<path d="M132.919 131.187C132.564 130.982 132.276 131.148 132.276 131.558C132.276 131.969 132.564 132.467 132.919 132.672C133.274 132.877 133.562 132.711 133.562 132.301C133.562 131.89 133.274 131.392 132.919 131.187Z" fill="#E84A5F"/>
|
||||
<path d="M127.916 122.519C127.56 122.314 127.272 122.48 127.272 122.89C127.272 123.301 127.56 123.799 127.916 124.004C128.271 124.209 128.559 124.043 128.559 123.633C128.559 123.222 128.27 122.724 127.916 122.519Z" fill="#E84A5F"/>
|
||||
<path d="M122.911 120.859C122.555 120.654 122.267 120.82 122.267 121.23C122.267 121.641 122.555 122.139 122.911 122.344C123.265 122.549 123.554 122.383 123.554 121.973C123.554 121.563 123.265 121.064 122.911 120.859Z" fill="#E84A5F"/>
|
||||
<path d="M117.889 113.852C117.534 113.646 117.246 113.813 117.246 114.223C117.246 114.633 117.534 115.132 117.889 115.337C118.245 115.542 118.532 115.376 118.532 114.965C118.532 114.555 118.245 114.056 117.889 113.852Z" fill="#E84A5F"/>
|
||||
<path d="M112.901 113.852C112.545 113.646 112.258 113.813 112.258 114.223C112.258 114.633 112.545 115.132 112.901 115.337C113.256 115.542 113.544 115.376 113.544 114.965C113.544 114.555 113.256 114.056 112.901 113.852Z" fill="#E84A5F"/>
|
||||
<path d="M107.896 113.852C107.541 113.646 107.253 113.813 107.253 114.223C107.253 114.633 107.541 115.132 107.896 115.337C108.251 115.542 108.539 115.376 108.539 114.965C108.539 114.555 108.251 114.056 107.896 113.852Z" fill="#E84A5F"/>
|
||||
<path d="M102.892 110.962C102.537 110.757 102.249 110.924 102.249 111.334C102.249 111.744 102.537 112.242 102.892 112.448C103.247 112.653 103.535 112.486 103.535 112.076C103.535 111.666 103.247 111.167 102.892 110.962Z" fill="#E84A5F"/>
|
||||
<path d="M187.98 163.874C188.017 163.874 188.053 163.861 188.081 163.836C188.146 163.78 188.152 163.684 188.096 163.619L183.043 157.812C183.032 157.799 183.019 157.788 183.004 157.779L178.036 154.911L173.039 153.289L168.062 148.114C168.046 148.097 168.026 148.084 168.004 148.076L163.037 146.245L158.058 140.496C158.038 140.473 158.013 140.457 157.984 140.448L153.059 139.027L148.08 123.215C148.062 123.157 148.011 123.114 147.95 123.108C147.894 123.102 147.83 123.131 147.799 123.185L142.84 131.775L137.912 131.769L133.009 131.775L128.049 123.185C128.029 123.152 127.999 123.127 127.964 123.116L123.007 121.471L118.031 114.505C118.002 114.464 117.956 114.441 117.906 114.441H107.939L102.969 111.572C102.898 111.529 102.803 111.554 102.759 111.628C102.717 111.702 102.742 111.795 102.815 111.838L107.82 114.728C107.844 114.741 107.87 114.749 107.897 114.749H117.827L122.785 121.691C122.804 121.718 122.831 121.738 122.862 121.748L127.811 123.39L132.786 132.008C132.813 132.055 132.864 132.085 132.919 132.085L137.911 132.078L142.929 132.085C142.984 132.085 143.035 132.055 143.062 132.008L147.891 123.643L152.79 139.2C152.806 139.249 152.845 139.288 152.894 139.302L157.854 140.733L162.83 146.478C162.847 146.498 162.869 146.513 162.893 146.522L167.864 148.354L172.844 153.531C172.862 153.55 172.884 153.563 172.908 153.571L177.913 155.191L182.829 158.034L187.865 163.822C187.895 163.855 187.937 163.874 187.98 163.874Z" fill="#E84A5F"/>
|
||||
<path d="M187.967 166.91C188.074 166.91 188.177 166.855 188.235 166.756C188.32 166.608 188.269 166.42 188.122 166.335L103.047 117.217C102.9 117.133 102.711 117.182 102.626 117.33C102.54 117.477 102.591 117.665 102.739 117.75L187.814 166.868C187.862 166.896 187.915 166.91 187.967 166.91Z" fill="#E0E0E0"/>
|
||||
<path d="M187.969 160.082C187.614 159.876 187.326 160.043 187.326 160.453C187.326 160.863 187.614 161.362 187.969 161.567C188.324 161.772 188.612 161.605 188.612 161.195C188.612 160.785 188.325 160.286 187.969 160.082Z" fill="#E84A5F"/>
|
||||
<path d="M182.965 151.414C182.61 151.208 182.322 151.375 182.322 151.785C182.322 152.195 182.61 152.694 182.965 152.899C183.32 153.104 183.608 152.938 183.608 152.527C183.608 152.117 183.32 151.619 182.965 151.414Z" fill="#E84A5F"/>
|
||||
<path d="M177.96 150.331C177.605 150.126 177.317 150.292 177.317 150.702C177.317 151.113 177.605 151.611 177.96 151.816C178.315 152.021 178.604 151.855 178.604 151.445C178.604 151.035 178.316 150.536 177.96 150.331Z" fill="#E84A5F"/>
|
||||
<path d="M172.957 139.855C172.601 139.65 172.313 139.817 172.313 140.227C172.313 140.637 172.601 141.135 172.957 141.341C173.312 141.546 173.6 141.379 173.6 140.969C173.599 140.559 173.311 140.061 172.957 139.855Z" fill="#E84A5F"/>
|
||||
<path d="M167.946 142.746C167.59 142.54 167.303 142.707 167.303 143.117C167.303 143.527 167.59 144.026 167.946 144.231C168.301 144.436 168.589 144.27 168.589 143.859C168.589 143.449 168.301 142.951 167.946 142.746Z" fill="#E84A5F"/>
|
||||
<path d="M162.946 141.301C162.59 141.096 162.303 141.262 162.303 141.673C162.303 142.083 162.59 142.581 162.946 142.786C163.301 142.992 163.589 142.825 163.589 142.415C163.589 142.005 163.301 141.506 162.946 141.301Z" fill="#E84A5F"/>
|
||||
<path d="M157.943 136.967C157.587 136.762 157.3 136.928 157.3 137.338C157.3 137.748 157.587 138.247 157.943 138.452C158.298 138.657 158.586 138.491 158.586 138.08C158.586 137.67 158.298 137.172 157.943 136.967Z" fill="#E84A5F"/>
|
||||
<path d="M152.938 131.189C152.583 130.984 152.295 131.15 152.295 131.56C152.295 131.971 152.583 132.469 152.938 132.674C153.293 132.879 153.581 132.713 153.581 132.303C153.581 131.892 153.293 131.394 152.938 131.189Z" fill="#E84A5F"/>
|
||||
<path d="M147.934 129.743C147.579 129.538 147.291 129.704 147.291 130.115C147.291 130.525 147.579 131.023 147.934 131.228C148.289 131.433 148.577 131.267 148.577 130.857C148.577 130.447 148.289 129.948 147.934 129.743Z" fill="#E84A5F"/>
|
||||
<path d="M142.929 125.409C142.574 125.204 142.286 125.37 142.286 125.78C142.286 126.19 142.574 126.689 142.929 126.894C143.285 127.099 143.572 126.933 143.572 126.522C143.572 126.113 143.285 125.614 142.929 125.409Z" fill="#E84A5F"/>
|
||||
<path d="M137.925 125.409C137.57 125.204 137.282 125.37 137.282 125.78C137.282 126.19 137.57 126.689 137.925 126.894C138.281 127.099 138.568 126.933 138.568 126.522C138.568 126.113 138.281 125.614 137.925 125.409Z" fill="#E84A5F"/>
|
||||
<path d="M132.92 113.852C132.565 113.647 132.277 113.813 132.277 114.223C132.277 114.634 132.565 115.132 132.92 115.337C133.276 115.542 133.563 115.376 133.563 114.966C133.563 114.555 133.275 114.057 132.92 113.852Z" fill="#E84A5F"/>
|
||||
<path d="M127.916 119.59C127.561 119.385 127.273 119.551 127.273 119.962C127.273 120.372 127.561 120.87 127.916 121.075C128.272 121.281 128.56 121.114 128.56 120.704C128.56 120.294 128.271 119.795 127.916 119.59Z" fill="#E84A5F"/>
|
||||
<path d="M122.911 113.852C122.556 113.647 122.268 113.813 122.268 114.223C122.268 114.634 122.556 115.132 122.911 115.337C123.267 115.542 123.554 115.376 123.554 114.966C123.554 114.555 123.266 114.057 122.911 113.852Z" fill="#E84A5F"/>
|
||||
<path d="M117.908 110.963C117.553 110.758 117.265 110.925 117.265 111.335C117.265 111.745 117.552 112.243 117.908 112.449C118.263 112.654 118.551 112.487 118.551 112.077C118.551 111.667 118.262 111.168 117.908 110.963Z" fill="#E84A5F"/>
|
||||
<path d="M112.903 110.963C112.548 110.758 112.26 110.925 112.26 111.335C112.26 111.745 112.547 112.243 112.903 112.449C113.258 112.654 113.546 112.487 113.546 112.077C113.546 111.667 113.258 111.168 112.903 110.963Z" fill="#E84A5F"/>
|
||||
<path d="M107.897 108.074C107.541 107.869 107.254 108.035 107.254 108.446C107.254 108.856 107.541 109.354 107.897 109.559C108.252 109.764 108.54 109.598 108.54 109.188C108.54 108.778 108.252 108.279 107.897 108.074Z" fill="#E84A5F"/>
|
||||
<path d="M102.893 108.074C102.538 107.869 102.25 108.035 102.25 108.446C102.25 108.856 102.538 109.354 102.893 109.559C103.248 109.764 103.536 109.598 103.536 109.188C103.536 108.778 103.248 108.279 102.893 108.074Z" fill="#E84A5F"/>
|
||||
<path d="M187.968 160.977C187.994 160.977 188.021 160.971 188.045 160.956C188.119 160.914 188.143 160.82 188.101 160.746L183.061 152.058C183.039 152.02 183.002 151.993 182.96 151.984L178.066 150.939L173.094 140.532C173.076 140.493 173.042 140.464 173.001 140.451C172.96 140.438 172.915 140.444 172.879 140.465L167.925 143.325L163.022 141.904L158.05 137.596L153.055 131.83C153.036 131.807 153.01 131.791 152.981 131.782L148.009 130.347L143.031 126.035C143.002 126.011 142.966 125.998 142.93 125.998H138.026L133.062 114.533C133.041 114.485 132.997 114.45 132.944 114.442C132.892 114.434 132.839 114.454 132.804 114.493L127.916 120.138L123.028 114.493C123.017 114.48 123.004 114.469 122.989 114.461L117.967 111.561C117.944 111.548 117.917 111.54 117.89 111.54H112.927L107.976 108.682C107.952 108.669 107.926 108.661 107.899 108.661H102.894C102.809 108.661 102.74 108.73 102.74 108.815C102.74 108.9 102.809 108.969 102.894 108.969H107.858L112.809 111.827C112.832 111.841 112.859 111.848 112.886 111.848H117.849L122.813 114.714L127.801 120.473C127.86 120.54 127.975 120.54 128.034 120.473L132.878 114.88L137.785 126.212C137.809 126.268 137.865 126.305 137.926 126.305H142.873L147.833 130.601C147.85 130.616 147.87 130.626 147.892 130.633L152.853 132.065L157.834 137.813L162.847 142.159C162.864 142.173 162.884 142.184 162.906 142.19L167.905 143.638C167.945 143.649 167.989 143.644 168.024 143.623L172.89 140.814L177.822 151.139C177.843 151.182 177.883 151.214 177.929 151.224L182.832 152.27L187.837 160.9C187.863 160.95 187.915 160.977 187.968 160.977Z" fill="#E84A5F"/>
|
||||
<g opacity="0.3">
|
||||
<path d="M187.969 160.082C187.614 159.876 187.326 160.043 187.326 160.453C187.326 160.863 187.614 161.362 187.969 161.567C188.324 161.772 188.612 161.605 188.612 161.195C188.612 160.785 188.325 160.286 187.969 160.082Z" fill="black"/>
|
||||
<path d="M182.965 151.414C182.61 151.208 182.322 151.375 182.322 151.785C182.322 152.195 182.61 152.694 182.965 152.899C183.32 153.104 183.608 152.938 183.608 152.527C183.608 152.117 183.32 151.619 182.965 151.414Z" fill="black"/>
|
||||
<path d="M177.96 150.331C177.605 150.126 177.317 150.292 177.317 150.702C177.317 151.113 177.605 151.611 177.96 151.816C178.315 152.021 178.604 151.855 178.604 151.445C178.604 151.035 178.316 150.536 177.96 150.331Z" fill="black"/>
|
||||
<path d="M172.957 139.855C172.601 139.65 172.313 139.817 172.313 140.227C172.313 140.637 172.601 141.135 172.957 141.341C173.312 141.546 173.6 141.379 173.6 140.969C173.599 140.559 173.311 140.061 172.957 139.855Z" fill="black"/>
|
||||
<path d="M167.946 142.746C167.59 142.54 167.303 142.707 167.303 143.117C167.303 143.527 167.59 144.026 167.946 144.231C168.301 144.436 168.589 144.27 168.589 143.859C168.589 143.449 168.301 142.951 167.946 142.746Z" fill="black"/>
|
||||
<path d="M162.946 141.301C162.59 141.096 162.303 141.262 162.303 141.673C162.303 142.083 162.59 142.581 162.946 142.786C163.301 142.992 163.589 142.825 163.589 142.415C163.589 142.005 163.301 141.506 162.946 141.301Z" fill="black"/>
|
||||
<path d="M157.943 136.967C157.587 136.762 157.3 136.928 157.3 137.338C157.3 137.748 157.587 138.247 157.943 138.452C158.298 138.657 158.586 138.491 158.586 138.08C158.586 137.67 158.298 137.172 157.943 136.967Z" fill="black"/>
|
||||
<path d="M152.938 131.189C152.583 130.984 152.295 131.15 152.295 131.56C152.295 131.971 152.583 132.469 152.938 132.674C153.293 132.879 153.581 132.713 153.581 132.303C153.581 131.892 153.293 131.394 152.938 131.189Z" fill="black"/>
|
||||
<path d="M147.934 129.743C147.579 129.538 147.291 129.704 147.291 130.115C147.291 130.525 147.579 131.023 147.934 131.228C148.289 131.433 148.577 131.267 148.577 130.857C148.577 130.447 148.289 129.948 147.934 129.743Z" fill="black"/>
|
||||
<path d="M142.929 125.409C142.574 125.204 142.286 125.37 142.286 125.78C142.286 126.19 142.574 126.689 142.929 126.894C143.285 127.099 143.572 126.933 143.572 126.522C143.572 126.113 143.285 125.614 142.929 125.409Z" fill="black"/>
|
||||
<path d="M137.925 125.409C137.57 125.204 137.282 125.37 137.282 125.78C137.282 126.19 137.57 126.689 137.925 126.894C138.281 127.099 138.568 126.933 138.568 126.522C138.568 126.113 138.281 125.614 137.925 125.409Z" fill="black"/>
|
||||
<path d="M132.92 113.852C132.565 113.647 132.277 113.813 132.277 114.223C132.277 114.634 132.565 115.132 132.92 115.337C133.276 115.542 133.563 115.376 133.563 114.966C133.563 114.555 133.275 114.057 132.92 113.852Z" fill="black"/>
|
||||
<path d="M127.916 119.59C127.561 119.385 127.273 119.551 127.273 119.962C127.273 120.372 127.561 120.87 127.916 121.075C128.272 121.281 128.56 121.114 128.56 120.704C128.56 120.294 128.271 119.795 127.916 119.59Z" fill="black"/>
|
||||
<path d="M122.911 113.852C122.556 113.647 122.268 113.813 122.268 114.223C122.268 114.634 122.556 115.132 122.911 115.337C123.267 115.542 123.554 115.376 123.554 114.966C123.554 114.555 123.266 114.057 122.911 113.852Z" fill="black"/>
|
||||
<path d="M117.908 110.963C117.553 110.758 117.265 110.925 117.265 111.335C117.265 111.745 117.552 112.243 117.908 112.449C118.263 112.654 118.551 112.487 118.551 112.077C118.551 111.667 118.262 111.168 117.908 110.963Z" fill="black"/>
|
||||
<path d="M112.903 110.963C112.548 110.758 112.26 110.925 112.26 111.335C112.26 111.745 112.547 112.243 112.903 112.449C113.258 112.654 113.546 112.487 113.546 112.077C113.546 111.667 113.258 111.168 112.903 110.963Z" fill="black"/>
|
||||
<path d="M107.897 108.074C107.541 107.869 107.254 108.035 107.254 108.446C107.254 108.856 107.541 109.354 107.897 109.559C108.252 109.764 108.54 109.598 108.54 109.188C108.54 108.778 108.252 108.279 107.897 108.074Z" fill="black"/>
|
||||
<path d="M102.893 108.074C102.538 107.869 102.25 108.035 102.25 108.446C102.25 108.856 102.538 109.354 102.893 109.559C103.248 109.764 103.536 109.598 103.536 109.188C103.536 108.778 103.248 108.279 102.893 108.074Z" fill="black"/>
|
||||
<path d="M187.968 160.977C187.994 160.977 188.021 160.971 188.045 160.956C188.119 160.914 188.143 160.82 188.101 160.746L183.061 152.058C183.039 152.02 183.002 151.993 182.96 151.984L178.066 150.939L173.094 140.532C173.076 140.493 173.042 140.464 173.001 140.451C172.96 140.438 172.915 140.444 172.879 140.465L167.925 143.325L163.022 141.904L158.05 137.596L153.055 131.83C153.036 131.807 153.01 131.791 152.981 131.782L148.009 130.347L143.031 126.035C143.002 126.011 142.966 125.998 142.93 125.998H138.026L133.062 114.533C133.041 114.485 132.997 114.45 132.944 114.442C132.892 114.434 132.839 114.454 132.804 114.493L127.916 120.138L123.028 114.493C123.017 114.48 123.004 114.469 122.989 114.461L117.967 111.561C117.944 111.548 117.917 111.54 117.89 111.54H112.927L107.976 108.682C107.952 108.669 107.926 108.661 107.899 108.661H102.894C102.809 108.661 102.74 108.73 102.74 108.815C102.74 108.9 102.809 108.969 102.894 108.969H107.858L112.809 111.827C112.832 111.841 112.859 111.848 112.886 111.848H117.849L122.813 114.714L127.801 120.473C127.86 120.54 127.975 120.54 128.034 120.473L132.878 114.88L137.785 126.212C137.809 126.268 137.865 126.305 137.926 126.305H142.873L147.833 130.601C147.85 130.616 147.87 130.626 147.892 130.633L152.853 132.065L157.834 137.813L162.847 142.159C162.864 142.173 162.884 142.184 162.906 142.19L167.905 143.638C167.945 143.649 167.989 143.644 168.024 143.623L172.89 140.814L177.822 151.139C177.843 151.182 177.883 151.214 177.929 151.224L182.832 152.27L187.837 160.9C187.863 160.95 187.915 160.977 187.968 160.977Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M185.346 138.64L180.501 135.828C180.256 135.687 180.057 135.787 180.057 136.053C180.057 136.319 180.256 136.65 180.501 136.791L185.346 139.603C185.592 139.745 185.791 139.645 185.791 139.378C185.791 139.113 185.592 138.782 185.346 138.64Z" fill="#E0E0E0"/>
|
||||
<path d="M187.968 139.855C187.613 139.65 187.325 139.817 187.325 140.227C187.325 140.637 187.613 141.135 187.968 141.341C188.323 141.546 188.611 141.379 188.611 140.969C188.611 140.559 188.324 140.061 187.968 139.855Z" fill="#E84A5F"/>
|
||||
<path opacity="0.3" d="M187.968 139.855C187.613 139.65 187.325 139.817 187.325 140.227C187.325 140.637 187.613 141.135 187.968 141.341C188.323 141.546 188.611 141.379 188.611 140.969C188.611 140.559 188.324 140.061 187.968 139.855Z" fill="black"/>
|
||||
<path d="M185.346 141.523L180.501 138.711C180.256 138.569 180.057 138.669 180.057 138.936C180.057 139.202 180.256 139.532 180.501 139.674L185.346 142.486C185.592 142.627 185.791 142.527 185.791 142.261C185.791 141.995 185.592 141.664 185.346 141.523Z" fill="#E0E0E0"/>
|
||||
<path d="M187.968 142.745C187.613 142.54 187.325 142.706 187.325 143.117C187.325 143.527 187.613 144.025 187.968 144.23C188.323 144.435 188.611 144.269 188.611 143.859C188.611 143.449 188.324 142.95 187.968 142.745Z" fill="#E84A5F"/>
|
||||
<path d="M187.967 181.244C188.006 181.244 188.044 181.229 188.074 181.2C188.136 181.141 188.137 181.043 188.078 180.983L185.538 178.372L183.045 178.056L180.528 174.803L178.008 175.149L175.559 172.939L173.06 171.44L170.511 167.908L167.981 168.702L165.549 166.529C165.486 166.472 165.389 166.478 165.331 166.541C165.275 166.606 165.28 166.703 165.344 166.76L167.906 169.049L170.391 168.27L172.874 171.689L175.377 173.186L177.907 175.475L180.392 175.134L182.879 178.347L185.391 178.666L187.855 181.199C187.887 181.228 187.927 181.244 187.967 181.244Z" fill="#E84A5F"/>
|
||||
<path d="M186.978 172.793C186.962 172.776 186.94 172.757 186.914 172.737C186.888 172.716 186.866 172.7 186.846 172.689C186.709 172.61 186.583 172.572 186.468 172.575C186.352 172.577 186.251 172.615 186.167 172.689C186.083 172.763 186.017 172.868 185.97 173.006C185.923 173.144 185.899 173.309 185.899 173.5C185.899 173.692 185.923 173.885 185.97 174.076C186.017 174.27 186.084 174.452 186.167 174.622C186.251 174.793 186.352 174.947 186.468 175.084C186.584 175.22 186.71 175.328 186.846 175.406C186.983 175.485 187.11 175.523 187.225 175.521C187.341 175.518 187.441 175.48 187.525 175.406C187.61 175.333 187.675 175.227 187.723 175.089C187.771 174.952 187.794 174.787 187.794 174.594C187.794 174.486 187.786 174.38 187.771 174.277C187.755 174.173 187.734 174.073 187.708 173.976C187.682 173.878 187.653 173.782 187.621 173.689C187.59 173.596 187.558 173.505 187.527 173.42L186.86 171.524C186.848 171.499 186.834 171.468 186.82 171.431C186.806 171.394 186.781 171.367 186.747 171.346L186.538 171.226C186.516 171.213 186.498 171.215 186.485 171.232C186.471 171.249 186.465 171.274 186.465 171.308C186.465 171.326 186.467 171.343 186.471 171.356C186.474 171.369 186.479 171.381 186.484 171.392L186.978 172.793ZM187.447 174.394C187.447 174.508 187.432 174.607 187.405 174.691C187.376 174.777 187.337 174.844 187.286 174.893C187.234 174.943 187.172 174.969 187.097 174.973C187.023 174.978 186.938 174.952 186.846 174.899C186.754 174.845 186.67 174.774 186.596 174.684C186.521 174.594 186.458 174.493 186.407 174.386C186.356 174.277 186.316 174.165 186.288 174.046C186.26 173.93 186.247 173.814 186.247 173.701C186.247 173.588 186.26 173.489 186.288 173.404C186.316 173.318 186.356 173.251 186.407 173.202C186.458 173.152 186.521 173.126 186.596 173.122C186.67 173.118 186.754 173.143 186.846 173.196C186.938 173.25 187.023 173.322 187.097 173.412C187.172 173.502 187.234 173.602 187.286 173.709C187.337 173.818 187.376 173.93 187.405 174.049C187.432 174.167 187.447 174.282 187.447 174.394Z" fill="#455A64"/>
|
||||
<path d="M185.275 173.491C185.263 173.544 185.246 173.594 185.224 173.641C185.202 173.689 185.169 173.723 185.125 173.744C185.082 173.766 185.023 173.771 184.952 173.76C184.879 173.747 184.786 173.709 184.671 173.643C184.595 173.6 184.524 173.544 184.455 173.476C184.387 173.409 184.327 173.331 184.275 173.24C184.224 173.151 184.183 173.053 184.153 172.947C184.122 172.841 184.108 172.725 184.108 172.601C184.108 172.481 184.122 172.387 184.151 172.32C184.181 172.252 184.22 172.207 184.27 172.185C184.32 172.164 184.38 172.161 184.448 172.177C184.515 172.195 184.591 172.227 184.671 172.272L184.974 172.448C185.001 172.463 185.025 172.462 185.044 172.443C185.063 172.424 185.073 172.395 185.073 172.353V172.151C185.073 172.116 185.067 172.082 185.053 172.045C185.04 172.009 185.027 171.977 185.014 171.947L184.356 170.472L185.41 171.081C185.437 171.096 185.46 171.095 185.479 171.076C185.499 171.057 185.509 171.028 185.509 170.985V170.783C185.509 170.741 185.499 170.7 185.479 170.659C185.46 170.618 185.437 170.59 185.41 170.574L183.967 169.74C183.94 169.725 183.917 169.727 183.898 169.745C183.878 169.764 183.869 169.794 183.869 169.836V170.038C183.869 170.073 183.875 170.109 183.886 170.148C183.899 170.187 183.915 170.228 183.935 170.268L184.583 171.719C184.461 171.652 184.348 171.617 184.247 171.613C184.146 171.609 184.06 171.636 183.987 171.694C183.915 171.752 183.859 171.84 183.819 171.957C183.779 172.075 183.758 172.222 183.758 172.399C183.758 172.592 183.783 172.777 183.832 172.958C183.881 173.138 183.946 173.304 184.028 173.454C184.109 173.605 184.206 173.74 184.316 173.861C184.428 173.981 184.546 174.078 184.67 174.15C184.834 174.243 184.974 174.296 185.093 174.306C185.211 174.317 185.309 174.296 185.386 174.244C185.463 174.193 185.52 174.118 185.558 174.022C185.596 173.926 185.616 173.816 185.619 173.694C185.619 173.659 185.611 173.627 185.595 173.592C185.579 173.559 185.56 173.535 185.537 173.523L185.37 173.426C185.343 173.41 185.321 173.41 185.306 173.426C185.29 173.442 185.28 173.463 185.275 173.491Z" fill="#455A64"/>
|
||||
<path d="M183.097 172.232C183.084 172.286 183.067 172.336 183.046 172.384C183.023 172.431 182.99 172.466 182.946 172.487C182.903 172.509 182.844 172.514 182.773 172.501C182.701 172.49 182.607 172.452 182.492 172.384C182.417 172.341 182.345 172.286 182.276 172.218C182.208 172.15 182.148 172.071 182.097 171.982C182.046 171.892 182.005 171.793 181.974 171.688C181.944 171.582 181.929 171.467 181.929 171.343C181.929 171.223 181.943 171.129 181.973 171.061C182.002 170.994 182.041 170.949 182.091 170.927C182.141 170.905 182.201 170.903 182.269 170.92C182.337 170.936 182.412 170.968 182.492 171.014L182.796 171.19C182.823 171.205 182.846 171.204 182.865 171.184C182.885 171.166 182.895 171.136 182.895 171.095V170.891C182.895 170.857 182.888 170.823 182.874 170.787C182.861 170.75 182.848 170.718 182.836 170.688L182.177 169.214L183.232 169.822C183.259 169.838 183.282 169.835 183.301 169.818C183.32 169.798 183.33 169.768 183.33 169.728V169.524C183.33 169.484 183.32 169.442 183.301 169.401C183.282 169.36 183.259 169.331 183.232 169.315L181.789 168.482C181.762 168.467 181.739 168.469 181.719 168.487C181.7 168.506 181.69 168.536 181.69 168.577V168.78C181.69 168.814 181.697 168.85 181.708 168.889C181.721 168.929 181.736 168.968 181.756 169.01L182.404 170.461C182.282 170.393 182.17 170.358 182.069 170.354C181.968 170.35 181.881 170.377 181.809 170.435C181.737 170.493 181.681 170.581 181.64 170.699C181.6 170.816 181.579 170.964 181.579 171.141C181.579 171.332 181.604 171.518 181.653 171.699C181.702 171.879 181.767 172.044 181.849 172.195C181.931 172.346 182.027 172.481 182.138 172.601C182.249 172.722 182.367 172.819 182.491 172.89C182.655 172.985 182.796 173.037 182.914 173.047C183.033 173.058 183.131 173.037 183.208 172.985C183.285 172.933 183.342 172.86 183.38 172.763C183.418 172.667 183.438 172.557 183.44 172.435C183.44 172.4 183.432 172.367 183.416 172.333C183.401 172.3 183.381 172.277 183.36 172.264L183.192 172.167C183.164 172.152 183.143 172.152 183.128 172.166C183.111 172.184 183.102 172.206 183.097 172.232Z" fill="#455A64"/>
|
||||
<path d="M187.514 183.233L165.891 170.702C165.646 170.56 165.447 170.661 165.447 170.927C165.447 171.193 165.646 171.523 165.891 171.665L187.514 184.195C187.759 184.337 187.958 184.237 187.958 183.971C187.959 183.704 187.76 183.374 187.514 183.233Z" fill="#E0E0E0"/>
|
||||
<path d="M187.514 168.777L182.668 165.965C182.423 165.823 182.224 165.924 182.224 166.19C182.224 166.456 182.423 166.786 182.668 166.928L187.514 169.74C187.759 169.882 187.958 169.781 187.958 169.515C187.959 169.249 187.76 168.919 187.514 168.777Z" fill="#E0E0E0"/>
|
||||
<path d="M187.968 198.564C188.007 198.564 188.045 198.55 188.075 198.521C188.137 198.461 188.138 198.364 188.079 198.303L185.539 195.692L183.03 195.374L180.502 193.165L178.066 192.501L175.526 187.445L172.979 188.692L170.523 186.527L170.482 186.519L168.043 186.056L165.582 181.799C165.539 181.724 165.444 181.7 165.371 181.742C165.297 181.785 165.272 181.88 165.314 181.953L167.847 186.333L170.382 186.813L172.93 189.058L175.388 187.855L177.852 192.762L180.386 193.452L182.897 195.667L185.393 195.984L187.857 198.517C187.888 198.549 187.928 198.564 187.968 198.564Z" fill="#E84A5F"/>
|
||||
<g opacity="0.3">
|
||||
<path d="M187.968 198.564C188.007 198.564 188.045 198.55 188.075 198.521C188.137 198.461 188.138 198.364 188.079 198.303L185.539 195.692L183.03 195.374L180.502 193.165L178.066 192.501L175.526 187.445L172.979 188.692L170.523 186.527L170.482 186.519L168.043 186.056L165.582 181.799C165.539 181.724 165.444 181.7 165.371 181.742C165.297 181.785 165.272 181.88 165.314 181.953L167.847 186.333L170.382 186.813L172.93 189.058L175.388 187.855L177.852 192.762L180.386 193.452L182.897 195.667L185.393 195.984L187.857 198.517C187.888 198.549 187.928 198.564 187.968 198.564Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M186.688 192.428C186.688 192.469 186.698 192.511 186.717 192.552C186.737 192.593 186.76 192.621 186.787 192.637L186.937 192.724C186.964 192.74 186.987 192.738 187.007 192.719C187.026 192.701 187.036 192.671 187.036 192.629V189.523L187.629 190.559C187.651 190.602 187.675 190.627 187.702 190.635C187.729 190.644 187.751 190.638 187.768 190.617L187.856 190.493C187.873 190.47 187.88 190.435 187.876 190.392C187.872 190.349 187.859 190.307 187.837 190.269L187.054 188.892C187.035 188.858 187.015 188.834 186.995 188.818C186.976 188.804 186.956 188.791 186.937 188.779L186.786 188.692C186.759 188.677 186.736 188.678 186.717 188.697C186.698 188.715 186.688 188.746 186.688 188.787L186.688 192.428Z" fill="#455A64"/>
|
||||
<path d="M185.088 189.583C185.015 189.439 184.96 189.303 184.924 189.177C184.887 189.051 184.869 188.903 184.869 188.734C184.869 188.535 184.907 188.39 184.983 188.3C185.058 188.211 185.177 188.213 185.341 188.308C185.427 188.357 185.5 188.418 185.559 188.49C185.62 188.562 185.67 188.643 185.71 188.732C185.749 188.82 185.781 188.914 185.804 189.013C185.827 189.11 185.846 189.209 185.862 189.307C185.869 189.353 185.881 189.392 185.9 189.425C185.918 189.457 185.937 189.48 185.957 189.491L186.125 189.589C186.147 189.601 186.165 189.6 186.182 189.585C186.197 189.57 186.205 189.545 186.205 189.511C186.204 189.371 186.183 189.218 186.144 189.052C186.104 188.887 186.049 188.725 185.976 188.567C185.902 188.407 185.812 188.261 185.707 188.123C185.6 187.987 185.479 187.879 185.342 187.8C185.208 187.723 185.089 187.686 184.987 187.691C184.884 187.696 184.799 187.732 184.731 187.803C184.662 187.872 184.61 187.97 184.575 188.095C184.539 188.222 184.521 188.367 184.521 188.533C184.521 188.654 184.528 188.766 184.54 188.87C184.552 188.976 184.572 189.08 184.6 189.185C184.629 189.289 184.665 189.395 184.709 189.504C184.752 189.612 184.806 189.727 184.87 189.85L185.686 191.495L184.566 190.848C184.539 190.833 184.516 190.835 184.497 190.853C184.478 190.872 184.467 190.902 184.467 190.943V191.146C184.467 191.187 184.478 191.229 184.497 191.27C184.516 191.311 184.539 191.339 184.566 191.355L186.144 192.266C186.171 192.281 186.194 192.28 186.213 192.261C186.233 192.242 186.244 192.213 186.244 192.17V191.968C186.244 191.926 186.237 191.888 186.225 191.851C186.212 191.814 186.192 191.765 186.162 191.707L185.088 189.583Z" fill="#455A64"/>
|
||||
<path d="M182.192 187.538C182.189 187.706 182.188 187.863 182.188 188.012C182.188 188.161 182.189 188.32 182.192 188.491C182.194 188.71 182.214 188.925 182.253 189.137C182.29 189.349 182.346 189.545 182.422 189.728C182.498 189.912 182.594 190.075 182.71 190.221C182.826 190.367 182.964 190.487 183.125 190.58C183.287 190.673 183.425 190.713 183.541 190.701C183.657 190.689 183.753 190.636 183.828 190.54C183.905 190.445 183.961 190.314 183.998 190.145C184.037 189.977 184.057 189.785 184.059 189.568C184.062 189.4 184.063 189.242 184.063 189.093C184.063 188.945 184.062 188.785 184.059 188.615C184.057 188.395 184.037 188.18 183.998 187.968C183.961 187.756 183.905 187.56 183.828 187.377C183.753 187.194 183.657 187.029 183.541 186.881C183.425 186.733 183.287 186.613 183.125 186.519C182.964 186.427 182.826 186.387 182.71 186.401C182.594 186.414 182.498 186.47 182.422 186.565C182.346 186.66 182.29 186.791 182.253 186.96C182.214 187.128 182.194 187.321 182.192 187.538ZM183.715 189.371C183.71 189.724 183.658 189.957 183.559 190.07C183.461 190.182 183.315 190.182 183.125 190.072C182.935 189.963 182.79 189.795 182.692 189.569C182.593 189.342 182.541 189.05 182.536 188.69C182.533 188.519 182.532 188.36 182.532 188.211C182.532 188.063 182.533 187.904 182.536 187.737C182.541 187.382 182.593 187.148 182.692 187.034C182.79 186.92 182.935 186.918 183.125 187.028C183.316 187.138 183.461 187.307 183.559 187.535C183.658 187.763 183.71 188.057 183.715 188.418C183.717 188.587 183.719 188.747 183.719 188.896C183.719 189.045 183.717 189.202 183.715 189.371Z" fill="#455A64"/>
|
||||
<path d="M187.514 200.552L165.891 188.021C165.646 187.88 165.447 187.98 165.447 188.246C165.447 188.512 165.646 188.842 165.891 188.984L187.514 201.515C187.759 201.656 187.958 201.556 187.958 201.29C187.959 201.024 187.76 200.694 187.514 200.552Z" fill="#E0E0E0"/>
|
||||
<path d="M187.514 186.099L182.668 183.287C182.423 183.145 182.224 183.246 182.224 183.512C182.224 183.778 182.423 184.108 182.668 184.25L187.514 187.062C187.759 187.203 187.958 187.103 187.958 186.837C187.959 186.571 187.76 186.241 187.514 186.099Z" fill="#E0E0E0"/>
|
||||
<path d="M157.942 163.872C157.987 163.872 158.031 163.852 158.062 163.814C158.115 163.748 158.104 163.65 158.038 163.597L155.535 161.601L153.015 158.722L150.457 158.351L148.017 157.799L145.49 154.816L143.003 155.255L140.509 151.306L137.975 151.346L135.524 149.155C135.461 149.099 135.364 149.104 135.306 149.167C135.249 149.231 135.255 149.328 135.318 149.385L137.86 151.657L140.341 151.616L142.853 155.594L145.37 155.149L147.848 158.077L150.401 158.653L152.858 159.009L155.322 161.821L157.845 163.836C157.873 163.861 157.908 163.872 157.942 163.872Z" fill="#E84A5F"/>
|
||||
<path d="M156.952 155.422C156.936 155.406 156.914 155.386 156.888 155.366C156.862 155.345 156.84 155.33 156.82 155.319C156.683 155.24 156.557 155.201 156.442 155.204C156.326 155.207 156.225 155.244 156.141 155.318C156.057 155.392 155.992 155.497 155.944 155.635C155.897 155.774 155.873 155.938 155.873 156.13C155.873 156.322 155.897 156.514 155.944 156.707C155.992 156.899 156.058 157.082 156.141 157.252C156.226 157.423 156.326 157.577 156.442 157.714C156.558 157.85 156.684 157.958 156.82 158.037C156.957 158.115 157.084 158.154 157.199 158.15C157.315 158.148 157.415 158.11 157.499 158.037C157.584 157.963 157.649 157.857 157.697 157.719C157.745 157.582 157.768 157.417 157.768 157.225C157.768 157.116 157.76 157.01 157.745 156.907C157.729 156.803 157.708 156.703 157.682 156.606C157.656 156.508 157.628 156.413 157.596 156.319C157.564 156.226 157.533 156.136 157.501 156.051L156.834 154.154C156.822 154.129 156.808 154.098 156.794 154.061C156.78 154.024 156.755 153.996 156.721 153.976L156.512 153.856C156.49 153.844 156.473 153.845 156.459 153.862C156.446 153.879 156.439 153.904 156.439 153.938C156.439 153.956 156.441 153.973 156.445 153.986C156.449 153.999 156.453 154.012 156.458 154.022L156.952 155.422ZM157.421 157.023C157.421 157.137 157.407 157.236 157.379 157.32C157.351 157.406 157.312 157.473 157.26 157.522C157.209 157.571 157.147 157.598 157.072 157.602C156.997 157.607 156.913 157.581 156.821 157.528C156.728 157.474 156.645 157.403 156.571 157.313C156.496 157.223 156.433 157.122 156.381 157.015C156.33 156.906 156.291 156.793 156.263 156.675C156.235 156.559 156.221 156.443 156.221 156.33C156.221 156.217 156.235 156.118 156.263 156.033C156.291 155.947 156.33 155.88 156.381 155.831C156.433 155.781 156.496 155.755 156.571 155.751C156.645 155.747 156.728 155.771 156.821 155.825C156.913 155.879 156.997 155.951 157.072 156.041C157.147 156.13 157.209 156.23 157.26 156.338C157.312 156.447 157.351 156.559 157.379 156.678C157.407 156.796 157.421 156.912 157.421 157.023Z" fill="#455A64"/>
|
||||
<path d="M154.415 154.516C154.342 154.372 154.287 154.237 154.249 154.11C154.213 153.984 154.195 153.836 154.195 153.667C154.195 153.468 154.233 153.323 154.309 153.233C154.384 153.144 154.504 153.146 154.668 153.241C154.753 153.29 154.825 153.351 154.886 153.423C154.945 153.496 154.996 153.576 155.035 153.665C155.075 153.753 155.107 153.847 155.131 153.946C155.154 154.043 155.173 154.142 155.188 154.241C155.195 154.286 155.207 154.326 155.226 154.359C155.245 154.391 155.263 154.414 155.283 154.424L155.451 154.522C155.473 154.534 155.492 154.533 155.508 154.518C155.524 154.503 155.532 154.478 155.532 154.444C155.529 154.304 155.509 154.151 155.47 153.985C155.43 153.82 155.374 153.658 155.302 153.5C155.228 153.34 155.138 153.194 155.032 153.056C154.926 152.92 154.804 152.812 154.668 152.734C154.533 152.656 154.415 152.62 154.312 152.624C154.21 152.629 154.124 152.665 154.056 152.736C153.988 152.805 153.936 152.902 153.9 153.029C153.864 153.155 153.847 153.301 153.847 153.467C153.847 153.587 153.853 153.699 153.865 153.804C153.878 153.909 153.898 154.014 153.926 154.118C153.954 154.223 153.99 154.329 154.034 154.438C154.078 154.546 154.132 154.661 154.195 154.784L155.011 156.428L153.892 155.781C153.864 155.766 153.842 155.768 153.822 155.786C153.803 155.805 153.793 155.835 153.793 155.876V156.079C153.793 156.12 153.803 156.162 153.822 156.203C153.842 156.244 153.864 156.272 153.892 156.288L155.47 157.2C155.497 157.215 155.52 157.214 155.539 157.195C155.559 157.176 155.569 157.147 155.569 157.105V156.903C155.569 156.861 155.563 156.822 155.55 156.785C155.538 156.747 155.518 156.699 155.488 156.641L154.415 154.516Z" fill="#455A64"/>
|
||||
<path d="M151.924 151.206C151.897 151.191 151.875 151.193 151.855 151.211C151.836 151.23 151.826 151.26 151.826 151.301V151.504C151.826 151.538 151.83 151.576 151.837 151.617C151.844 151.659 151.854 151.704 151.866 151.753L152.679 155.453C152.689 155.492 152.702 155.531 152.717 155.568C152.733 155.606 152.756 155.633 152.786 155.649L152.954 155.746C152.978 155.761 152.999 155.759 153.016 155.743C153.033 155.727 153.042 155.7 153.042 155.662C153.042 155.655 153.041 155.645 153.04 155.636C153.039 155.625 153.036 155.609 153.03 155.588L152.214 151.88L153.414 152.573C153.442 152.589 153.465 152.587 153.484 152.569C153.504 152.549 153.514 152.519 153.514 152.479V152.275C153.514 152.235 153.504 152.193 153.484 152.152C153.465 152.111 153.442 152.082 153.414 152.066L151.924 151.206Z" fill="#455A64"/>
|
||||
<path d="M157.488 165.861L135.865 153.33C135.62 153.189 135.421 153.289 135.421 153.555C135.421 153.821 135.62 154.151 135.865 154.293L157.488 166.824C157.733 166.966 157.932 166.865 157.932 166.599C157.932 166.334 157.733 166.003 157.488 165.861Z" fill="#E0E0E0"/>
|
||||
<path d="M157.488 151.406L152.643 148.594C152.397 148.452 152.198 148.552 152.198 148.818C152.198 149.084 152.397 149.415 152.643 149.556L157.488 152.368C157.733 152.51 157.932 152.41 157.932 152.144C157.932 151.878 157.733 151.547 157.488 151.406Z" fill="#E0E0E0"/>
|
||||
<path d="M157.941 181.193C157.968 181.193 157.996 181.186 158.021 181.171C158.093 181.127 158.116 181.031 158.073 180.959L155.515 176.764L152.943 177.24L150.522 176.579L148.019 173.524L145.531 172.897L143.003 168.391L140.418 169.142L137.988 168.681L135.524 166.487C135.461 166.43 135.363 166.436 135.306 166.5C135.25 166.564 135.255 166.661 135.319 166.718L137.847 168.968L137.889 168.977L140.433 169.459L142.854 168.756L145.329 173.163L147.846 173.799L150.347 176.85L150.394 176.863L152.93 177.556L152.965 177.55L155.363 177.107L157.81 181.12C157.838 181.167 157.889 181.193 157.941 181.193Z" fill="#E84A5F"/>
|
||||
<g opacity="0.3">
|
||||
<path d="M157.941 181.193C157.968 181.193 157.996 181.186 158.021 181.171C158.093 181.127 158.116 181.031 158.073 180.959L155.515 176.764L152.943 177.24L150.522 176.579L148.019 173.524L145.531 172.897L143.003 168.391L140.418 169.142L137.988 168.681L135.524 166.487C135.461 166.43 135.363 166.436 135.306 166.5C135.25 166.564 135.255 166.661 135.319 166.718L137.847 168.968L137.889 168.977L140.433 169.459L142.854 168.756L145.329 173.163L147.846 173.799L150.347 176.85L150.394 176.863L152.93 177.556L152.965 177.55L155.363 177.107L157.81 181.12C157.838 181.167 157.889 181.193 157.941 181.193Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M156.784 173.925C156.796 173.936 156.812 173.949 156.835 173.963C156.857 173.977 156.873 173.988 156.882 173.994C156.999 174.061 157.113 174.098 157.223 174.103C157.332 174.108 157.43 174.079 157.516 174.015C157.602 173.952 157.671 173.852 157.723 173.718C157.776 173.583 157.802 173.408 157.802 173.193C157.802 173.002 157.777 172.812 157.728 172.621C157.68 172.431 157.613 172.253 157.529 172.086C157.445 171.919 157.347 171.769 157.236 171.638C157.125 171.506 157.008 171.404 156.883 171.333C156.742 171.251 156.613 171.211 156.501 171.213C156.387 171.215 156.291 171.252 156.211 171.326C156.132 171.398 156.071 171.503 156.028 171.641C155.986 171.778 155.964 171.941 155.964 172.133C155.964 172.227 155.973 172.327 155.993 172.435C156.012 172.542 156.037 172.649 156.066 172.755C156.096 172.863 156.127 172.968 156.161 173.07C156.196 173.173 156.227 173.266 156.256 173.351L156.923 175.246C156.936 175.272 156.948 175.303 156.963 175.34C156.978 175.377 157.002 175.404 157.037 175.424L157.246 175.545C157.267 175.558 157.285 175.556 157.298 175.539C157.311 175.523 157.318 175.497 157.318 175.463C157.318 175.444 157.317 175.428 157.313 175.415C157.31 175.401 157.305 175.389 157.3 175.379L156.784 173.925ZM156.31 172.333C156.31 172.216 156.325 172.115 156.352 172.03C156.381 171.945 156.419 171.881 156.47 171.836C156.52 171.792 156.581 171.77 156.652 171.769C156.722 171.769 156.8 171.793 156.882 171.841C156.968 171.89 157.045 171.955 157.114 172.037C157.185 172.119 157.244 172.21 157.294 172.313C157.344 172.414 157.383 172.524 157.411 172.641C157.439 172.759 157.452 172.876 157.452 172.993C157.452 173.113 157.438 173.214 157.411 173.298C157.383 173.382 157.344 173.445 157.294 173.49C157.244 173.535 157.185 173.557 157.114 173.558C157.045 173.56 156.968 173.535 156.882 173.486C156.8 173.439 156.722 173.373 156.652 173.291C156.581 173.209 156.52 173.116 156.47 173.014C156.42 172.912 156.381 172.803 156.352 172.688C156.325 172.572 156.31 172.453 156.31 172.333Z" fill="#455A64"/>
|
||||
<path d="M155.359 173.503C155.347 173.556 155.33 173.606 155.308 173.653C155.287 173.701 155.253 173.735 155.21 173.757C155.166 173.779 155.107 173.783 155.035 173.772C154.964 173.761 154.87 173.722 154.755 173.655C154.68 173.612 154.608 173.556 154.539 173.488C154.471 173.421 154.411 173.342 154.36 173.252C154.308 173.162 154.268 173.064 154.238 172.959C154.206 172.853 154.191 172.737 154.191 172.614C154.191 172.494 154.206 172.399 154.235 172.332C154.265 172.265 154.304 172.219 154.354 172.197C154.405 172.176 154.464 172.173 154.532 172.19C154.6 172.206 154.674 172.239 154.754 172.285L155.059 172.46C155.085 172.476 155.109 172.474 155.128 172.455C155.147 172.436 155.158 172.407 155.158 172.365V172.162C155.158 172.128 155.151 172.093 155.138 172.057C155.123 172.02 155.112 171.988 155.099 171.958L154.44 170.484L155.494 171.093C155.521 171.108 155.544 171.106 155.564 171.088C155.583 171.069 155.593 171.039 155.593 170.998V170.795C155.593 170.754 155.583 170.713 155.564 170.671C155.544 170.63 155.521 170.602 155.494 170.586L154.052 169.752C154.025 169.737 154.002 169.739 153.982 169.757C153.963 169.776 153.953 169.807 153.953 169.847V170.051C153.953 170.084 153.959 170.12 153.971 170.16C153.984 170.199 153.999 170.239 154.019 170.28L154.667 171.731C154.544 171.664 154.433 171.629 154.332 171.625C154.23 171.621 154.143 171.648 154.072 171.706C154 171.764 153.944 171.852 153.903 171.969C153.864 172.087 153.843 172.234 153.843 172.411C153.843 172.603 153.867 172.789 153.916 172.969C153.965 173.15 154.031 173.315 154.112 173.466C154.194 173.617 154.29 173.751 154.401 173.872C154.512 173.993 154.629 174.09 154.754 174.161C154.918 174.255 155.059 174.307 155.178 174.318C155.296 174.329 155.394 174.307 155.471 174.255C155.547 174.204 155.605 174.13 155.643 174.034C155.681 173.937 155.701 173.828 155.703 173.706C155.703 173.671 155.695 173.638 155.68 173.604C155.664 173.571 155.645 173.547 155.622 173.535L155.454 173.438C155.427 173.422 155.406 173.422 155.39 173.437C155.374 173.454 155.364 173.475 155.359 173.503Z" fill="#455A64"/>
|
||||
<path d="M157.488 183.181L135.866 170.651C135.62 170.509 135.422 170.609 135.422 170.876C135.422 171.142 135.62 171.472 135.866 171.613L157.488 184.144C157.734 184.286 157.933 184.185 157.933 183.919C157.933 183.653 157.734 183.323 157.488 183.181Z" fill="#E0E0E0"/>
|
||||
<path d="M157.488 168.727L152.643 165.915C152.398 165.773 152.199 165.874 152.199 166.14C152.199 166.406 152.398 166.736 152.643 166.878L157.488 169.69C157.734 169.831 157.933 169.731 157.933 169.465C157.933 169.199 157.734 168.869 157.488 168.727Z" fill="#E0E0E0"/>
|
||||
<path d="M125.411 135.755C124.344 135.139 123.36 135.107 122.559 135.542L125.411 143.233V135.755Z" fill="#E84A5F"/>
|
||||
<path d="M128.263 138.836C127.462 137.475 126.478 136.371 125.411 135.755V143.234L128.263 138.836Z" fill="#E84A5F"/>
|
||||
<path d="M130.029 143.589C129.71 141.889 129.083 140.228 128.263 138.836L125.411 143.233L130.029 143.589Z" fill="#E84A5F"/>
|
||||
<path opacity="0.3" d="M128.263 138.836C129.083 140.228 129.71 141.888 130.029 143.589L125.411 143.233V135.755C126.479 136.371 127.462 137.475 128.263 138.836Z" fill="black"/>
|
||||
<path d="M122.559 135.542C121.739 135.988 121.113 136.925 120.793 138.257L125.411 143.233L122.559 135.542Z" fill="#E84A5F"/>
|
||||
<path d="M130.03 148.21C130.183 147.57 130.269 146.844 130.269 146.037C130.269 145.23 130.183 144.406 130.03 143.589L125.411 143.233L130.03 148.21Z" fill="#E84A5F"/>
|
||||
<path d="M120.793 142.877C121.113 144.578 121.739 146.239 122.559 147.63L125.411 143.233L120.793 142.877Z" fill="#E84A5F"/>
|
||||
<path d="M125.411 150.711C126.478 151.327 127.462 151.359 128.263 150.924L125.411 143.233V150.711Z" fill="#E84A5F"/>
|
||||
<path d="M130.029 148.21L125.411 143.233L128.263 150.924C129.083 150.478 129.71 149.541 130.029 148.21Z" fill="#E84A5F"/>
|
||||
<path d="M120.793 138.256C120.64 138.896 120.554 139.622 120.554 140.429C120.554 141.236 120.64 142.06 120.793 142.877L125.411 143.233L120.793 138.256Z" fill="#E84A5F"/>
|
||||
<path d="M122.559 147.63C123.36 148.991 124.344 150.095 125.411 150.711V143.232L122.559 147.63Z" fill="#E84A5F"/>
|
||||
<path d="M127.833 154.524L122.988 151.712C122.743 151.571 122.544 151.671 122.544 151.937C122.544 152.203 122.743 152.533 122.988 152.675L127.833 155.487C128.078 155.629 128.277 155.528 128.277 155.262C128.277 154.996 128.079 154.666 127.833 154.524Z" fill="#455A64"/>
|
||||
<path d="M128.902 158.039L121.92 153.988C121.674 153.846 121.475 153.946 121.475 154.212C121.475 154.479 121.674 154.809 121.92 154.95L128.903 159.002C129.148 159.144 129.347 159.043 129.347 158.777C129.346 158.511 129.147 158.181 128.902 158.039Z" fill="#E0E0E0"/>
|
||||
<path d="M128.902 160.936L121.92 156.884C121.674 156.742 121.475 156.843 121.475 157.109C121.475 157.375 121.674 157.705 121.92 157.847L128.903 161.898C129.148 162.04 129.347 161.94 129.347 161.673C129.346 161.407 129.147 161.077 128.902 160.936Z" fill="#E0E0E0"/>
|
||||
<path d="M128.902 163.831L121.92 159.78C121.674 159.638 121.475 159.738 121.475 160.004C121.475 160.271 121.674 160.601 121.92 160.742L128.903 164.794C129.148 164.936 129.347 164.835 129.347 164.569C129.346 164.303 129.147 163.973 128.902 163.831Z" fill="#E0E0E0"/>
|
||||
<path d="M107.898 125.604C106.832 124.988 105.848 124.956 105.046 125.392L107.898 133.082V125.604Z" fill="#E84A5F"/>
|
||||
<path d="M110.75 128.685C109.949 127.324 108.965 126.22 107.898 125.604V133.082L110.75 128.685Z" fill="#E84A5F"/>
|
||||
<path d="M112.517 133.438C112.197 131.737 111.57 130.076 110.751 128.685L107.898 133.082L112.517 133.438Z" fill="#E84A5F"/>
|
||||
<path d="M105.046 125.392C104.226 125.837 103.6 126.774 103.28 128.106L107.898 133.082L105.046 125.392Z" fill="#E84A5F"/>
|
||||
<path d="M112.516 138.058C112.67 137.419 112.755 136.693 112.755 135.886C112.755 135.079 112.67 134.255 112.516 133.438L107.898 133.082L112.516 138.058Z" fill="#E84A5F"/>
|
||||
<path d="M103.28 132.726C103.6 134.426 104.227 136.087 105.046 137.479L107.898 133.082L103.28 132.726Z" fill="#E84A5F"/>
|
||||
<path d="M107.898 140.56C108.965 141.176 109.949 141.208 110.75 140.772L107.898 133.082V140.56Z" fill="#E84A5F"/>
|
||||
<path d="M112.517 138.058L107.898 133.082L110.751 140.772C111.57 140.327 112.197 139.39 112.517 138.058Z" fill="#E84A5F"/>
|
||||
<path opacity="0.3" d="M110.75 128.685C111.57 130.076 112.197 131.737 112.516 133.438C112.67 134.255 112.755 135.08 112.755 135.886C112.755 136.693 112.67 137.419 112.516 138.058C112.197 139.389 111.57 140.327 110.75 140.772L107.898 133.081V125.603C108.965 126.22 109.949 127.324 110.75 128.685Z" fill="black"/>
|
||||
<path d="M103.28 128.105C103.127 128.745 103.041 129.471 103.041 130.278C103.041 131.085 103.126 131.909 103.28 132.726L107.898 133.082L103.28 128.105Z" fill="#E84A5F"/>
|
||||
<path d="M105.046 137.479C105.848 138.84 106.832 139.944 107.898 140.56V133.082L105.046 137.479Z" fill="#E84A5F"/>
|
||||
<path d="M110.319 144.411L105.474 141.599C105.228 141.457 105.029 141.558 105.029 141.824C105.029 142.09 105.228 142.42 105.474 142.562L110.319 145.374C110.564 145.515 110.763 145.415 110.763 145.149C110.763 144.883 110.564 144.553 110.319 144.411Z" fill="#455A64"/>
|
||||
<path d="M111.388 147.927L104.405 143.875C104.16 143.734 103.961 143.834 103.961 144.1C103.961 144.366 104.16 144.696 104.405 144.838L111.388 148.89C111.634 149.031 111.833 148.931 111.833 148.665C111.832 148.399 111.633 148.068 111.388 147.927Z" fill="#E0E0E0"/>
|
||||
<path d="M111.388 150.823L104.405 146.771C104.16 146.63 103.961 146.73 103.961 146.996C103.961 147.262 104.16 147.592 104.405 147.734L111.388 151.786C111.634 151.927 111.833 151.827 111.833 151.561C111.832 151.295 111.633 150.964 111.388 150.823Z" fill="#E0E0E0"/>
|
||||
<path d="M111.388 153.718L104.405 149.666C104.16 149.525 103.961 149.625 103.961 149.891C103.961 150.157 104.16 150.487 104.405 150.629L111.388 154.681C111.634 154.822 111.833 154.722 111.833 154.456C111.832 154.19 111.633 153.859 111.388 153.718Z" fill="#E0E0E0"/>
|
||||
<path d="M107.988 225.874C107.909 223.503 109.477 220.563 111.491 219.308C112.486 218.689 113.402 218.598 114.085 218.949L114.087 218.947C118.208 221.015 147.17 239.587 149.022 240.501L149.045 240.514C149.39 240.699 149.613 241.111 149.632 241.707C149.672 242.903 148.882 244.385 147.867 245.016C147.359 245.333 146.891 245.375 146.545 245.189L146.518 245.175C143.586 243.56 115.003 231.379 109.159 228.245L109.157 228.245C109.156 228.244 109.155 228.243 109.154 228.243C108.471 227.875 108.028 227.057 107.988 225.874Z" fill="#E84A5F"/>
|
||||
<path opacity="0.1" d="M109.127 221.869C109.746 220.808 110.571 219.881 111.49 219.309C112.481 218.691 113.395 218.6 114.077 218.946C114.215 219.022 114.257 219.047 114.161 218.992C117.924 220.916 139.478 234.667 146.731 239.136C146.746 239.146 146.764 239.156 146.779 239.166C146.88 239.228 146.977 239.287 147.072 239.346C147.101 239.364 147.133 239.383 147.162 239.401C147.219 239.436 147.272 239.468 147.327 239.502C147.393 239.542 147.46 239.582 147.521 239.621C147.526 239.624 147.531 239.627 147.536 239.629C148.304 240.097 148.821 240.403 149.021 240.501L149.045 240.514C149.108 240.548 149.161 240.597 149.215 240.645C149.457 240.864 149.615 241.218 149.632 241.708C149.636 241.842 149.627 241.982 149.611 242.123C149.605 242.176 149.595 242.229 149.586 242.283C149.573 242.367 149.556 242.452 149.536 242.537C149.52 242.604 149.502 242.672 149.482 242.739C149.459 242.819 149.432 242.898 149.403 242.977C149.382 243.036 149.363 243.095 149.339 243.155C149.335 243.164 149.33 243.173 149.326 243.183L109.127 221.869Z" fill="black"/>
|
||||
<path d="M147.875 245.016C148.886 244.388 149.672 242.912 149.633 241.721C149.593 240.531 148.742 240.076 147.731 240.706C146.72 241.335 145.933 242.811 145.973 244.001C146.013 245.19 146.865 245.645 147.875 245.016Z" fill="#E84A5F"/>
|
||||
<path d="M156.529 245.812C156.56 246.727 155.955 247.86 155.178 248.344C154.792 248.585 154.437 248.619 154.172 248.48L154.169 248.479L154.168 248.478L147.163 244.749C147.161 244.749 147.16 244.747 147.158 244.747L147.157 244.746C146.894 244.604 146.724 244.29 146.709 243.834C146.678 242.92 147.283 241.787 148.06 241.303C148.448 241.061 148.806 241.027 149.071 241.168L156.075 244.897L156.075 244.898C156.341 245.037 156.514 245.354 156.529 245.812Z" fill="#37474F"/>
|
||||
<path d="M156.074 244.897C156.341 245.038 156.514 245.354 156.529 245.813C156.541 246.157 156.462 246.533 156.318 246.893L147.284 242.073C147.502 241.756 147.768 241.483 148.059 241.302C148.447 241.06 148.805 241.027 149.07 241.168L156.075 244.897L156.074 244.897Z" fill="#263238"/>
|
||||
<path d="M147.543 252.031C147.543 247.542 150.51 243.053 156.442 239.628C168.307 232.777 187.544 232.777 199.41 239.628C205.343 243.053 208.309 247.542 208.309 252.031V260.3C208.309 264.789 205.342 269.278 199.409 272.703C187.544 279.554 168.307 279.554 156.441 272.703C150.509 269.278 147.543 264.789 147.543 260.3V252.031H147.543ZM197.941 242.172C192.642 239.113 185.534 237.428 177.926 237.428C170.319 237.428 163.21 239.113 157.912 242.172C153.121 244.938 150.482 248.44 150.482 252.031C150.482 255.623 153.121 259.124 157.912 261.89C163.211 264.95 170.319 266.634 177.926 266.634C185.534 266.634 192.642 264.95 197.941 261.89C202.731 259.124 205.37 255.623 205.37 252.031C205.37 248.44 202.732 244.938 197.941 242.172Z" fill="#E84A5F"/>
|
||||
<path opacity="0.3" d="M199.412 264.435C187.547 271.285 168.31 271.285 156.444 264.435C144.579 257.584 144.579 246.478 156.444 239.627C168.31 232.777 187.547 232.777 199.412 239.627C211.277 246.478 211.277 257.585 199.412 264.435ZM205.372 252.032C205.372 248.44 202.733 244.938 197.942 242.172C192.643 239.113 185.535 237.428 177.928 237.428C170.32 237.428 163.211 239.113 157.913 242.172C153.122 244.938 150.484 248.44 150.484 252.032C150.484 255.623 153.123 259.124 157.913 261.89C163.213 264.95 170.321 266.634 177.928 266.634C185.535 266.634 192.644 264.95 197.942 261.89C202.733 259.124 205.372 255.623 205.372 252.032Z" fill="white"/>
|
||||
<path d="M205.375 252.031C205.375 253.441 204.969 254.828 204.187 256.168C202.983 254.081 200.862 252.125 197.941 250.444C192.646 247.382 185.535 245.696 177.925 245.696C170.32 245.696 163.21 247.382 157.915 250.444C154.995 252.124 152.873 254.081 151.663 256.168C150.887 254.828 150.482 253.441 150.482 252.031C150.482 248.44 153.12 244.938 157.916 242.17C163.211 239.114 170.322 237.427 177.926 237.427C185.536 237.427 192.646 239.114 197.941 242.17C202.736 244.938 205.375 248.44 205.375 252.031Z" fill="#E84A5F"/>
|
||||
<path opacity="0.1" d="M205.375 252.031C205.375 253.441 204.969 254.828 204.187 256.168C202.983 254.081 200.862 252.125 197.941 250.444C192.646 247.382 185.535 245.696 177.925 245.696C170.32 245.696 163.21 247.382 157.915 250.444C154.995 252.124 152.873 254.081 151.663 256.168C150.887 254.828 150.482 253.441 150.482 252.031C150.482 248.44 153.12 244.938 157.916 242.17C163.211 239.114 170.322 237.427 177.926 237.427C185.536 237.427 192.646 239.114 197.941 242.17C202.736 244.938 205.375 248.44 205.375 252.031Z" fill="black"/>
|
||||
<path opacity="0.4" d="M197.943 245.916C192.644 242.857 185.536 241.172 177.928 241.172C170.32 241.172 163.212 242.857 157.914 245.916C153.96 248.199 151.478 250.982 150.729 253.903C151.478 256.824 153.961 259.608 157.914 261.89C163.213 264.95 170.321 266.635 177.928 266.635C185.536 266.635 192.645 264.95 197.943 261.89C201.896 259.608 204.379 256.825 205.128 253.903C204.379 250.982 201.896 248.199 197.943 245.916Z" fill="white"/>
|
||||
<path opacity="0.1" d="M185.086 269.084V277.347C190.334 276.618 195.311 275.073 199.407 272.705C205.343 269.278 208.311 264.789 208.311 260.299V252.03C208.311 251.126 208.187 250.221 207.946 249.321H207.94C209.38 254.663 206.536 260.316 199.407 264.435C195.312 266.805 190.334 268.35 185.086 269.084Z" fill="black"/>
|
||||
<path d="M54.3013 144.26C54.3013 144.26 33.7539 145.176 31.5106 163.145C29.2674 181.114 46.6511 180.462 51.665 180.517C53.9385 180.541 58.4779 180.529 62.7616 180.507C71.8481 180.462 79.0975 177.054 80.8755 168.144C81.0829 167.105 81.2024 166.044 81.2087 164.969C81.2646 155.311 74.0121 142.668 54.3013 144.26Z" fill="#FF725E"/>
|
||||
<path d="M73.4143 165.251L47.0965 167.117C44.3382 167.313 41.9435 165.235 41.7477 162.477C41.552 159.719 43.6298 157.324 46.3881 157.128L72.7059 155.262C75.4642 155.066 77.8596 157.144 78.0546 159.902C78.2504 162.66 76.1725 165.056 73.4143 165.251Z" fill="#263238"/>
|
||||
<path d="M52.8906 162.437C52.7687 163.317 51.9569 163.929 51.0777 163.807C50.1984 163.685 49.5855 162.873 49.7075 161.995C49.8302 161.115 50.6419 160.502 51.5204 160.624C52.3997 160.747 53.0134 161.559 52.8906 162.437Z" fill="white"/>
|
||||
<path d="M71.2744 161.127C71.1525 162.006 70.34 162.619 69.4615 162.497C68.5822 162.375 67.9693 161.564 68.0913 160.684C68.214 159.805 69.0257 159.192 69.9042 159.314C70.7835 159.436 71.3971 160.248 71.2744 161.127Z" fill="white"/>
|
||||
<path d="M60.7896 154.811C60.743 154.823 60.5356 154.078 60.1853 152.885C59.8412 151.692 59.2594 150.076 58.2659 148.469C57.2981 146.853 55.9986 145.69 54.9088 145.126C53.8229 144.546 53.0423 144.434 53.0586 144.374C53.0617 144.354 53.2559 144.368 53.6015 144.436C53.9456 144.509 54.4396 144.651 55.0113 144.926C56.164 145.453 57.5459 146.643 58.5378 148.303C59.5507 149.94 60.1131 151.612 60.4028 152.826C60.5535 153.433 60.656 153.928 60.7212 154.27C60.7857 154.614 60.8106 154.806 60.7896 154.811Z" fill="white"/>
|
||||
<path d="M57.8646 180.526C57.8296 180.482 58.4813 180.009 59.3334 179.053C60.1785 178.101 61.1945 176.608 61.7266 174.732C62.2097 172.845 62.4016 171.064 62.3736 169.784C62.3588 168.497 62.3371 167.696 62.3853 167.693C62.407 167.692 62.4396 167.891 62.4792 168.25C62.5181 168.61 62.5663 169.131 62.5989 169.779C62.6843 171.08 62.529 172.887 62.0334 174.82C61.4842 176.756 60.4037 178.276 59.4996 179.206C59.046 179.675 58.6367 180.01 58.3454 180.228C58.0502 180.44 57.8778 180.542 57.8646 180.526Z" fill="white"/>
|
||||
<g opacity="0.3">
|
||||
<path d="M76.2148 176.446C74.0772 174.965 72.4461 175.02 69.7251 174.505C67.0042 173.99 64.2234 173.861 61.4651 173.799C55.0864 173.657 48.5019 173.911 43.0095 176.146C41.4607 176.776 40.1418 177.551 39.3052 178.748C39.3052 178.748 41.9446 180.181 47.3757 180.397C52.5675 180.603 63.4303 180.484 63.4303 180.484C63.4303 180.484 68.2904 180.529 72.467 178.736C75.9041 177.261 76.2148 176.446 76.2148 176.446Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M79.6781 159.615C79.6781 159.615 79.7706 159.937 79.7791 160.567C79.7838 161.19 79.6968 162.15 79.1585 163.234C78.6334 164.31 77.5685 165.462 75.9878 166.138C74.4133 166.832 72.4567 167.058 70.3408 167.21C66.0928 167.539 61.0423 167.929 55.4365 168.362C54.0337 168.469 52.5967 168.579 51.1287 168.691C49.6591 168.785 48.1669 168.965 46.6165 168.95C45.0848 168.939 43.4209 168.596 42.1548 167.536C40.9089 166.49 40.0786 164.946 39.8774 163.295C39.663 161.64 40.1306 159.943 41.0884 158.639C42.0407 157.326 43.4419 156.397 44.948 155.981C45.7062 155.76 46.4822 155.725 47.2224 155.652C47.9704 155.583 48.7114 155.515 49.4447 155.448C50.9112 155.313 52.3466 155.181 53.7471 155.053C56.548 154.798 59.21 154.555 61.7026 154.328C64.199 154.145 66.5013 153.771 68.635 153.644C69.7008 153.579 70.7222 153.577 71.6823 153.653C72.6416 153.716 73.5504 153.866 74.3644 154.12C76.0026 154.61 77.2601 155.46 78.0889 156.324C78.9107 157.207 79.3014 158.083 79.4785 158.681C79.5834 158.979 79.6121 159.219 79.6432 159.377C79.6719 159.534 79.6836 159.614 79.6781 159.615C79.6533 159.621 79.6199 159.288 79.4179 158.699C79.223 158.112 78.819 157.262 77.9996 156.408C77.1723 155.574 75.9295 154.754 74.3139 154.29C73.51 154.047 72.6229 153.91 71.669 153.854C70.7175 153.787 69.7078 153.796 68.6506 153.868C66.5347 154.008 64.2301 154.395 61.7344 154.589C59.2426 154.826 56.5807 155.078 53.7797 155.344C52.3784 155.476 50.943 155.612 49.4765 155.75C48.7433 155.819 48.0022 155.888 47.2542 155.959C46.5015 156.034 45.7497 156.07 45.0327 156.282C43.5911 156.682 42.2519 157.573 41.3455 158.825C40.4336 160.068 39.9908 161.682 40.1943 163.255C40.3846 164.827 41.1801 166.303 42.3576 167.291C43.5484 168.288 45.1213 168.624 46.6227 168.637C48.1358 168.654 49.6381 168.479 51.1062 168.386C52.575 168.278 54.012 168.172 55.4155 168.068C61.0237 167.661 66.0757 167.294 70.3253 166.985C72.4411 166.847 74.3714 166.638 75.9186 165.974C77.469 165.329 78.5177 164.221 79.049 163.178C79.5927 162.127 79.6999 161.184 79.7154 160.568C79.7271 159.943 79.6587 159.617 79.6781 159.615Z" fill="white"/>
|
||||
<path d="M31.3772 166.154C31.357 166.119 31.764 165.826 32.4732 165.435C33.1816 165.043 34.1999 164.568 35.3759 164.179C36.5526 163.793 37.6556 163.57 38.4572 163.465C39.2604 163.358 39.7614 163.352 39.766 163.393C39.7793 163.494 37.7939 163.714 35.476 164.483C33.1551 165.241 31.4269 166.243 31.3772 166.154Z" fill="white"/>
|
||||
<path d="M55.2649 146.954C55.4241 146.88 55.6377 147.025 55.6276 147.2C55.6175 147.375 55.3899 147.495 55.24 147.404C55.0901 147.312 55.0916 147.055 55.2431 146.966" fill="white"/>
|
||||
<path d="M57.7981 152.037C57.9573 151.964 58.1709 152.108 58.1608 152.283C58.1507 152.458 57.9231 152.578 57.7732 152.487C57.6233 152.395 57.6248 152.138 57.7763 152.049" fill="white"/>
|
||||
<path d="M36.7649 162.355C36.9241 162.281 37.1377 162.425 37.1276 162.6C37.1175 162.776 36.8899 162.895 36.74 162.804C36.5901 162.713 36.5916 162.456 36.7431 162.366" fill="white"/>
|
||||
<path d="M32.4982 163.93C32.6574 163.856 32.8711 164.001 32.861 164.175C32.8509 164.351 32.6233 164.471 32.4734 164.38C32.3235 164.288 32.325 164.031 32.4764 163.942" fill="white"/>
|
||||
<g opacity="0.3">
|
||||
<path d="M59.6742 145.304C59.6905 145.538 57.8147 145.802 54.8413 146.317C51.8857 146.848 47.7698 147.663 43.7804 149.752C41.8113 150.805 40.1017 152.11 38.7439 153.488C37.3908 154.871 36.3694 156.303 35.6944 157.603C34.318 160.207 34.1766 162.124 33.9047 162.092C33.8045 162.086 33.7222 161.604 33.775 160.728C33.8216 159.852 34.0733 158.588 34.6729 157.123C35.2664 155.656 36.2715 154.03 37.6751 152.478C39.0818 150.931 40.9025 149.48 43.0331 148.342C45.1614 147.227 47.334 146.495 49.3333 146.028C51.335 145.556 53.1635 145.321 54.696 145.199C57.7665 144.963 59.661 145.099 59.6742 145.304Z" fill="white"/>
|
||||
</g>
|
||||
<g opacity="0.3">
|
||||
<path d="M36.2977 171.419C35.9878 171.722 34.8957 171.088 34.2153 169.777C33.5302 168.468 33.6358 167.21 34.0623 167.129C34.5003 167.038 35.0549 167.952 35.6305 169.039C36.1921 170.133 36.6224 171.111 36.2977 171.419Z" fill="white"/>
|
||||
</g>
|
||||
<path d="M64.2134 161.477C64.2413 161.468 64.3493 162.022 64.0106 162.824C63.839 163.216 63.5492 163.659 63.0995 164.023C62.6536 164.391 62.0431 164.646 61.3805 164.705C60.7172 164.76 60.0717 164.614 59.5699 164.329C59.0643 164.048 58.7031 163.662 58.4662 163.305C57.9947 162.572 58.0056 162.008 58.0351 162.012C58.091 161.996 58.164 162.527 58.6503 163.174C58.8942 163.491 59.2437 163.829 59.709 164.07C60.1696 164.314 60.7514 164.437 61.3534 164.387C61.9546 164.333 62.5061 164.112 62.9185 163.792C63.3356 163.475 63.6223 163.081 63.8071 162.728C64.1745 162.006 64.1551 161.471 64.2134 161.477Z" fill="white"/>
|
||||
<path d="M79.9991 186.905C81.1992 187.341 79.8282 205.037 78.9054 214.052C78.4106 218.884 77.679 223.908 74.906 227.896C71.8168 232.338 66.3345 234.315 60.9539 234.888C53.4598 235.685 47.5884 232.136 44.1831 226.178C40.9518 220.526 38.6332 214.03 37.8145 207.571C36.8708 200.13 36.2323 195.28 36.4358 188.773C36.4358 188.773 58.2392 178.984 79.9991 186.905Z" fill="#FF725E"/>
|
||||
<path d="M49.9938 222.645C50.1476 222.56 50.3705 222.69 50.3721 222.866C50.3736 223.042 50.1538 223.176 49.9984 223.095C49.8431 223.014 49.8276 222.756 49.9728 222.658" fill="white"/>
|
||||
<path d="M57.86 222.908C58.0138 222.823 58.2359 222.954 58.2383 223.129C58.2398 223.305 58.02 223.439 57.8646 223.358C57.7093 223.277 57.6946 223.02 57.839 222.921" fill="white"/>
|
||||
<path d="M67.0231 215.435C67.1769 215.35 67.399 215.48 67.4014 215.656C67.4029 215.832 67.1831 215.966 67.0277 215.885C66.8724 215.804 66.8576 215.547 67.0021 215.448" fill="white"/>
|
||||
<path d="M64.5485 195.147C64.7023 195.062 64.9244 195.193 64.9267 195.368C64.9283 195.544 64.7085 195.678 64.5531 195.598C64.3978 195.516 64.3823 195.259 64.5275 195.16" fill="white"/>
|
||||
<path d="M72.3395 199.013C72.4933 198.928 72.7154 199.059 72.7178 199.234C72.7193 199.41 72.4995 199.544 72.3442 199.463C72.1888 199.382 72.1741 199.125 72.3185 199.026" fill="white"/>
|
||||
<path d="M41.2711 219.679C41.4249 219.594 41.6471 219.725 41.6494 219.9C41.651 220.076 41.4311 220.21 41.2758 220.129C41.1204 220.048 41.1057 219.791 41.2501 219.692" fill="white"/>
|
||||
<path d="M40.4625 212.927C40.6163 212.842 40.8385 212.973 40.8408 213.148C40.8424 213.324 40.6225 213.458 40.4672 213.377C40.3118 213.296 40.2963 213.039 40.4416 212.94" fill="white"/>
|
||||
<path d="M40.3366 206.858C40.4904 206.774 40.7125 206.904 40.7148 207.08C40.7164 207.255 40.4966 207.39 40.3412 207.309C40.1859 207.227 40.1703 206.97 40.3156 206.872" fill="white"/>
|
||||
<path d="M40.234 200.411C40.3878 200.326 40.61 200.457 40.6123 200.632C40.6139 200.808 40.394 200.942 40.2387 200.86C40.0833 200.779 40.0678 200.522 40.213 200.423" fill="white"/>
|
||||
<path d="M77.2243 197.797C77.3781 197.713 77.6002 197.843 77.6025 198.019C77.6041 198.194 77.3842 198.329 77.2289 198.248C77.0735 198.166 77.058 197.909 77.2033 197.811" fill="white"/>
|
||||
<path d="M67.7828 223.027C67.9366 222.942 68.1588 223.073 68.1611 223.248C68.1627 223.424 67.9429 223.558 67.7875 223.477C67.6322 223.396 67.6166 223.139 67.7619 223.04" fill="white"/>
|
||||
<path d="M68.1803 229.411C68.3341 229.326 68.5563 229.457 68.5586 229.632C68.5601 229.808 68.3404 229.942 68.185 229.861C68.0297 229.78 68.0149 229.523 68.1594 229.424" fill="white"/>
|
||||
<path d="M48.6836 230.52C48.6759 230.528 48.5679 230.43 48.369 230.234C48.1694 230.039 47.8836 229.743 47.5387 229.341C46.8497 228.544 45.892 227.299 45.2216 225.505C44.883 224.614 44.6368 223.594 44.4138 222.508C44.173 221.423 43.9431 220.257 43.707 219.03C43.2425 216.573 42.8106 213.857 42.4572 210.993C41.7426 205.262 41.5235 200.032 41.4964 196.253C41.4894 194.362 41.5196 192.833 41.56 191.776C41.5841 191.274 41.6035 190.87 41.6183 190.561C41.6354 190.282 41.6494 190.137 41.6603 190.137C41.6711 190.137 41.6789 190.284 41.6828 190.562C41.6828 190.873 41.6836 191.276 41.6843 191.778C41.682 192.834 41.6867 194.363 41.7216 196.249C41.8063 200.022 42.0603 205.236 42.7733 210.954C43.126 213.811 43.5477 216.523 43.9952 218.976C44.2227 220.203 44.4425 221.368 44.6717 222.454C44.8845 223.545 45.1137 224.546 45.4329 225.427C46.0637 227.197 46.9779 228.445 47.6335 229.261C47.9613 229.673 48.2316 229.981 48.4149 230.19C48.599 230.399 48.6914 230.513 48.6836 230.52Z" fill="white"/>
|
||||
<path d="M64.336 212.088C64.4238 212.084 64.726 216.999 65.0103 223.065C65.2945 229.133 65.4538 234.054 65.366 234.058C65.2782 234.062 64.9761 229.148 64.6918 223.08C64.4075 217.014 64.2483 212.092 64.336 212.088Z" fill="white"/>
|
||||
<path d="M57.1406 183.979C57.1585 183.967 57.3022 184.135 57.5469 184.449C57.7908 184.764 58.1364 185.225 58.5567 185.799C59.3979 186.947 60.5421 188.546 61.7895 190.322C61.9457 190.544 62.0987 190.764 62.2509 190.981L62.3076 191.062C62.3333 191.087 62.3596 191.111 62.3729 191.163C62.3884 191.208 62.4031 191.257 62.4132 191.301L62.4241 191.404C62.442 191.543 62.4459 191.674 62.4513 191.803C62.4684 192.322 62.4606 192.816 62.4513 193.288C62.4303 194.231 62.3892 195.077 62.3511 195.788C62.3115 196.499 62.2711 197.074 62.2361 197.471C62.2012 197.867 62.1733 198.086 62.1515 198.086C62.1041 198.084 62.1033 197.203 62.1259 195.78C62.1352 195.042 62.1461 194.202 62.1577 193.284C62.1593 192.815 62.16 192.321 62.1398 191.817C62.1336 191.692 62.1282 191.563 62.1119 191.444L62.1018 191.352C62.0956 191.334 62.0909 191.319 62.0886 191.301C62.0917 191.27 62.0179 191.218 61.9915 191.162C61.8393 190.945 61.6847 190.726 61.5285 190.504C60.2811 188.727 59.1664 187.108 58.3726 185.927C57.9757 185.337 57.6587 184.855 57.4459 184.519C57.2323 184.184 57.1228 183.992 57.1406 183.979Z" fill="white"/>
|
||||
<path d="M64.2075 221.354C64.2091 221.376 63.9318 221.412 63.43 221.457C62.9282 221.504 62.2004 221.552 61.301 221.598C59.5012 221.689 57.0109 221.747 54.2612 221.686C51.5108 221.624 49.0252 221.455 47.2316 221.284C46.3345 221.199 45.6106 221.117 45.1111 221.049C44.6117 220.982 44.3367 220.934 44.339 220.912C44.3414 220.89 44.6202 220.895 45.1228 220.926C45.689 220.961 46.4013 221.006 47.2495 221.06C49.0446 221.174 51.5255 221.306 54.269 221.368C57.0117 221.427 59.4958 221.406 61.2939 221.372C62.1429 221.357 62.8567 221.344 63.4246 221.333C63.9271 221.326 64.206 221.333 64.2075 221.354Z" fill="white"/>
|
||||
<path d="M80.1134 198.777C80.1227 198.797 79.9658 198.892 79.6722 199.048C79.3794 199.205 78.9436 199.41 78.3936 199.633C77.2961 200.089 75.7278 200.594 73.9561 200.978C72.1835 201.362 70.5524 201.561 69.3701 201.651C68.1872 201.739 67.4531 201.73 67.4508 201.689C67.4485 201.641 68.1762 201.571 69.3476 201.426C70.5181 201.28 72.1315 201.047 73.8885 200.666C75.6447 200.287 77.2052 199.821 78.3136 199.423C79.4236 199.03 80.0916 198.731 80.1134 198.777Z" fill="white"/>
|
||||
<path d="M69.9649 205.5C69.6759 209.455 66.2349 212.427 62.2797 212.138C58.3245 211.849 55.3518 208.408 55.6408 204.453C55.9297 200.497 59.3708 197.525 63.326 197.814C67.282 198.103 70.2546 201.544 69.9649 205.5Z" fill="#263238"/>
|
||||
<path d="M68.023 205.357C67.8125 208.24 65.3052 210.405 62.4226 210.195C59.5401 209.984 57.3745 207.477 57.585 204.594C57.7955 201.712 60.3029 199.546 63.1854 199.757C66.0679 199.968 68.2335 202.475 68.023 205.357Z" fill="white"/>
|
||||
<path d="M65.4993 206.308C65.4791 206.296 65.4636 205.986 65.4504 205.445C65.4372 204.904 65.427 204.133 65.4255 203.19L65.483 203.294C64.6993 202.836 63.7866 202.304 62.7908 201.723L62.9414 201.725C62.0963 202.2 61.1805 202.715 60.2251 203.252C60.1514 203.374 60.3246 203.085 60.3067 203.115V203.116V203.117V203.12V203.127V203.14V203.165L60.3059 203.217L60.3044 203.319L60.3013 203.523L60.2951 203.927C60.2904 204.194 60.2857 204.459 60.2818 204.719C60.2717 205.239 60.2624 205.744 60.2531 206.231L60.1801 206.099C61.1642 206.7 62.0614 207.248 62.8397 207.724L62.7209 207.723C63.5512 207.276 64.2348 206.92 64.7179 206.674C65.1995 206.429 65.4791 206.296 65.4993 206.308C65.5195 206.32 65.2779 206.478 64.8197 206.758C64.3614 207.038 63.684 207.441 62.8358 207.931L62.7776 207.964L62.717 207.929C61.9286 207.469 61.0205 206.94 60.0247 206.359L59.9502 206.315L59.951 206.227C59.9556 205.74 59.9611 205.236 59.9665 204.716C59.9696 204.455 59.9727 204.191 59.9766 203.924L59.982 203.52L59.9852 203.316L59.9867 203.214L59.9875 203.162V203.137V203.124V203.117V203.114V203.113V203.112C59.9696 203.141 60.1428 202.852 60.0698 202.974C61.0291 202.443 61.948 201.934 62.7954 201.464L62.8723 201.421L62.9461 201.466C63.9303 202.067 64.8313 202.618 65.6057 203.091L65.6655 203.127L65.6632 203.194C65.6345 204.174 65.6011 204.961 65.5723 205.497C65.5436 206.033 65.5195 206.32 65.4993 206.308Z" fill="#FF725E"/>
|
||||
<g opacity="0.2">
|
||||
<path d="M36.434 188.772C36.434 188.772 58.2591 178.842 79.998 186.904C79.998 186.904 69.8327 195.239 36.434 188.772Z" fill="black"/>
|
||||
</g>
|
||||
<path d="M79.999 186.904C79.999 186.904 93.1168 176.35 95.4237 177.141C97.7307 177.932 98.6177 179.15 97.5528 182.001C96.4879 184.852 79.999 200.635 79.999 200.635V186.904Z" fill="#FF725E"/>
|
||||
<path d="M79.4897 207.082C79.5177 207.084 79.5651 206.804 79.6272 206.296C79.6909 205.788 79.7608 205.05 79.8323 204.138C79.976 202.313 80.1119 199.788 80.1849 196.997C80.2595 194.206 80.2673 191.678 80.2416 189.849C80.23 188.935 80.209 188.194 80.1857 187.683C80.1616 187.171 80.1352 186.889 80.1073 186.889C80.0793 186.889 80.0528 187.171 80.028 187.683C80.0078 188.284 79.9838 189.005 79.9558 189.847C79.9084 191.778 79.8478 194.251 79.781 196.986C79.6917 199.719 79.6101 202.191 79.5472 204.12C79.5177 204.961 79.4921 205.682 79.4703 206.283C79.4563 206.795 79.4617 207.08 79.4897 207.082Z" fill="#263238"/>
|
||||
<g opacity="0.2">
|
||||
<path d="M44.3057 192.377C43.6516 199.221 41.3595 206.736 38.884 213.15C38.4412 211.186 38.0621 209.297 37.8144 207.57C38.094 205.609 39.3733 202.964 40.1796 201.155C41.4822 198.23 42.7848 195.307 44.0882 192.383" fill="black"/>
|
||||
</g>
|
||||
<path d="M36.4355 188.771C36.4355 188.771 24.4362 213.276 29.0602 215.909C35.6331 219.65 44.7188 190.345 44.7188 190.345L40.4653 189.5L36.4355 188.771Z" fill="#FF725E"/>
|
||||
<path d="M35.3051 212.086C35.3284 212.101 35.5264 211.838 35.8643 211.347C36.203 210.857 36.6651 210.128 37.1941 209.203C38.2652 207.361 39.5795 204.721 40.8262 201.72C42.0705 198.717 43.0298 195.934 43.652 193.898C43.9674 192.882 44.1965 192.052 44.3433 191.475C44.4894 190.898 44.5569 190.575 44.5297 190.568C44.5033 190.56 44.3837 190.867 44.1919 191.43C43.9728 192.072 43.7009 192.867 43.3794 193.81C42.6896 195.817 41.6915 198.574 40.4526 201.565C39.2113 204.553 37.9452 207.196 36.9432 209.064C36.4484 210.002 36.0267 210.749 35.73 211.263C35.4348 211.778 35.2818 212.07 35.3051 212.086Z" fill="#263238"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 7.9 MiB |
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,3 +0,0 @@
|
||||
<svg width="14" height="8" viewBox="0 0 14 8" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M1 1L7 7L13 1" stroke="#4B4B4B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 208 B |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 1.8 MiB |
|
Before Width: | Height: | Size: 2.1 KiB |