odex30_standard/odex30_base/expert_theme/controllers/expert_controller.py

144 lines
5.8 KiB
Python

# -*- coding: utf-8 -*-
from odoo import http, fields
from odoo.http import request
import json
import logging
_logger = logging.getLogger(__name__)
class ExpertController(http.Controller):
@http.route('/expert_theme/test', type='http', auth='user')
def test_controller(self):
"""Simple test endpoint to verify controller is working"""
return request.make_json_response({
'success': True,
'message': 'Controller is working!',
'timestamp': fields.Datetime.now()
})
@http.route('/expert_theme/get_css_variables', type='http', auth='user')
def get_css_variables(self):
"""Get CSS variables for the active theme configuration"""
try:
config = request.env['expert.theme.config'].get_active_config()
css_variables = config.get_css_variables()
return request.make_json_response({
'success': True,
'css_variables': css_variables
})
except Exception as e:
return request.make_json_response({
'success': False,
'error': str(e)
})
@http.route('/expert_theme/apply_theme', type='http', auth='user', methods=['POST'])
def apply_theme(self):
"""Apply theme changes immediately"""
try:
# Get the active configuration
config = request.env['expert.theme.config'].get_active_config()
# Apply the theme (this could trigger cache invalidation, etc.)
config.apply_theme()
return request.make_json_response({
'success': True,
'message': 'Theme applied successfully!'
})
except Exception as e:
return request.make_json_response({
'success': False,
'error': str(e)
})
@http.route('/expert_theme/get_login_template_styles', type='http', auth='public', methods=['GET'])
def get_login_template_styles(self):
"""Get CSS styles for the active login template (public access for login page)"""
try:
template = request.env['expert.login.template'].sudo().get_active_template()
styles = template.get_template_styles()
return request.make_json_response({
'success': True,
'styles': styles
})
except Exception as e:
# Return default styles if error
return request.make_json_response({
'success': False,
'error': str(e),
'styles': {'background_color': '#FFFFFF'}
})
@http.route('/expert_theme/get_installed_modules_http', type='http', auth='user')
def get_installed_modules_http(self):
"""Return list of installed modules for the home page via HTTP"""
try:
# Get all installed modules
installed_modules = request.env['ir.module.module'].search([
('state', '=', 'installed'),
('name', '!=', 'expert_theme') # Exclude our own module
])
# Get all top-level menu items that belong to installed modules
menu_items = request.env['ir.ui.menu'].search([
('parent_id', '=', False), # Top level menus only
('active', '=', True),
('name', 'not in', ['Expert Home', 'Dashboard']) # Exclude our own menus
])
result = []
installed_module_names = installed_modules.mapped('name')
debug_info = {
'total_installed_modules': len(installed_modules),
'total_menu_items': len(menu_items)
}
for menu in menu_items:
# Check if this menu belongs to an installed module
module_name = None
if menu.web_icon and ',' in menu.web_icon:
module_name = menu.web_icon.split(',')[0]
# Include menu if it belongs to an installed module OR if it has no web_icon (base modules)
if (module_name and module_name in installed_module_names) or not menu.web_icon:
# Create URL based on action type - use proper Odoo navigation
if menu.action and menu.action.type == 'ir.actions.act_window':
# For act_window, use the action ID
url = f'/web#action={menu.action.id}'
elif menu.action and menu.action.type == 'ir.actions.client':
# For client actions, use the action ID
url = f'/web#action={menu.action.id}'
elif menu.action and menu.action.type == 'ir.actions.server':
# For server actions, use the action ID
url = f'/web#action={menu.action.id}'
else:
# For menus without actions, use menu_id
url = f'/web#menu_id={menu.id}'
result.append({
'id': menu.id,
'name': menu.name,
'web_icon': menu.web_icon or 'base,static/description/icon.png',
'action': menu.action.id if menu.action else False,
'url': url,
'module_name': module_name
})
return request.make_json_response({
'success': True,
'modules': result,
'debug_info': debug_info
})
except Exception as e:
return request.make_json_response({
'success': False,
'error': str(e)
})