You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

232 lines
9.9 KiB

# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
import json
import os
import re
from odoo import http
from odoo.http import request
def minify_css(path):
"""Minify css string"""
with open(path, 'r') as f:
css = f.read()
css = re.sub(r'/\*[\s\S]*?\*/', "", css)
css = re.sub(r'url\((["\'])([^)]*)\1\)', r'url(\2)', css)
css = re.sub(r'\s+', ' ', css)
css = re.sub(r'#([0-9a-f])\1([0-9a-f])\2([0-9a-f])\3(\s|;)', r'#\1\2\3\4',
css)
css = re.sub(r':\s*0(\.\d+([cm]m|e[mx]|in|p[ctx]))\s*;', r':\1;', css)
rules = re.findall(r'([^{]+){([^}]*)}', css)
selectors_list = []
css_values = {}
for rule in rules:
selector = rule[0]
content = rule[1]
if selector not in selectors_list:
selectors_list.append(selector)
css_values[selector] = content
else:
css_values[selector] = css_values[selector] + content
with open(path, 'w') as f:
selector_dict = {}
for selector in selectors_list:
rule = css_values[selector].split(';')
dict_rule = {}
for r in rule:
if r:
split_rule = r.split(':')
if len(split_rule) == 2:
dict_rule[split_rule[0].strip()] = split_rule[1]
selector_dict[selector] = dict_rule
f.write('/* This Styles are generated automatically by Theme Studio'
' */\n')
for selector in selector_dict:
f.write(selector + '{')
for rule_data in selector_dict[selector]:
if rule_data != 'pointer-events':
if selector_dict[selector][rule_data].find(
'!important') == -1:
f.write(rule_data + ':' +
selector_dict[selector][rule_data] +
' !important;')
else:
f.write(rule_data + ':' +
selector_dict[selector][rule_data] + ';')
f.write('}')
class ThemeStudio(http.Controller):
@http.route(['/theme_studio/save_styles'], type="json")
def save_styles(self, changed_styles, object_class, hover=False):
"""Create Dynamic Styles css file"""
changed_styles = json.loads(changed_styles)
working_dir = os.path.dirname(os.path.realpath(__file__))
working_dir = working_dir.replace('/controllers', '')
file_path = working_dir + '/static/src/css/dynamic_styles.css'
style_file = open(file_path, 'a')
if os.stat(file_path).st_size == 0:
style_file.write('/* This file is generated automatically by '
'Theme Infinito */\n')
style_file.write('\n.' + object_class + ':hover {\n') if hover else \
style_file.write('\n.' + object_class + ' {\n')
for style in changed_styles:
style_file.write(
'\t' + style + ': ' + changed_styles[style] + ';\n')
style_file.write('}\n')
style_file.close()
minify_css(file_path)
return True
@http.route(['/theme_studio/get_current_style'], type="json")
def get_current_style(self, selector):
working_dir = os.path.dirname(os.path.realpath(__file__))
file_path = working_dir.replace('controllers',
'static/src/css/dynamic_styles.css')
style_file = open(file_path, 'r')
css = style_file.read()
css = re.sub(r'/\*[\s\S]*?\*/', "", css)
css = re.sub(r'url\((["\'])([^)]*)\1\)', r'url(\2)', css)
css = re.sub(r'\s+', ' ', css)
css = re.sub(r'#([0-9a-f])\1([\da-f])\2([0-9a-f])\3(\s|;)',
r'#\1\2\3\4', css)
css = re.sub(r':\s*0(\.\d+([cm]m|e[mx]|in|p[ctx]))\s*;', r':\1;', css)
rules = re.findall(r'([^{]+){([^}]*)}', css)
for rule in rules:
selector_now = rule[0]
content = rule[1]
if selector == selector_now.strip():
contents = content.split(';')
content = []
for c in contents:
c = c.split(':')
if c[0] != '' and len(c) > 1:
content.append([c[0], c[1].strip().replace('!important', '')])
return content
return False
@http.route(['/theme_studio/reset_to_default'], type="json")
def reset_to_default(self):
working_dir = os.path.dirname(os.path.realpath(__file__))
file_path = working_dir.replace('controllers',
'static/src/css/dynamic_styles.css')
style_file = open(file_path, 'w')
style_file.write('')
return True
@http.route(['/theme_studio/set_advanced_data'], type="json")
def set_advanced_data(self, vals):
set_param = request.env['ir.config_parameter'].sudo().set_param
set_param('backend_theme_infinito.is_user_edit', vals['userEdit'])
set_param('backend_theme_infinito.is_sidebar_enabled', vals['sidebar'])
set_param('backend_theme_infinito.is_fullscreen_enabled', vals['fullscreen'])
set_param('backend_theme_infinito.is_sidebar_icon', vals['sidebarIcon'])
set_param('backend_theme_infinito.is_sidebar_name', vals['sidebarName'])
set_param('backend_theme_infinito.is_sidebar_company', vals['sidebarCompany'])
set_param('backend_theme_infinito.is_sidebar_user', vals['sidebarUser'])
set_param('backend_theme_infinito.is_recent_apps', vals['recentApps'])
set_param('backend_theme_infinito.is_fullscreen_app', vals['fullScreenApp'])
set_param('backend_theme_infinito.is_rtl', vals['infinitoRtl'])
set_param('backend_theme_infinito.is_dark', vals['infinitoDark'])
set_param('backend_theme_infinito.dark_mode', vals['infinitoDarkMode'])
set_param('backend_theme_infinito.dark_start', vals['infinitoDarkStart'])
set_param('backend_theme_infinito.dark_end', vals['infinitoDarkEnd'])
set_param('backend_theme_infinito.is_menu_bookmark', vals['infinitoBookmark'])
set_param('backend_theme_infinito.is_chameleon', vals['infinitoChameleon'])
@http.route(['/theme_studio/set_advanced_data_user'], type="json")
def set_advanced_data_user(self, vals):
request.env.user.write({
'is_sidebar_enabled': vals['sidebar'],
'is_fullscreen_enabled': vals['fullscreen'],
'is_sidebar_icon': vals['sidebarIcon'],
'is_sidebar_name': vals['sidebarName'],
'is_sidebar_company': vals['sidebarCompany'],
'is_sidebar_user': vals['sidebarUser'],
'is_recent_apps': vals['recentApps'],
'is_fullscreen_app': vals['fullScreenApp'],
'is_rtl': vals['infinitoRtl'],
'is_dark': vals['infinitoDark'],
'dark_mode': vals['infinitoDarkMode'],
'dark_start': vals['infinitoDarkStart'],
'dark_end': vals['infinitoDarkEnd'],
'is_menu_bookmark': vals['infinitoBookmark'],
'loader_class': vals['loaderClass'],
'is_chameleon': vals['infinitoChameleon'],
})
return True
@http.route(['/theme_studio/add_recent_app'], type="json")
def add_recent_app(self, app):
recent_app = request.env['recent.apps'].sudo()
exist = recent_app.search([
('app_id', '=', int(app.get('appId'))),
('user_id', '=', request.env.user.id)
])
exist.unlink() if exist else None
total_recent = recent_app.search([('user_id', '=', request.env.user.id)])
if len(total_recent) > 4:
total_recent[0].unlink()
recent_app.create({
'app_id': int(app.get('appId')),
'user_id': request.env.user.id
})
@http.route(['/theme_studio/get_recent_apps'], type="json")
def get_recent_apps(self):
recent_app = request.env['recent.apps'].sudo()
return recent_app.search_read([
('user_id', '=', request.env.user.id)
])
@http.route(['/theme_studio/add_menu_bookmarks'], type="json")
def add_menu_bookmarks(self, menu):
menu_bookmark = request.env['infinito.menu.bookmark'].sudo()
menu_bookmark.create({
'action_id': int(menu.get('actionId')),
'user_id': request.env.user.id,
'url': menu.get('menuUrl'),
})
@http.route(['/theme_studio/remove_menu_bookmarks'], type="json")
def remove_menu_bookmarks(self, menu):
menu_bookmark = request.env['infinito.menu.bookmark'].sudo().search([
('action_id', '=', int(menu.get('actionId'))),
('user_id', '=', request.env.user.id)
])
if menu_bookmark:
menu_bookmark.unlink()
@http.route(['/theme_studio/get_presets'], type="json")
def get_presets(self):
working_dir = os.path.dirname(os.path.realpath(__file__))
working_dir = working_dir.replace('/controllers', '')
file_path = working_dir + '/static/src/json/presets.json'
file = open(file_path, 'r')
presets = json.load(file)
return presets