Initial commit: OCA Technical packages (595 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:03 +02:00
commit 2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions

View file

@ -0,0 +1,4 @@
# Copyright 2020 Lorenzo Battistini @ TAKOBI
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
from . import main
from . import service_worker

View file

@ -0,0 +1,120 @@
# 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")],
)

View file

@ -0,0 +1,106 @@
# Copyright 2021 Tecnativa - Alexandre D. Díaz
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
from odoo.http import request, route
from .main import PWA
class ServiceWorker(PWA):
JS_PWA_CORE_EVENT_INSTALL = """
self.addEventListener('install', evt => {{
console.log('[ServiceWorker] Installing...');
{}
}});
"""
JS_PWA_CORE_EVENT_FETCH = """
self.addEventListener('fetch', evt => {{
{}
}});
"""
JS_PWA_CORE_EVENT_ACTIVATE = """
self.addEventListener('activate', evt => {{
{}
}});
"""
JS_PWA_MAIN = """
self.importScripts(...{pwa_scripts});
odoo.define("web_pwa_oca.ServiceWorker", function (require) {{
"use strict";
{pwa_requires}
{pwa_init}
{pwa_core_event_install}
{pwa_core_event_activate}
{pwa_core_event_fetch}
}});
"""
def _get_js_pwa_requires(self):
return """
const PWA = require('web_pwa_oca.PWA');
"""
def _get_js_pwa_init(self):
return """
let promise_start = Promise.resolve();
if (typeof self.oca_pwa === "undefined") {{
self.oca_pwa = new PWA({});
promise_start = self.oca_pwa.start();
if (self.serviceWorker.state === "activated") {{
promise_start = promise_start.then(
() => self.oca_pwa.activateWorker(true));
}}
}}
""".format(
self._get_pwa_params()
)
def _get_js_pwa_core_event_install_impl(self):
return """
evt.waitUntil(oca_pwa.installWorker());
self.skipWaiting();
"""
def _get_js_pwa_core_event_activate_impl(self):
return """
console.log('[ServiceWorker] Activating...');
evt.waitUntil(oca_pwa.activateWorker());
self.clients.claim();
"""
def _get_js_pwa_core_event_fetch_impl(self):
return ""
@route("/service-worker.js", type="http", auth="public")
def render_service_worker(self):
"""Route to register the service worker in the 'main' scope ('/')"""
sw_code = self.JS_PWA_MAIN.format(
**{
"pwa_scripts": self._get_pwa_scripts(),
"pwa_requires": self._get_js_pwa_requires(),
"pwa_init": self._get_js_pwa_init(),
"pwa_core_event_install": self.JS_PWA_CORE_EVENT_INSTALL.format(
self._get_js_pwa_core_event_install_impl()
),
"pwa_core_event_activate": self.JS_PWA_CORE_EVENT_ACTIVATE.format(
self._get_js_pwa_core_event_activate_impl()
),
"pwa_core_event_fetch": self.JS_PWA_CORE_EVENT_FETCH.format(
self._get_js_pwa_core_event_fetch_impl()
),
}
)
return request.make_response(
sw_code,
[
("Content-Type", "text/javascript;charset=utf-8"),
("Content-Length", len(sw_code)),
],
)