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