1# -*- coding: utf-8 -*- 2# Part of Odoo. See LICENSE file for full copyright and licensing details. 3 4from ast import literal_eval 5 6from odoo import api, fields, models 7from odoo.exceptions import UserError 8from odoo.tools.translate import _ 9 10 11class ResConfigSettings(models.TransientModel): 12 _inherit = 'res.config.settings' 13 14 def _default_website(self): 15 return self.env['website'].search([('company_id', '=', self.env.company.id)], limit=1) 16 17 website_id = fields.Many2one('website', string="website", 18 default=_default_website, ondelete='cascade') 19 website_name = fields.Char('Website Name', related='website_id.name', readonly=False) 20 website_domain = fields.Char('Website Domain', related='website_id.domain', readonly=False) 21 website_country_group_ids = fields.Many2many(related='website_id.country_group_ids', readonly=False) 22 website_company_id = fields.Many2one(related='website_id.company_id', string='Website Company', readonly=False) 23 website_logo = fields.Binary(related='website_id.logo', readonly=False) 24 language_ids = fields.Many2many(related='website_id.language_ids', relation='res.lang', readonly=False) 25 website_language_count = fields.Integer(string='Number of languages', compute='_compute_website_language_count', readonly=True) 26 website_default_lang_id = fields.Many2one(string='Default language', related='website_id.default_lang_id', readonly=False) 27 website_default_lang_code = fields.Char('Default language code', related='website_id.default_lang_id.code', readonly=False) 28 specific_user_account = fields.Boolean(related='website_id.specific_user_account', readonly=False, 29 help='Are newly created user accounts website specific') 30 website_cookies_bar = fields.Boolean(related='website_id.cookies_bar', readonly=False) 31 32 google_analytics_key = fields.Char('Google Analytics Key', related='website_id.google_analytics_key', readonly=False) 33 google_management_client_id = fields.Char('Google Client ID', related='website_id.google_management_client_id', readonly=False) 34 google_management_client_secret = fields.Char('Google Client Secret', related='website_id.google_management_client_secret', readonly=False) 35 google_search_console = fields.Char('Google Search Console', related='website_id.google_search_console', readonly=False) 36 37 cdn_activated = fields.Boolean(related='website_id.cdn_activated', readonly=False) 38 cdn_url = fields.Char(related='website_id.cdn_url', readonly=False) 39 cdn_filters = fields.Text(related='website_id.cdn_filters', readonly=False) 40 auth_signup_uninvited = fields.Selection(compute="_compute_auth_signup", inverse="_set_auth_signup") 41 42 social_twitter = fields.Char(related='website_id.social_twitter', readonly=False) 43 social_facebook = fields.Char(related='website_id.social_facebook', readonly=False) 44 social_github = fields.Char(related='website_id.social_github', readonly=False) 45 social_linkedin = fields.Char(related='website_id.social_linkedin', readonly=False) 46 social_youtube = fields.Char(related='website_id.social_youtube', readonly=False) 47 social_instagram = fields.Char(related='website_id.social_instagram', readonly=False) 48 49 @api.depends('website_id', 'social_twitter', 'social_facebook', 'social_github', 'social_linkedin', 'social_youtube', 'social_instagram') 50 def has_social_network(self): 51 self.has_social_network = self.social_twitter or self.social_facebook or self.social_github \ 52 or self.social_linkedin or self.social_youtube or self.social_instagram 53 54 def inverse_has_social_network(self): 55 if not self.has_social_network: 56 self.social_twitter = '' 57 self.social_facebook = '' 58 self.social_github = '' 59 self.social_linkedin = '' 60 self.social_youtube = '' 61 self.social_instagram = '' 62 63 has_social_network = fields.Boolean("Configure Social Network", compute=has_social_network, inverse=inverse_has_social_network) 64 65 favicon = fields.Binary('Favicon', related='website_id.favicon', readonly=False) 66 social_default_image = fields.Binary('Default Social Share Image', related='website_id.social_default_image', readonly=False) 67 68 google_maps_api_key = fields.Char(related='website_id.google_maps_api_key', readonly=False) 69 group_multi_website = fields.Boolean("Multi-website", implied_group="website.group_multi_website") 70 71 @api.depends('website_id.auth_signup_uninvited') 72 def _compute_auth_signup(self): 73 for config in self: 74 config.auth_signup_uninvited = config.website_id.auth_signup_uninvited 75 76 def _set_auth_signup(self): 77 for config in self: 78 config.website_id.auth_signup_uninvited = config.auth_signup_uninvited 79 80 @api.depends('website_id') 81 def has_google_analytics(self): 82 self.has_google_analytics = bool(self.google_analytics_key) 83 84 @api.depends('website_id') 85 def has_google_analytics_dashboard(self): 86 self.has_google_analytics_dashboard = bool(self.google_management_client_id) 87 88 @api.depends('website_id') 89 def has_google_maps(self): 90 self.has_google_maps = bool(self.google_maps_api_key) 91 92 @api.depends('website_id') 93 def has_default_share_image(self): 94 self.has_default_share_image = bool(self.social_default_image) 95 96 @api.depends('website_id') 97 def has_google_search_console(self): 98 self.has_google_search_console = bool(self.google_search_console) 99 100 def inverse_has_google_analytics(self): 101 if not self.has_google_analytics: 102 self.has_google_analytics_dashboard = False 103 self.google_analytics_key = False 104 105 def inverse_has_google_maps(self): 106 if not self.has_google_maps: 107 self.google_maps_api_key = False 108 109 def inverse_has_google_analytics_dashboard(self): 110 if not self.has_google_analytics_dashboard: 111 self.google_management_client_id = False 112 self.google_management_client_secret = False 113 114 def inverse_has_google_search_console(self): 115 if not self.has_google_search_console: 116 self.google_search_console = False 117 118 def inverse_has_default_share_image(self): 119 if not self.has_default_share_image: 120 self.social_default_image = False 121 122 has_google_analytics = fields.Boolean("Google Analytics", compute=has_google_analytics, inverse=inverse_has_google_analytics) 123 has_google_analytics_dashboard = fields.Boolean("Google Analytics Dashboard", compute=has_google_analytics_dashboard, inverse=inverse_has_google_analytics_dashboard) 124 has_google_maps = fields.Boolean("Google Maps", compute=has_google_maps, inverse=inverse_has_google_maps) 125 has_google_search_console = fields.Boolean("Console Google Search", compute=has_google_search_console, inverse=inverse_has_google_search_console) 126 has_default_share_image = fields.Boolean("Use a image by default for sharing", compute=has_default_share_image, inverse=inverse_has_default_share_image) 127 128 @api.onchange('language_ids') 129 def _onchange_language_ids(self): 130 # If current default language is removed from language_ids 131 # update the website_default_lang_id 132 language_ids = self.language_ids._origin 133 if not language_ids: 134 self.website_default_lang_id = False 135 elif self.website_default_lang_id not in language_ids: 136 self.website_default_lang_id = language_ids[0] 137 138 @api.depends('language_ids') 139 def _compute_website_language_count(self): 140 for config in self: 141 config.website_language_count = len(config.language_ids) 142 143 def set_values(self): 144 super(ResConfigSettings, self).set_values() 145 146 def open_template_user(self): 147 action = self.env["ir.actions.actions"]._for_xml_id("base.action_res_users") 148 action['res_id'] = literal_eval(self.env['ir.config_parameter'].sudo().get_param('base.template_portal_user_id', 'False')) 149 action['views'] = [[self.env.ref('base.view_users_form').id, 'form']] 150 return action 151 152 def website_go_to(self): 153 self.website_id._force() 154 return { 155 'type': 'ir.actions.act_url', 156 'url': '/', 157 'target': 'self', 158 } 159 160 def action_website_create_new(self): 161 return { 162 'view_mode': 'form', 163 'view_id': self.env.ref('website.view_website_form_view_themes_modal').id, 164 'res_model': 'website', 165 'type': 'ir.actions.act_window', 166 'target': 'new', 167 'res_id': False, 168 } 169 170 def action_open_robots(self): 171 self.website_id._force() 172 return { 173 'name': _("Robots.txt"), 174 'view_mode': 'form', 175 'res_model': 'website.robots', 176 'type': 'ir.actions.act_window', 177 "views": [[False, "form"]], 178 'target': 'new', 179 } 180 181 def action_ping_sitemap(self): 182 if not self.website_id._get_http_domain(): 183 raise UserError(_("You haven't defined your domain")) 184 185 return { 186 'type': 'ir.actions.act_url', 187 'url': 'http://www.google.com/ping?sitemap=%s/sitemap.xml' % self.website_id._get_http_domain(), 188 'target': 'new', 189 } 190 191 def install_theme_on_current_website(self): 192 self.website_id._force() 193 action = self.env["ir.actions.actions"]._for_xml_id("website.theme_install_kanban_action") 194 action['target'] = 'main' 195 return action 196