# -*- coding: utf-8 -*- from odoo import models, fields, api, exceptions import datetime from datetime import date, datetime class AnitaThemeUsers(models.Model): ''' user theme style setting ''' _inherit = "res.users" _description = 'user setting' setting_id = fields.Many2one( comodel_name="anita_theme_setting.setting_base", ondelete="cascade", string="settings") @api.model def save_theme_setting(self, settings): ''' save settings, create if there is no user info just use full when the mode is user wide mode :param settings: :return: ''' self.ensure_setting_id() self.setting_id.write(settings) def ensure_setting_id(self): ''' check setting id :return: ''' self.ensure_one() if self.setting_id: return # copy use the global default data values = self.env['res.config.settings'].get_theme_values() # get fields of anita_theme_setting.setting_base field_names = [name for name, field in self.setting_id._fields.items() if name not in [ 'id', 'create_uid', 'create_date', 'write_uid', 'write_date']] # remove name not in fields values = {k: v for k, v in values.items() if k in field_names} del values["current_theme_mode"] del values["current_theme_style"] if not self.setting_id: tmp_record = self.env["anita_theme_setting.setting_base"].create(values) self.setting_id = tmp_record.id def get_theme_setting(self): ''' get settings :return: ''' record = self.env.user record.ensure_setting_id() field_names = [name for name, field in record.setting_id._fields.items() if name not in [ "icon128x128", "icon144x144", "icon152x152", "icon192x192", "icon256x256", "icon512x512"]] result = record.setting_id.read(fields=field_names)[0] result["current_theme_mode"] = record.setting_id.current_theme_mode.id result["current_theme_style"] = record.setting_id.current_theme_style.id for key, item in result.items(): if isinstance(item, datetime): result[key] = fields.Datetime.to_string(item) if isinstance(item, date): result[key] = fields.Date.to_string(item) return result def check_default_data(self): """ check default data :return: """ # check mode data owner = 'res.users, {user_id}'.format(user_id=self.id) self.env["anita_theme_setting.theme_mode"].check_default_mode_data(owner) @api.model def get_user_xml_groups(self): ''' :return: ''' group_ids = self.env.user.groups_id.ids records = self.env['ir.model.data']\ .sudo() \ .search_read([('model', '=', 'res.groups'), ('res_id', 'in', group_ids)], fields=["complete_name"]) return {record["complete_name"]: True for record in records} def get_mode_domain(self): """ get mode domain dynamic :return: """ owner = 'res.users, {user_id}'.format(user_id=self.id) return [('owner', '=', owner)] @api.model def get_group_infos(self): ''' :return: ''' group_ids = self.env.user.groups_id.ids records = self.env['ir.model.data']\ .sudo() \ .search_read( [('model', '=', 'res.groups'), ('res_id', 'in', group_ids)], fields=["complete_name"]) groups = {record["complete_name"]: True for record in records} return { "groups": groups, "group_ids": group_ids, "user_id": self.env.user.id }