# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. import logging from odoo import api, fields, models from odoo.modules.module import get_resource_from_path _logger = logging.getLogger(__name__) class ThemeView(models.Model): _name = 'theme.ir.ui.view' _description = 'Theme UI View' def compute_arch_fs(self): path_info = get_resource_from_path(self._context['install_filename']) if path_info: return '/'.join(path_info[0:2]) name = fields.Char(required=True) key = fields.Char() type = fields.Char() priority = fields.Integer(default=16, required=True) mode = fields.Selection([('primary', "Base view"), ('extension', "Extension View")]) active = fields.Boolean(default=True) arch = fields.Text() arch_fs = fields.Char(default=compute_arch_fs) inherit_id = fields.Reference(selection=[('ir.ui.view', 'ir.ui.view'), ('theme.ir.ui.view', 'theme.ir.ui.view')]) copy_ids = fields.One2many('ir.ui.view', 'theme_template_id', 'Views using a copy of me', copy=False, readonly=True) class ThemeAttachment(models.Model): _name = 'theme.ir.attachment' _description = 'Theme Attachments' name = fields.Char(required=True) key = fields.Char(required=True) url = fields.Char() copy_ids = fields.One2many('ir.attachment', 'theme_template_id', 'Attachment using a copy of me', copy=False, readonly=True) class ThemeMenu(models.Model): _name = 'theme.website.menu' _description = 'Website Theme Menu' name = fields.Char(required=True) url = fields.Char(default='') page_id = fields.Many2one('theme.website.page', ondelete='cascade') new_window = fields.Boolean('New Window') sequence = fields.Integer() parent_id = fields.Many2one('theme.website.menu', index=True, ondelete="cascade") copy_ids = fields.One2many('website.menu', 'theme_template_id', 'Menu using a copy of me', copy=False, readonly=True) class ThemePage(models.Model): _name = 'theme.website.page' _description = 'Website Theme Page' url = fields.Char() view_id = fields.Many2one('theme.ir.ui.view', required=True, ondelete="cascade") website_indexed = fields.Boolean('Page Indexed', default=True) copy_ids = fields.One2many('website.page', 'theme_template_id', 'Theme using a copy of me', copy=False, readonly=True) class Theme(models.AbstractModel): _name = 'theme.utils' _description = 'Theme Utils' _auto = False def _post_copy(self, mod): website = self.env['website'].get_current_website() theme_post_copy = '_%s_post_copy' % mod.name if hasattr(self, theme_post_copy): _logger.info('Executing method %s' % theme_post_copy) method = getattr(self.with_context(website_id=website.id), theme_post_copy) return method(mod) @api.model def _toggle_view(self, xml_id, active): obj = self.env.ref(xml_id) if obj._name == 'theme.ir.ui.view': website = self.env['website'].get_current_website() obj = obj.with_context(active_test=False) obj = obj.copy_ids.filtered(lambda x: x.website_id == website) obj.write({'active': active}) @api.model def enable_view(self, xml_id): self._toggle_view(xml_id, True) @api.model def disable_view(self, xml_id): self._toggle_view(xml_id, False) class IrUiView(models.Model): _inherit = 'ir.ui.view' theme_template_id = fields.Many2one('theme.ir.ui.view') class IrAttachment(models.Model): _inherit = 'ir.attachment' key = fields.Char() theme_template_id = fields.Many2one('theme.ir.attachment') class WebiteMenu(models.Model): _inherit = 'website.menu' theme_template_id = fields.Many2one('theme.website.menu') class WebsitePage(models.Model): _inherit = 'website.page' theme_template_id = fields.Many2one('theme.website.page')