Files
gzth/anita_theme_setting/models/anita_setting_manager.py
T
2024-06-20 13:39:24 +08:00

315 lines
11 KiB
Python

# -*- coding: utf-8 -*-
from inspect import trace
from math import fabs
from odoo import models, api, tools, fields, _
from odoo.tools.config import config
import traceback
import datetime
from datetime import date, datetime
import logging
_logger = logging.getLogger(__name__)
class AnitaThemeSettingManager(models.AbstractModel):
'''
user theme style setting
'''
_name = 'anita_theme_setting.setting_manager'
_description = 'theme setting manager'
def _register_hook(self):
"""
stuff to do right after the registry is built
"""
# check theme mode data
try:
# check mode data
owner = self.get_current_owner()
force = False
if config.get('debug', False):
self.env['anita_theme_setting.default_mode_data'].sudo().refresh_default_mode()
force = True
self.env["anita_theme_setting.theme_mode"].check_default_mode_data(owner, force)
except Exception as e:
traceback.print_stack(e)
_logger.error(e)
@api.model
def get_user_setting(self, get_style=True):
'''
get user setting
:return:
'''
rst = dict()
# just get the setting data
theme_setting_mode = \
self.env["res.config.settings"].sudo().get_theme_setting_mode()
# check mode data
owner = self.get_current_owner()
# get the setting data
if theme_setting_mode == 'system':
theme_settings = self.env["res.config.settings"].get_theme_setting()
elif theme_setting_mode == 'company':
theme_settings = self.env["res.company"].get_theme_setting()
else:
theme_settings = self.env["res.users"].get_theme_setting()
# deal the datetime data
for key, item in theme_settings.items():
if isinstance(item, datetime):
theme_settings[key] = fields.Datetime.to_string(item)
if isinstance(item, date):
theme_settings[key] = fields.Date.to_string(item)
all_modes = self.env["anita_theme_setting.theme_mode"].search(
[('owner', '=', owner)])
cur_style_id = theme_settings["current_theme_style"]
cur_mode_id = theme_settings["current_theme_mode"]
theme_mode = self.env["anita_theme_setting.theme_mode"].search(
[('id', '=', cur_mode_id)])
theme_style = self.env["anita_theme_setting.theme_style"].search(
[('id', '=', cur_style_id)])
cur_mode_name = theme_mode.name
if not cur_mode_id \
or cur_mode_id not in all_modes.ids:
if all_modes:
cur_mode_id = all_modes[0].id
cur_style_id = all_modes[0].theme_styles[0].id if all_modes[0].theme_styles else False
cur_mode_name = all_modes[0].name
theme_mode = all_modes[0]
theme_style = all_modes[0].theme_styles[0] if all_modes[0].theme_styles else False
else:
cur_mode_id = False
cur_style_id = False
cur_mode_name = False
theme_mode = self.env["anita_theme_setting.theme_mode"]
if not cur_style_id:
theme_styles = theme_mode.theme_styles
theme_style = theme_styles[0] if theme_styles else self.env["anita_theme_setting.theme_style"]
cur_style_id = theme_style.id if theme_style else False
rst['settings'] = theme_settings
rst['cur_mode_id'] = cur_mode_id
rst['cur_style_id'] = cur_style_id
# used to set the body class
rst['cur_mode_name'] = cur_mode_name
rst['theme_setting_mode'] = theme_setting_mode
rst["window_default_title"] = self.env['ir.config_parameter'].sudo().get_param(
"anita_theme_setting.window_default_title", "Odoo")
rst["powered_by"] = self.env['ir.config_parameter'].sudo().get_param(
"anita_theme_setting.powered_by", "Odoo")
# check the user is anita
rst['is_anita'] = self.env.user._is_admin()
# add font info
font_name = theme_settings.get("font_name", False)
if font_name:
font_type_css = "*:not(.fa):not(.oi) {font-family: " + font_name + ", sans-serif !important;}"
else:
font_type_css = ""
rst['theme_modes'] = self.get_all_mode_data(owner)
# get the style
if get_style:
if theme_style:
style_datas = [font_type_css]
if theme_style:
style_datas += theme_style.get_styles_txt()
style_txt = '\n'.join(style_datas)
rst['style_txt'] = style_txt
if not theme_style.background_image:
# get from theme mode
rst['mode_style_css'] = theme_mode.get_mode_style_css()
else:
# get from style
rst['mode_style_css'] = theme_style.get_mode_style_css()
else:
rst['style_txt'] = ""
rst['mode_style_css'] = ""
return rst
@api.model
def get_font_link(self):
"""
get font link
:return:
"""
theme_settings = self.get_theme_setting()
result = ""
if theme_settings.get('font_name', False):
result = '/anita_theme_setting/static/fonts/{font_name}/fonts.css'.format(font_name=theme_settings.get('font_name'))
return result
@api.model
def get_theme_setting(self):
"""
get theme setting
:return:
"""
# just get the setting data
theme_setting_mode = \
self.env["res.config.settings"].sudo().get_theme_setting_mode()
if theme_setting_mode == 'system':
theme_settings = self.env["res.config.settings"].get_theme_setting()
elif theme_setting_mode == 'company':
theme_settings = self.env["res.company"].get_theme_setting()
else:
theme_settings = self.env["res.users"].get_theme_setting()
return theme_settings
@api.model
def get_font_name(self):
"""
get font name
"""
theme_settings = self.get_theme_setting()
return theme_settings.get('font_name')
@api.model
def update_cur_style(self, mode_id, style_id):
'''
update user cur mode
:return:
'''
ir_config = self.env['ir.config_parameter'].sudo()
setting_mode = self.env["res.config.settings"].get_theme_setting_mode()
if setting_mode == "system":
ir_config.set_param("anita_theme_setting.current_theme_mode", mode_id)
ir_config.set_param("anita_theme_setting.current_theme_style", style_id)
elif setting_mode == "company":
company = self.env.user.company_id
company.setting_id.current_theme_mode = mode_id
company.setting_id.current_theme_style = style_id
elif setting_mode == "user":
user_id = self.env.user.id
user = self.env["res.users"].browse(user_id)
user.setting_id.current_theme_mode = mode_id
user.setting_id.current_theme_style = style_id
else:
assert False
@api.model
def save_style_data(self, style_id, style_data, owner):
'''
save style datas
:param style_id:
:param style_data:
:param owner:
:return:
'''
theme_style = self.env["anita_theme_setting.theme_style"].browse(style_id)
theme_style.ensure_one()
theme_mode = theme_style.theme_mode
# save current style just when type is same
mode_id = theme_mode.id
if owner:
if owner.startswith('res.users'):
parts = owner.split(',')
user = self.env["res.users"].browse(int(parts[1].strip()))
if user:
user.ensure_setting_id()
user.setting_id.current_theme_mode = mode_id
user.setting_id.current_theme_style = style_id
elif owner.startswith('res.company'):
parts = owner.split(',')
company = self.env["res.company"].browse(int(parts[1].strip()))
if company:
company.ensure_setting_id()
company.setting_id.current_theme_mode = mode_id
company.setting_id.current_theme_style = style_id
else:
system_setting = self.env["res.config.settings"].get_setting_record()
system_setting.current_theme_mode = mode_id
system_setting.current_theme_style = style_id
# as the image is direct change from database so not need to update it
var_infos = theme_style.mapped('groups.sub_groups.style_items.vars')
var_cache = {var_info.id: var_info for var_info in var_infos}
for data in style_data:
var_id = data["id"]
tmp_var = var_cache[var_id]
tmp_var.write({
"color": data.get('color', False)
})
if theme_style.background_image:
mode_style_cs = theme_style.get_mode_style_css()
else:
mode_style_cs = theme_mode.get_mode_style_css()
# return the style data
return {
'theme_style': theme_style.get_style(),
'mode_style_css': mode_style_cs
}
def get_current_owner(self):
"""
get current owner
:return:
"""
theme_setting_mode = \
self.env["res.config.settings"].sudo().get_theme_setting_mode()
# check mode data
owner = False
if theme_setting_mode == 'system':
owner = False
elif theme_setting_mode == 'company':
owner = 'res.company, {company_id}'.format(
company_id=self.env.user.company_id.id)
elif theme_setting_mode == 'user':
owner = 'res.users, {user_id}'.format(user_id=self.env.user.id)
return owner
@tools.ormcache('owner')
@api.model
def get_all_mode_data(self, owner):
"""
get all mode data
"""
all_modes = self.env["anita_theme_setting.theme_mode"].search([('owner', '=', owner)])
result = []
for mode in all_modes:
result.append(mode.get_mode_data()[0])
return result
@api.model
def save_settings(self, settings):
"""
save the settings
"""
# get the setting mode
setting_mode = self.env["res.config.settings"].get_theme_setting_mode()
if setting_mode == "system":
self.env["res.config.settings"].save_theme_setting(settings)
elif setting_mode == "company":
self.env["res.company"].save_theme_setting(settings)
elif setting_mode == "user":
self.env["res.users"].save_theme_setting(settings)
else:
assert False
return self.get_theme_setting()