new pwa_config

This commit is contained in:
Benoît Vézina 2024-04-19 15:45:28 -04:00
parent 9af0635e8f
commit 69fe6e6eb4
11 changed files with 294 additions and 0 deletions

View file

@ -0,0 +1,2 @@
from . import models
from . import controllers

View file

@ -0,0 +1,27 @@
{
'name': 'Bemade PWA Configuration',
'version': '1.0',
'summary': 'Manage PWA settings including dynamic app icons',
'description': """
Manage Progressive Web App Settings
===================================
This module allows administrators to configure Progressive Web App (PWA) settings directly from Odoo's interface.
This includes setting color uploading app icons, and dynamically generating icons of different sizes to be used in the
web manifest per company.
""",
'author': 'Benoît Vézina',
'website': 'https://www.bemade.com',
'category': 'Tools',
'license': 'OPL-1',
'depends': ['web'],
'data': [
'views/res_config_settings_views.xml',
# 'security/ir.model.access.csv',
],
'demo': [
# List any demo data files here
],
'installable': True,
'application': False,
'auto_install': False,
}

View file

@ -0,0 +1 @@
from . import main

View file

@ -0,0 +1,42 @@
from odoo import http
from odoo.http import request
import json
class ExtendedWebManifest(http.Controller):
@http.route('/web/manifest.webmanifest', type='http', auth='public', methods=['GET'])
def webmanifest(self):
# Fetch the company of the current user
company = request.env.user.company_id
# Generate the manifest using company-specific settings
manifest = {
'name': company.name, # Consider adding a specific field in res.company if a different name is needed
'background_color': company.web_app_bgcolor or '#714B67', # Default value if not set
'theme_color': company.web_app_fgcolor or '#FFFFFF', # Default value if not set
'icons': [
{
'src': f'/web/image?model=res.company&id={company.id}&field=web_app_icon',
'sizes': '192x192',
'type': 'image/png'
},
{
'src': f'/web/image?model=res.company&id={company.id}&field=pwa_icon_192',
'sizes': '192x192',
'type': 'image/png'
},
{
'src': f'/web/image?model=res.company&id={company.id}&field=pwa_icon_512',
'sizes': '512x512',
'type': 'image/png'
}
],
'scope': '/web',
'start_url': '/web',
'display': 'standalone',
'prefer_related_applications': False
}
# Serialize the manifest into JSON and set the appropriate response headers
response = request.make_response(json.dumps(manifest), [('Content-Type', 'application/manifest+json')])
return response

View file

@ -0,0 +1,58 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * bemade_pwa_config
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-19 19:23+0000\n"
"PO-Revision-Date: 2024-04-19 19:23+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: bemade_pwa_config
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_company__web_app_bgcolor
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_config_settings__web_app_bgcolor
#: model_terms:ir.ui.view,arch_db:bemade_pwa_config.view_res_config_settings_pwa_inherit
msgid "Background Color"
msgstr ""
#. module: bemade_pwa_config
#: model:ir.model,name:bemade_pwa_config.model_res_company
msgid "Companies"
msgstr ""
#. module: bemade_pwa_config
#: model:ir.model,name:bemade_pwa_config.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: bemade_pwa_config
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_company__web_app_fgcolor
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_config_settings__web_app_fgcolor
#: model_terms:ir.ui.view,arch_db:bemade_pwa_config.view_res_config_settings_pwa_inherit
msgid "Foreground Color"
msgstr ""
#. module: bemade_pwa_config
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_company__pwa_icon_192
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_config_settings__pwa_icon_192
msgid "PWA Icon 192x192"
msgstr ""
#. module: bemade_pwa_config
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_company__pwa_icon_512
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_config_settings__pwa_icon_512
msgid "PWA Icon 512x512"
msgstr ""
#. module: bemade_pwa_config
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_company__web_app_icon
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_config_settings__web_app_icon
msgid "Web App Icon"
msgstr ""

View file

@ -0,0 +1,58 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * bemade_pwa_config
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-19 19:23+0000\n"
"PO-Revision-Date: 2024-04-19 19:23+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: bemade_pwa_config
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_company__web_app_bgcolor
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_config_settings__web_app_bgcolor
#: model_terms:ir.ui.view,arch_db:bemade_pwa_config.view_res_config_settings_pwa_inherit
msgid "Background Color"
msgstr "Couleur de fond"
#. module: bemade_pwa_config
#: model:ir.model,name:bemade_pwa_config.model_res_company
msgid "Companies"
msgstr "Compagnies"
#. module: bemade_pwa_config
#: model:ir.model,name:bemade_pwa_config.model_res_config_settings
msgid "Config Settings"
msgstr "Configuration"
#. module: bemade_pwa_config
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_company__web_app_fgcolor
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_config_settings__web_app_fgcolor
#: model_terms:ir.ui.view,arch_db:bemade_pwa_config.view_res_config_settings_pwa_inherit
msgid "Foreground Color"
msgstr "Couleur de premier plan"
#. module: bemade_pwa_config
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_company__pwa_icon_192
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_config_settings__pwa_icon_192
msgid "PWA Icon 192x192"
msgstr "Icône PWA 192x192"
#. module: bemade_pwa_config
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_company__pwa_icon_512
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_config_settings__pwa_icon_512
msgid "PWA Icon 512x512"
msgstr "Icône PWA 512x512"
#. module: bemade_pwa_config
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_company__web_app_icon
#: model:ir.model.fields,field_description:bemade_pwa_config.field_res_config_settings__web_app_icon
msgid "Web App Icon"
msgstr "Icône de l'application Web"

View file

@ -0,0 +1,2 @@
from . import res_company
from . import res_config_settings

View file

@ -0,0 +1,46 @@
from odoo import models, fields, api
from PIL import Image
import base64
from io import BytesIO
class Company(models.Model):
_inherit = 'res.company'
web_app_icon = fields.Binary(string="Web App Icon")
pwa_icon_192 = fields.Binary(string="PWA Icon 192x192")
pwa_icon_512 = fields.Binary(string="PWA Icon 512x512")
web_app_fgcolor = fields.Char(
string="Foreground Color",
default='#FFFFFF'
)
web_app_bgcolor = fields.Char(
string="Background Color",
default='#714B67'
)
@api.model
def create(self, vals):
record = super(Company, self).create(vals)
record.generate_pwa_icons()
return record
def write(self, vals):
result = super(Company, self).write(vals)
if 'web_app_icon' in vals:
self.generate_pwa_icons()
return result
def generate_pwa_icons(self):
if self.web_app_icon:
image_stream = BytesIO(base64.b64decode(self.web_app_icon))
image = Image.open(image_stream)
sizes = {192: 'pwa_icon_192', 512: 'pwa_icon_512'}
for size, field_name in sizes.items():
resized_image = image.resize((size, size), Image.ANTIALIAS)
stream = BytesIO()
resized_image.save(stream, format='PNG')
resized_binary = base64.b64encode(stream.getvalue())
setattr(self, field_name, resized_binary)

View file

@ -0,0 +1,31 @@
from odoo import models, fields
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
web_app_icon = fields.Binary(
string="Web App Icon",
related='company_id.web_app_icon',
readonly=False
)
pwa_icon_192 = fields.Binary(
string="PWA Icon 192x192",
related='company_id.pwa_icon_192',
readonly=True
)
pwa_icon_512 = fields.Binary(
string="PWA Icon 512x512",
related='company_id.pwa_icon_512',
readonly=True
)
web_app_fgcolor = fields.Char(
string="Foreground Color",
related='company_id.web_app_fgcolor',
readonly=False
)
web_app_bgcolor = fields.Char(
string="Background Color",
related='company_id.web_app_bgcolor',
readonly=False
)

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<!-- Extend the existing settings view of base setup -->
<record id="view_res_config_settings_pwa_inherit" model="ir.ui.view">
<field name="name">res.config.settings.pwa.inherit</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base_setup.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//block[@id='pwa_settings']/setting[field[@name='web_app_name']]" position="after">
<!-- Inserting PWA Icon, Foreground Color, and Background Color settings -->
<setting>
<field name="web_app_icon" widget="image" class="oe_avatar_large"/>
</setting>
<setting>
<label for="web_app_fgcolor" string="Foreground Color"/>
<field name="web_app_fgcolor" widget="color"/>
</setting>
<setting>
<label for="web_app_bgcolor" string="Background Color"/>
<field name="web_app_bgcolor" widget="color"/>
</setting>
</xpath>
</field>
</record>
</data>
</odoo>