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
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							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
							 | 
						|
								
							 |