1# -*- coding: utf-8 -*-
2# Part of Odoo. See LICENSE file for full copyright and licensing details.
3import hashlib
4import json
5
6from odoo import api, models
7from odoo.http import request
8from odoo.tools import ustr
9
10from odoo.addons.web.controllers.main import module_boot, HomeStaticTemplateHelpers
11
12import odoo
13
14
15class Http(models.AbstractModel):
16    _inherit = 'ir.http'
17
18    def webclient_rendering_context(self):
19        return {
20            'menu_data': request.env['ir.ui.menu'].load_menus(request.session.debug),
21            'session_info': self.session_info(),
22        }
23
24    def session_info(self):
25        user = request.env.user
26        version_info = odoo.service.common.exp_version()
27
28        user_context = request.session.get_context() if request.session.uid else {}
29        IrConfigSudo = self.env['ir.config_parameter'].sudo()
30        max_file_upload_size = int(IrConfigSudo.get_param(
31            'web.max_file_upload_size',
32            default=128 * 1024 * 1024,  # 128MiB
33        ))
34
35        session_info = {
36            "uid": request.session.uid,
37            "is_system": user._is_system() if request.session.uid else False,
38            "is_admin": user._is_admin() if request.session.uid else False,
39            "user_context": request.session.get_context() if request.session.uid else {},
40            "db": request.session.db,
41            "server_version": version_info.get('server_version'),
42            "server_version_info": version_info.get('server_version_info'),
43            "name": user.name,
44            "username": user.login,
45            "partner_display_name": user.partner_id.display_name,
46            "company_id": user.company_id.id if request.session.uid else None,  # YTI TODO: Remove this from the user context
47            "partner_id": user.partner_id.id if request.session.uid and user.partner_id else None,
48            "web.base.url": IrConfigSudo.get_param('web.base.url', default=''),
49            "active_ids_limit": int(IrConfigSudo.get_param('web.active_ids_limit', default='20000')),
50            "max_file_upload_size": max_file_upload_size,
51        }
52        if self.env.user.has_group('base.group_user'):
53            # the following is only useful in the context of a webclient bootstrapping
54            # but is still included in some other calls (e.g. '/web/session/authenticate')
55            # to avoid access errors and unnecessary information, it is only included for users
56            # with access to the backend ('internal'-type users)
57            mods = module_boot()
58            qweb_checksum = HomeStaticTemplateHelpers.get_qweb_templates_checksum(addons=mods, debug=request.session.debug)
59            lang = user_context.get("lang")
60            translation_hash = request.env['ir.translation'].get_web_translations_hash(mods, lang)
61            menu_json_utf8 = json.dumps(request.env['ir.ui.menu'].load_menus(request.session.debug), default=ustr, sort_keys=True).encode()
62            cache_hashes = {
63                "load_menus": hashlib.sha512(menu_json_utf8).hexdigest()[:64], # sha512/256
64                "qweb": qweb_checksum,
65                "translations": translation_hash,
66            }
67            session_info.update({
68                # current_company should be default_company
69                "user_companies": {'current_company': (user.company_id.id, user.company_id.name), 'allowed_companies': [(comp.id, comp.name) for comp in user.company_ids]},
70                "currencies": self.get_currencies(),
71                "show_effect": True,
72                "display_switch_company_menu": user.has_group('base.group_multi_company') and len(user.company_ids) > 1,
73                "cache_hashes": cache_hashes,
74            })
75        return session_info
76
77    @api.model
78    def get_frontend_session_info(self):
79        session_info = {
80            'is_admin': request.session.uid and self.env.user._is_admin() or False,
81            'is_system': request.session.uid and self.env.user._is_system() or False,
82            'is_website_user': request.session.uid and self.env.user._is_public() or False,
83            'user_id': request.session.uid and self.env.user.id or False,
84            'is_frontend': True,
85        }
86        if request.session.uid:
87            version_info = odoo.service.common.exp_version()
88            session_info.update({
89                'server_version': version_info.get('server_version'),
90                'server_version_info': version_info.get('server_version_info')
91            })
92        return session_info
93
94    def get_currencies(self):
95        Currency = request.env['res.currency']
96        currencies = Currency.search([]).read(['symbol', 'position', 'decimal_places'])
97        return {c['id']: {'symbol': c['symbol'], 'position': c['position'], 'digits': [69,c['decimal_places']]} for c in currencies}
98