forked from Techsystech/web
[IMP] web_pwa_oca: black, isort, prettier
pre-commit fixes pre-commit fixes 215.0-ocabot-merge-pr-2789-by-pedrobaeza-bump-patch
parent
4ec8d1ab8b
commit
402ca37b14
|
@ -13,15 +13,8 @@
|
|||
"license": "LGPL-3",
|
||||
"application": True,
|
||||
"installable": True,
|
||||
"depends": [
|
||||
'web',
|
||||
'mail',
|
||||
],
|
||||
"data": [
|
||||
"views/webclient_templates.xml",
|
||||
],
|
||||
'qweb': [
|
||||
'static/src/xml/pwa_install.xml',
|
||||
],
|
||||
'images': ['static/description/pwa.png'],
|
||||
"depends": ["web", "mail"],
|
||||
"data": ["views/webclient_templates.xml"],
|
||||
"qweb": ["static/src/xml/pwa_install.xml"],
|
||||
"images": ["static/description/pwa.png"],
|
||||
}
|
||||
|
|
|
@ -1,75 +1,77 @@
|
|||
from odoo.http import request, Controller, route
|
||||
from odoo.http import Controller, request, route
|
||||
|
||||
|
||||
class PWA(Controller):
|
||||
|
||||
def get_asset_urls(self, asset_xml_id):
|
||||
qweb = request.env['ir.qweb'].sudo()
|
||||
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'])
|
||||
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")
|
||||
@route("/service-worker.js", type="http", auth="public")
|
||||
def service_worker(self):
|
||||
qweb = request.env['ir.qweb'].sudo()
|
||||
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)])
|
||||
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")
|
||||
@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()
|
||||
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")
|
||||
"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")
|
||||
"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")
|
||||
"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")
|
||||
"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")
|
||||
"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")
|
||||
"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)])
|
||||
"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)])
|
||||
|
|
|
@ -1,45 +1,43 @@
|
|||
odoo.define('web_pwa_oca.systray.install', function (require) {
|
||||
"use strict";
|
||||
odoo.define("web_pwa_oca.systray.install", function(require) {
|
||||
"use strict";
|
||||
|
||||
var core = require('web.core');
|
||||
var session = require('web.session');
|
||||
var UserMenu = require('web.UserMenu');
|
||||
var UserMenu = require("web.UserMenu");
|
||||
|
||||
if ('serviceWorker' in navigator) {
|
||||
window.addEventListener('load', function () {
|
||||
navigator.serviceWorker.register('/service-worker.js')
|
||||
.then(function (reg) {
|
||||
console.log('Service worker registered.', reg);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
var deferredInstallPrompt = null;
|
||||
|
||||
UserMenu.include({
|
||||
start: function () {
|
||||
window.addEventListener('beforeinstallprompt', this.saveBeforeInstallPromptEvent);
|
||||
return this._super.apply(this, arguments);
|
||||
},
|
||||
saveBeforeInstallPromptEvent: function(evt) {
|
||||
deferredInstallPrompt = evt;
|
||||
this.$.find('#pwa_install_button')[0].removeAttribute('hidden');
|
||||
},
|
||||
_onMenuInstallpwa: function () {
|
||||
deferredInstallPrompt.prompt();
|
||||
// Hide the install button, it can't be called twice.
|
||||
this.el.setAttribute('hidden', true);
|
||||
// Log user response to prompt.
|
||||
deferredInstallPrompt.userChoice
|
||||
.then(function (choice) {
|
||||
if (choice.outcome === 'accepted') {
|
||||
console.log('User accepted the A2HS prompt', choice);
|
||||
} else {
|
||||
console.log('User dismissed the A2HS prompt', choice);
|
||||
}
|
||||
deferredInstallPrompt = null;
|
||||
if ("serviceWorker" in navigator) {
|
||||
window.addEventListener("load", function() {
|
||||
navigator.serviceWorker.register("/service-worker.js").then(function(reg) {
|
||||
console.log("Service worker registered.", reg);
|
||||
});
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
var deferredInstallPrompt = null;
|
||||
|
||||
UserMenu.include({
|
||||
start: function() {
|
||||
window.addEventListener(
|
||||
"beforeinstallprompt",
|
||||
this.saveBeforeInstallPromptEvent
|
||||
);
|
||||
return this._super.apply(this, arguments);
|
||||
},
|
||||
saveBeforeInstallPromptEvent: function(evt) {
|
||||
deferredInstallPrompt = evt;
|
||||
this.$.find("#pwa_install_button")[0].removeAttribute("hidden");
|
||||
},
|
||||
_onMenuInstallpwa: function() {
|
||||
deferredInstallPrompt.prompt();
|
||||
// Hide the install button, it can't be called twice.
|
||||
this.el.setAttribute("hidden", true);
|
||||
// Log user response to prompt.
|
||||
deferredInstallPrompt.userChoice.then(function(choice) {
|
||||
if (choice.outcome === "accepted") {
|
||||
console.log("User accepted the A2HS prompt", choice);
|
||||
} else {
|
||||
console.log("User dismissed the A2HS prompt", choice);
|
||||
}
|
||||
deferredInstallPrompt = null;
|
||||
});
|
||||
},
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,14 +1,18 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<templates>
|
||||
|
||||
<t t-name="web_pwa_oca.systray.install">
|
||||
<a href="#" role="menuitem" id="pwa_install_button" data-menu="installpwa" class="dropdown-item" hidden="1">Install PWA</a>
|
||||
<a
|
||||
href="#"
|
||||
role="menuitem"
|
||||
id="pwa_install_button"
|
||||
data-menu="installpwa"
|
||||
class="dropdown-item"
|
||||
hidden="1"
|
||||
>Install PWA</a>
|
||||
</t>
|
||||
|
||||
<t t-extend="UserMenu.Actions">
|
||||
<t t-jquery="a[data-menu='settings']" t-operation="after">
|
||||
<t t-call="web_pwa_oca.systray.install"/>
|
||||
<t t-call="web_pwa_oca.systray.install" />
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
|
|
@ -1,29 +1,35 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<template id="web_layout_pwa" name="Web layout PWA" inherit_id="web.layout">
|
||||
<xpath expr="//meta[@name='viewport']" position="after">
|
||||
<!-- Add link rel manifest -->
|
||||
<link rel="manifest" href="/web_pwa_oca/manifest.json"/>
|
||||
<link rel="manifest" href="/web_pwa_oca/manifest.json" />
|
||||
<!-- Add iOS meta tags and icons -->
|
||||
<meta name="apple-mobile-web-app-capable" content="yes"/>
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
|
||||
<meta name="apple-mobile-web-app-title" content="Odoo PWA"/>
|
||||
<link rel="apple-touch-icon" href="/web_pwa_oca/static/img/icons/icon-152x152.png"/>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
|
||||
<meta name="apple-mobile-web-app-title" content="Odoo PWA" />
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
href="/web_pwa_oca/static/img/icons/icon-152x152.png"
|
||||
/>
|
||||
<!-- Add meta theme-color -->
|
||||
<meta name="theme-color" content="#2E69B5" />
|
||||
</xpath>
|
||||
</template>
|
||||
<template id="assets_backend" name="PWA assets" inherit_id="web.assets_backend">
|
||||
<xpath expr="." position="inside">
|
||||
<script type="text/javascript" src="/web_pwa_oca/static/src/js/pwa_install.js"/>
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="/web_pwa_oca/static/src/js/pwa_install.js"
|
||||
/>
|
||||
</xpath>
|
||||
</template>
|
||||
<template id="service_worker" name="PWA service worker">
|
||||
'use strict';
|
||||
const CACHE_NAME = '<t t-esc="pwa_cache_name"/>';
|
||||
const CACHE_NAME = '<t t-esc="pwa_cache_name" />';
|
||||
const FILES_TO_CACHE = [
|
||||
<t t-foreach="pwa_files_to_cache" t-as="file_to_cache">
|
||||
'<t t-esc="file_to_cache"/>',
|
||||
'<t t-esc="file_to_cache" />',
|
||||
</t>
|
||||
];
|
||||
self.addEventListener('install', function (evt) {
|
||||
|
@ -65,41 +71,39 @@ self.addEventListener('fetch', function(evt) {
|
|||
);
|
||||
});
|
||||
</template>
|
||||
|
||||
<template id="manifest" name="PWA manifest">
|
||||
{
|
||||
"name": "<t t-esc="pwa_name"/>",
|
||||
"short_name": "<t t-esc="pwa_short_name"/>",
|
||||
"name": "<t t-esc="pwa_name" />",
|
||||
"short_name": "<t t-esc="pwa_short_name" />",
|
||||
"icons": [{
|
||||
"src": "<t t-esc="icon128x128"/>",
|
||||
"src": "<t t-esc="icon128x128" />",
|
||||
"sizes": "128x128",
|
||||
"type": "image/png"
|
||||
}, {
|
||||
"src": "<t t-esc="icon144x144"/>",
|
||||
"src": "<t t-esc="icon144x144" />",
|
||||
"sizes": "144x144",
|
||||
"type": "image/png"
|
||||
}, {
|
||||
"src": "<t t-esc="icon152x152"/>",
|
||||
"src": "<t t-esc="icon152x152" />",
|
||||
"sizes": "152x152",
|
||||
"type": "image/png"
|
||||
}, {
|
||||
"src": "<t t-esc="icon192x192"/>",
|
||||
"src": "<t t-esc="icon192x192" />",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
}, {
|
||||
"src": "<t t-esc="icon256x256"/>",
|
||||
"src": "<t t-esc="icon256x256" />",
|
||||
"sizes": "256x256",
|
||||
"type": "image/png"
|
||||
}, {
|
||||
"src": "<t t-esc="icon512x512"/>",
|
||||
"src": "<t t-esc="icon512x512" />",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
}],
|
||||
"start_url": "/web",
|
||||
"display": "standalone",
|
||||
"background_color": "<t t-esc="background_color"/>",
|
||||
"theme_color": "<t t-esc="theme_color"/>"
|
||||
"background_color": "<t t-esc="background_color" />",
|
||||
"theme_color": "<t t-esc="theme_color" />"
|
||||
}
|
||||
</template>
|
||||
|
||||
</odoo>
|
||||
|
|
Loading…
Reference in New Issue