from odoo.http import request, Controller, route class PWA(Controller): def get_asset_urls(self, asset_xml_id): qweb = request.env['ir.qweb'].sudo() assets = qweb._get_asset_nodes(asset_xml_id, {}, True, True) urls = [] for asset in assets: if asset[0] == 'link': urls.append(asset[1]['href']) if asset[0] == 'script': urls.append(asset[1]['src']) return urls @route('/service-worker.js', type='http', auth="public") def service_worker(self): qweb = request.env['ir.qweb'].sudo() urls = [] urls.extend(self.get_asset_urls("web.assets_common")) urls.extend(self.get_asset_urls("web.assets_backend")) version_list = [] for url in urls: version_list.append(url.split('/')[3]) cache_version = '-'.join(version_list) mimetype = 'text/javascript;charset=utf-8' content = qweb.render('web_pwa_oca.service_worker', { 'pwa_cache_name': cache_version, 'pwa_files_to_cache': urls, }) return request.make_response(content, [('Content-Type', mimetype)]) @route('/web_pwa_oca/manifest.json', type='http', auth="public") def manifest(self): qweb = request.env['ir.qweb'].sudo() config_param = request.env['ir.config_parameter'].sudo() pwa_name = config_param.get_param("pwa.manifest.name", "Odoo PWA") pwa_short_name = config_param.get_param("pwa.manifest.short_name", "Odoo PWA") icon128x128 = config_param.get_param( "pwa.manifest.icon128x128", "/web_pwa_oca/static/img/icons/icon-128x128.png") icon144x144 = config_param.get_param( "pwa.manifest.icon144x144", "/web_pwa_oca/static/img/icons/icon-144x144.png") icon152x152 = config_param.get_param( "pwa.manifest.icon152x152", "/web_pwa_oca/static/img/icons/icon-152x152.png") icon192x192 = config_param.get_param( "pwa.manifest.icon192x192", "/web_pwa_oca/static/img/icons/icon-192x192.png") icon256x256 = config_param.get_param( "pwa.manifest.icon256x256", "/web_pwa_oca/static/img/icons/icon-256x256.png") icon512x512 = config_param.get_param( "pwa.manifest.icon512x512", "/web_pwa_oca/static/img/icons/icon-512x512.png") background_color = config_param.get_param( "pwa.manifest.background_color", "#2E69B5") theme_color = config_param.get_param( "pwa.manifest.theme_color", "#2E69B5") mimetype = 'application/json;charset=utf-8' content = qweb.render('web_pwa_oca.manifest', { 'pwa_name': pwa_name, 'pwa_short_name': pwa_short_name, 'icon128x128': icon128x128, 'icon144x144': icon144x144, 'icon152x152': icon152x152, 'icon192x192': icon192x192, 'icon256x256': icon256x256, 'icon512x512': icon512x512, 'background_color': background_color, 'theme_color': theme_color, }) return request.make_response(content, [('Content-Type', mimetype)])