mirror of https://github.com/OCA/web.git
121 lines
4.3 KiB
Python
121 lines
4.3 KiB
Python
# Copyright 2020 Lorenzo Battistini @ TAKOBI
|
|
# Copyright 2020 Tecnativa - Alexandre D. Díaz
|
|
# Copyright 2020 Tecnativa - João Marques
|
|
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
|
|
import json
|
|
|
|
from odoo.http import Controller, request, route
|
|
|
|
|
|
class PWA(Controller):
|
|
def _get_pwa_scripts(self):
|
|
"""Scripts to be imported in the service worker (Order is important)"""
|
|
return [
|
|
"/web/static/lib/underscore/underscore.js",
|
|
"/web_pwa_oca/static/src/js/worker/jquery-sw-compat.js",
|
|
"/web/static/src/legacy/js/promise_extension.js",
|
|
"/web/static/src/boot.js",
|
|
"/web/static/src/legacy/js/core/class.js",
|
|
"/web_pwa_oca/static/src/js/worker/pwa.js",
|
|
]
|
|
|
|
@route("/service-worker.js", type="http", auth="public")
|
|
def render_service_worker(self):
|
|
"""Route to register the service worker in the 'main' scope ('/')"""
|
|
return request.render(
|
|
"web_pwa_oca.service_worker",
|
|
{
|
|
"pwa_scripts": self._get_pwa_scripts(),
|
|
"pwa_params": self._get_pwa_params(),
|
|
},
|
|
headers=[("Content-Type", "text/javascript;charset=utf-8")],
|
|
)
|
|
|
|
def _get_pwa_params(self):
|
|
"""Get javascript PWA class initialzation params"""
|
|
return {}
|
|
|
|
def _get_pwa_manifest_icons(self, pwa_icon):
|
|
icons = []
|
|
if not pwa_icon:
|
|
for size in [
|
|
(128, 128),
|
|
(144, 144),
|
|
(152, 152),
|
|
(192, 192),
|
|
(256, 256),
|
|
(512, 512),
|
|
]:
|
|
icons.append(
|
|
{
|
|
"src": "/web_pwa_oca/static/img/icons/icon-%sx%s.png"
|
|
% (str(size[0]), str(size[1])),
|
|
"sizes": "{}x{}".format(str(size[0]), str(size[1])),
|
|
"type": "image/png",
|
|
"purpose": "any maskable",
|
|
}
|
|
)
|
|
elif not pwa_icon.mimetype.startswith("image/svg"):
|
|
all_icons = (
|
|
request.env["ir.attachment"]
|
|
.sudo()
|
|
.search(
|
|
[
|
|
("url", "like", "/web_pwa_oca/icon"),
|
|
(
|
|
"url",
|
|
"not like",
|
|
"/web_pwa_oca/icon.",
|
|
), # Get only resized icons
|
|
]
|
|
)
|
|
)
|
|
for icon in all_icons:
|
|
icon_size_name = icon.url.split("/")[-1].lstrip("icon").split(".")[0]
|
|
icons.append(
|
|
{"src": icon.url, "sizes": icon_size_name, "type": icon.mimetype}
|
|
)
|
|
else:
|
|
icons = [
|
|
{
|
|
"src": pwa_icon.url,
|
|
"sizes": "128x128 144x144 152x152 192x192 256x256 512x512",
|
|
"type": pwa_icon.mimetype,
|
|
}
|
|
]
|
|
return icons
|
|
|
|
def _get_pwa_manifest(self):
|
|
"""Webapp manifest"""
|
|
config_param_sudo = request.env["ir.config_parameter"].sudo()
|
|
pwa_name = config_param_sudo.get_param("pwa.manifest.name", "Odoo PWA")
|
|
pwa_short_name = config_param_sudo.get_param(
|
|
"pwa.manifest.short_name", "Odoo PWA"
|
|
)
|
|
pwa_icon = (
|
|
request.env["ir.attachment"]
|
|
.sudo()
|
|
.search([("url", "like", "/web_pwa_oca/icon.")])
|
|
)
|
|
background_color = config_param_sudo.get_param(
|
|
"pwa.manifest.background_color", "#2E69B5"
|
|
)
|
|
theme_color = config_param_sudo.get_param("pwa.manifest.theme_color", "#2E69B5")
|
|
return {
|
|
"name": pwa_name,
|
|
"short_name": pwa_short_name,
|
|
"icons": self._get_pwa_manifest_icons(pwa_icon),
|
|
"start_url": "/web",
|
|
"display": "standalone",
|
|
"background_color": background_color,
|
|
"theme_color": theme_color,
|
|
}
|
|
|
|
@route("/web_pwa_oca/manifest.webmanifest", type="http", auth="public")
|
|
def pwa_manifest(self):
|
|
"""Returns the manifest used to install the page as app"""
|
|
return request.make_response(
|
|
json.dumps(self._get_pwa_manifest()),
|
|
headers=[("Content-Type", "application/json;charset=utf-8")],
|
|
)
|