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