diff --git a/bemade_pwa_config/__init__.py b/bemade_pwa_config/__init__.py new file mode 100644 index 0000000..38718f0 --- /dev/null +++ b/bemade_pwa_config/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import controllers \ No newline at end of file diff --git a/bemade_pwa_config/__manifest__.py b/bemade_pwa_config/__manifest__.py new file mode 100644 index 0000000..258fccb --- /dev/null +++ b/bemade_pwa_config/__manifest__.py @@ -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, +} diff --git a/bemade_pwa_config/controllers/__init__.py b/bemade_pwa_config/controllers/__init__.py new file mode 100644 index 0000000..12a7e52 --- /dev/null +++ b/bemade_pwa_config/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/bemade_pwa_config/controllers/main.py b/bemade_pwa_config/controllers/main.py new file mode 100644 index 0000000..fed6321 --- /dev/null +++ b/bemade_pwa_config/controllers/main.py @@ -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 diff --git a/bemade_pwa_config/i18n/bemade_pwa_config.pot b/bemade_pwa_config/i18n/bemade_pwa_config.pot new file mode 100644 index 0000000..0d264e2 --- /dev/null +++ b/bemade_pwa_config/i18n/bemade_pwa_config.pot @@ -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 "" diff --git a/bemade_pwa_config/i18n/fr_CA.po b/bemade_pwa_config/i18n/fr_CA.po new file mode 100644 index 0000000..f9072a1 --- /dev/null +++ b/bemade_pwa_config/i18n/fr_CA.po @@ -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" diff --git a/bemade_pwa_config/models/__init__.py b/bemade_pwa_config/models/__init__.py new file mode 100644 index 0000000..0b150f7 --- /dev/null +++ b/bemade_pwa_config/models/__init__.py @@ -0,0 +1,2 @@ +from . import res_company +from . import res_config_settings diff --git a/bemade_pwa_config/models/res_company.py b/bemade_pwa_config/models/res_company.py new file mode 100644 index 0000000..e9b106b --- /dev/null +++ b/bemade_pwa_config/models/res_company.py @@ -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) \ No newline at end of file diff --git a/bemade_pwa_config/models/res_config_settings.py b/bemade_pwa_config/models/res_config_settings.py new file mode 100644 index 0000000..673fee7 --- /dev/null +++ b/bemade_pwa_config/models/res_config_settings.py @@ -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 + ) \ No newline at end of file diff --git a/bemade_pwa_config/security/ir.model.access.csv b/bemade_pwa_config/security/ir.model.access.csv new file mode 100644 index 0000000..e69de29 diff --git a/bemade_pwa_config/views/res_config_settings_views.xml b/bemade_pwa_config/views/res_config_settings_views.xml new file mode 100644 index 0000000..03dd694 --- /dev/null +++ b/bemade_pwa_config/views/res_config_settings_views.xml @@ -0,0 +1,27 @@ + + + + + + res.config.settings.pwa.inherit + res.config.settings + + + + + + + + + + + + + + + +