From 3e74d060538caf3ecbecb75653749d6b185ef64a Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Thu, 5 Nov 2015 08:41:52 +0100 Subject: [PATCH 1/6] [ADD] web_favicon closes #199 --- web_favicon/README.rst | 65 ++++++++++++++++++++++++ web_favicon/__init__.py | 21 ++++++++ web_favicon/__openerp__.py | 44 ++++++++++++++++ web_favicon/controllers/__init__.py | 20 ++++++++ web_favicon/controllers/web_favicon.py | 43 ++++++++++++++++ web_favicon/models/__init__.py | 20 ++++++++ web_favicon/models/res_company.py | 29 +++++++++++ web_favicon/static/description/icon.png | Bin 0 -> 9455 bytes web_favicon/views/res_company.xml | 17 +++++++ web_favicon/views/templates.xml | 10 ++++ 10 files changed, 269 insertions(+) create mode 100644 web_favicon/README.rst create mode 100644 web_favicon/__init__.py create mode 100644 web_favicon/__openerp__.py create mode 100644 web_favicon/controllers/__init__.py create mode 100644 web_favicon/controllers/web_favicon.py create mode 100644 web_favicon/models/__init__.py create mode 100644 web_favicon/models/res_company.py create mode 100644 web_favicon/static/description/icon.png create mode 100644 web_favicon/views/res_company.xml create mode 100644 web_favicon/views/templates.xml diff --git a/web_favicon/README.rst b/web_favicon/README.rst new file mode 100644 index 00000000..8147340e --- /dev/null +++ b/web_favicon/README.rst @@ -0,0 +1,65 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :alt: License: AGPL-3 + +==================== +Custom shortcut icon +==================== + +This module was written to allow you to customize your Odoo instance's shortcut +icon (aka favicon). This is useful for branding purposes, but also for +integrators who have many different Odoo instances running and need to see at a +glance which browser tab does what. + +Configuration +============= + +Upload your favicon (16x16, 32x32 or 64x64 pixels, 16 colors) on the company +form. The file format whould be ico, gif or png with 16x16, 32x32 or 64x64 +pixels and 16 colors. + +Note that most browsers cache favicons basically forever, so if you want your +icon to show up, you'll most probably have to delete you browser cache. + +Usage +===== + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/{repo_id}/8.0 + +.. repo_id is available in https://github.com/OCA/maintainer-tools/blob/master/tools/repos_with_ids.txt + +For further information, please visit: + +* https://www.odoo.com/forum/help-1 + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed feedback +`here `_. + +Credits +======= + +Contributors +------------ + +* Holger Brunn + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit http://odoo-community.org. diff --git a/web_favicon/__init__.py b/web_favicon/__init__.py new file mode 100644 index 00000000..d8724ec7 --- /dev/null +++ b/web_favicon/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module copyright (C) 2015 Therp BV . +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from . import models +from . import controllers diff --git a/web_favicon/__openerp__.py b/web_favicon/__openerp__.py new file mode 100644 index 00000000..10d18800 --- /dev/null +++ b/web_favicon/__openerp__.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module copyright (C) 2015 Therp BV . +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +{ + "name": "Custom shortcut icon", + "version": "8.0.1.0.0", + "author": "Therp BV,Odoo Community Association (OCA)", + "license": "AGPL-3", + "category": "Website", + "summary": "Allows to set a custom shortcut icon", + "depends": [ + 'web', + ], + "data": [ + "views/res_company.xml", + 'views/templates.xml', + ], + "qweb": [ + ], + "test": [ + ], + "auto_install": False, + "installable": True, + "application": False, + "external_dependencies": { + 'python': [], + }, +} diff --git a/web_favicon/controllers/__init__.py b/web_favicon/controllers/__init__.py new file mode 100644 index 00000000..5c319aec --- /dev/null +++ b/web_favicon/controllers/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module copyright (C) 2015 Therp BV . +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from . import web_favicon diff --git a/web_favicon/controllers/web_favicon.py b/web_favicon/controllers/web_favicon.py new file mode 100644 index 00000000..1c9d753f --- /dev/null +++ b/web_favicon/controllers/web_favicon.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module copyright (C) 2015 Therp BV (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import StringIO +import base64 +from openerp import http +from openerp.http import request +from openerp.tools.misc import file_open + + +class WebShortcutIcon(http.Controller): + + @http.route('/web_favicon/favicon', type='http', auth="none") + def icon(self): + company = request.env['res.company'].search([], limit=1) + if 'uid' in request.env.context: + user = request.env['res.users'].browse(request.env.context['uid']) + company = user.sudo(user.id).company_id + favicon = company.favicon_backend + favicon_mimetype = company.favicon_backend_mimetype + if not favicon: + favicon = file_open('web/static/src/img/favicon.ico') + favicon_mimetype = 'image/x-icon' + else: + favicon = StringIO.StringIO(base64.b64decode(favicon)) + return request.make_response( + favicon.read(), [('Content-Type', favicon_mimetype)]) diff --git a/web_favicon/models/__init__.py b/web_favicon/models/__init__.py new file mode 100644 index 00000000..6c860e44 --- /dev/null +++ b/web_favicon/models/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module copyright (C) 2015 Therp BV . +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from . import res_company diff --git a/web_favicon/models/res_company.py b/web_favicon/models/res_company.py new file mode 100644 index 00000000..6f54bb46 --- /dev/null +++ b/web_favicon/models/res_company.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module copyright (C) 2015 Therp BV (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from openerp import models, fields + + +class ResCompany(models.Model): + _inherit = 'res.company' + + favicon_backend = fields.Binary() + favicon_backend_mimetype = fields.Char( + help='Set the mimetype of your file. Usually, that\'s one of\n' + 'image/x-icon, image/gif, image/png') diff --git a/web_favicon/static/description/icon.png b/web_favicon/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/web_favicon/views/res_company.xml b/web_favicon/views/res_company.xml new file mode 100644 index 00000000..fa06e47d --- /dev/null +++ b/web_favicon/views/res_company.xml @@ -0,0 +1,17 @@ + + + + + res.company + + + + + + + + + + + + diff --git a/web_favicon/views/templates.xml b/web_favicon/views/templates.xml new file mode 100644 index 00000000..ebb4cefe --- /dev/null +++ b/web_favicon/views/templates.xml @@ -0,0 +1,10 @@ + + + + + + From 8435c0ecd5f75c5e3f34927cab7d0e900cb95b8f Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Thu, 5 Nov 2015 09:38:12 +0100 Subject: [PATCH 2/6] [ADD] test --- web_favicon/controllers/web_favicon.py | 4 +- web_favicon/tests/__init__.py | 20 ++++++++ web_favicon/tests/test_web_favicon.py | 66 ++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 web_favicon/tests/__init__.py create mode 100644 web_favicon/tests/test_web_favicon.py diff --git a/web_favicon/controllers/web_favicon.py b/web_favicon/controllers/web_favicon.py index 1c9d753f..1a190d9c 100644 --- a/web_favicon/controllers/web_favicon.py +++ b/web_favicon/controllers/web_favicon.py @@ -20,14 +20,14 @@ import StringIO import base64 from openerp import http -from openerp.http import request from openerp.tools.misc import file_open -class WebShortcutIcon(http.Controller): +class WebFavicon(http.Controller): @http.route('/web_favicon/favicon', type='http', auth="none") def icon(self): + request = http.request company = request.env['res.company'].search([], limit=1) if 'uid' in request.env.context: user = request.env['res.users'].browse(request.env.context['uid']) diff --git a/web_favicon/tests/__init__.py b/web_favicon/tests/__init__.py new file mode 100644 index 00000000..15f22fca --- /dev/null +++ b/web_favicon/tests/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module copyright (C) 2015 Therp BV . +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from . import test_web_favicon diff --git a/web_favicon/tests/test_web_favicon.py b/web_favicon/tests/test_web_favicon.py new file mode 100644 index 00000000..c5170f4b --- /dev/null +++ b/web_favicon/tests/test_web_favicon.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module copyright (C) 2015 Therp BV . +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import base64 +import werkzeug.local +from openerp.tests.common import TransactionCase +from openerp.tools.misc import file_open +from openerp import http + + +class FakeRequest(object): + def __init__(self, env): + self.env = env + def make_response(self, data, headers): + return FakeResponse(data, headers) + + +class FakeResponse(object): + def __init__(self, data, headers): + self.data = data + self.headers = dict(headers) + + + + +class TestWebFavicon(TransactionCase): + def test_web_favicon(self): + original_request = http.request + http.request = FakeRequest(self.env) + from openerp.addons.web_favicon.controllers.web_favicon import\ + WebFavicon + company = self.env['res.company'].search([], limit=1) + # default icon + company.write({ + 'favicon_backend': False, + 'favicon_backend_mimetype': False, + }) + data = WebFavicon().icon() + self.assertEqual(data.headers['Content-Type'], 'image/x-icon') + default_icon_data = data.data + # our own icon + company.write({ + 'favicon_backend': base64.b64encode(file_open( + 'web_favicon/static/description/icon.png').read()), + 'favicon_backend_mimetype': 'image/png', + }) + data = WebFavicon().icon() + self.assertEqual(data.headers['Content-Type'], + company.favicon_backend_mimetype) + http.request = original_request From 5a48f815af5cbf482f9d5ed269325e5bc2437c9b Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Mon, 9 Nov 2015 10:40:54 +0100 Subject: [PATCH 3/6] [IMP] review points --- web_favicon/README.rst | 4 +--- web_favicon/controllers/web_favicon.py | 3 ++- web_favicon/tests/test_web_favicon.py | 2 -- web_favicon/views/templates.xml | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/web_favicon/README.rst b/web_favicon/README.rst index 8147340e..7067a91a 100644 --- a/web_favicon/README.rst +++ b/web_favicon/README.rst @@ -25,9 +25,7 @@ Usage .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/{repo_id}/8.0 - -.. repo_id is available in https://github.com/OCA/maintainer-tools/blob/master/tools/repos_with_ids.txt + :target: https://runbot.odoo-community.org/runbot/162/8.0 For further information, please visit: diff --git a/web_favicon/controllers/web_favicon.py b/web_favicon/controllers/web_favicon.py index 1a190d9c..f9212ce4 100644 --- a/web_favicon/controllers/web_favicon.py +++ b/web_favicon/controllers/web_favicon.py @@ -28,10 +28,11 @@ class WebFavicon(http.Controller): @http.route('/web_favicon/favicon', type='http', auth="none") def icon(self): request = http.request - company = request.env['res.company'].search([], limit=1) if 'uid' in request.env.context: user = request.env['res.users'].browse(request.env.context['uid']) company = user.sudo(user.id).company_id + else: + company = request.env['res.company'].search([], limit=1) favicon = company.favicon_backend favicon_mimetype = company.favicon_backend_mimetype if not favicon: diff --git a/web_favicon/tests/test_web_favicon.py b/web_favicon/tests/test_web_favicon.py index c5170f4b..bc56330a 100644 --- a/web_favicon/tests/test_web_favicon.py +++ b/web_favicon/tests/test_web_favicon.py @@ -37,8 +37,6 @@ class FakeResponse(object): self.headers = dict(headers) - - class TestWebFavicon(TransactionCase): def test_web_favicon(self): original_request = http.request diff --git a/web_favicon/views/templates.xml b/web_favicon/views/templates.xml index ebb4cefe..ed80510a 100644 --- a/web_favicon/views/templates.xml +++ b/web_favicon/views/templates.xml @@ -3,7 +3,7 @@ From 3f777db913010d5c1fa6f5e5eed7c7a5ea52de1a Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Mon, 9 Nov 2015 11:00:32 +0100 Subject: [PATCH 4/6] [FIX] flake8 --- web_favicon/tests/test_web_favicon.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web_favicon/tests/test_web_favicon.py b/web_favicon/tests/test_web_favicon.py index bc56330a..0301639c 100644 --- a/web_favicon/tests/test_web_favicon.py +++ b/web_favicon/tests/test_web_favicon.py @@ -18,7 +18,6 @@ # ############################################################################## import base64 -import werkzeug.local from openerp.tests.common import TransactionCase from openerp.tools.misc import file_open from openerp import http @@ -27,6 +26,7 @@ from openerp import http class FakeRequest(object): def __init__(self, env): self.env = env + def make_response(self, data, headers): return FakeResponse(data, headers) @@ -51,7 +51,6 @@ class TestWebFavicon(TransactionCase): }) data = WebFavicon().icon() self.assertEqual(data.headers['Content-Type'], 'image/x-icon') - default_icon_data = data.data # our own icon company.write({ 'favicon_backend': base64.b64encode(file_open( From 3046f6d94b892aa9bd712292832679c8b5d162f6 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Fri, 13 Nov 2015 13:10:57 +0100 Subject: [PATCH 5/6] [ADD] put suggestions to have other formats for mobile devices in the roadmap --- web_favicon/README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/web_favicon/README.rst b/web_favicon/README.rst index 7067a91a..c9bb1ddb 100644 --- a/web_favicon/README.rst +++ b/web_favicon/README.rst @@ -31,6 +31,11 @@ For further information, please visit: * https://www.odoo.com/forum/help-1 +Known issues / Roadmap +====================== + +* allow to upload some big icon (preferrably SVG or the like) and generate icons suitable for mobile devices + Bug Tracker =========== From fdfcad30ffb827b02f2b734d6ccece770c03a9de Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Thu, 7 Apr 2016 14:30:57 +0200 Subject: [PATCH 6/6] [IMP] web_favicon: Nicer icon + README imp + support files --- web_favicon/README.rst | 40 ++++++++----- web_favicon/__init__.py | 20 +------ web_favicon/__openerp__.py | 37 +++--------- web_favicon/controllers/__init__.py | 20 +------ web_favicon/controllers/web_favicon.py | 21 +------ web_favicon/models/__init__.py | 20 +------ web_favicon/models/res_company.py | 30 +++------- web_favicon/static/description/icon.png | Bin 9455 -> 3398 bytes .../static/src/img/android-chrome-144x144.png | Bin 0 -> 1674 bytes .../static/src/img/android-chrome-192x192.png | Bin 0 -> 2304 bytes .../static/src/img/android-chrome-36x36.png | Bin 0 -> 582 bytes .../static/src/img/android-chrome-48x48.png | Bin 0 -> 693 bytes .../static/src/img/android-chrome-72x72.png | Bin 0 -> 949 bytes .../static/src/img/android-chrome-96x96.png | Bin 0 -> 1213 bytes .../src/img/apple-touch-icon-114x114.png | Bin 0 -> 1275 bytes .../src/img/apple-touch-icon-120x120.png | Bin 0 -> 1267 bytes .../src/img/apple-touch-icon-144x144.png | Bin 0 -> 1508 bytes .../src/img/apple-touch-icon-152x152.png | Bin 0 -> 1570 bytes .../src/img/apple-touch-icon-180x180.png | Bin 0 -> 1875 bytes .../static/src/img/apple-touch-icon-57x57.png | Bin 0 -> 677 bytes .../static/src/img/apple-touch-icon-60x60.png | Bin 0 -> 736 bytes .../static/src/img/apple-touch-icon-72x72.png | Bin 0 -> 869 bytes .../static/src/img/apple-touch-icon-76x76.png | Bin 0 -> 855 bytes .../src/img/apple-touch-icon-precomposed.png | Bin 0 -> 2363 bytes .../static/src/img/apple-touch-icon.png | Bin 0 -> 1875 bytes web_favicon/static/src/img/browserconfig.xml | 12 ++++ web_favicon/static/src/img/favicon-16x16.png | Bin 0 -> 390 bytes web_favicon/static/src/img/favicon-32x32.png | Bin 0 -> 533 bytes web_favicon/static/src/img/favicon-96x96.png | Bin 0 -> 1213 bytes web_favicon/static/src/img/favicon.ico | Bin 0 -> 15086 bytes web_favicon/static/src/img/manifest.json | 41 +++++++++++++ .../src/img/master_original_favicon.png | Bin 0 -> 7242 bytes .../src/img/master_original_favicon.svg | 56 ++++++++++++++++++ web_favicon/static/src/img/mstile-144x144.png | Bin 0 -> 1820 bytes web_favicon/static/src/img/mstile-150x150.png | Bin 0 -> 1632 bytes web_favicon/static/src/img/mstile-310x150.png | Bin 0 -> 1514 bytes web_favicon/static/src/img/mstile-310x310.png | Bin 0 -> 3294 bytes web_favicon/static/src/img/mstile-70x70.png | Bin 0 -> 1232 bytes .../src/img/website_favicon_sample.html | 24 ++++++++ web_favicon/tests/__init__.py | 20 +------ web_favicon/tests/test_web_favicon.py | 21 +------ 41 files changed, 190 insertions(+), 172 deletions(-) create mode 100644 web_favicon/static/src/img/android-chrome-144x144.png create mode 100644 web_favicon/static/src/img/android-chrome-192x192.png create mode 100644 web_favicon/static/src/img/android-chrome-36x36.png create mode 100644 web_favicon/static/src/img/android-chrome-48x48.png create mode 100644 web_favicon/static/src/img/android-chrome-72x72.png create mode 100644 web_favicon/static/src/img/android-chrome-96x96.png create mode 100644 web_favicon/static/src/img/apple-touch-icon-114x114.png create mode 100644 web_favicon/static/src/img/apple-touch-icon-120x120.png create mode 100644 web_favicon/static/src/img/apple-touch-icon-144x144.png create mode 100644 web_favicon/static/src/img/apple-touch-icon-152x152.png create mode 100644 web_favicon/static/src/img/apple-touch-icon-180x180.png create mode 100644 web_favicon/static/src/img/apple-touch-icon-57x57.png create mode 100644 web_favicon/static/src/img/apple-touch-icon-60x60.png create mode 100644 web_favicon/static/src/img/apple-touch-icon-72x72.png create mode 100644 web_favicon/static/src/img/apple-touch-icon-76x76.png create mode 100644 web_favicon/static/src/img/apple-touch-icon-precomposed.png create mode 100644 web_favicon/static/src/img/apple-touch-icon.png create mode 100644 web_favicon/static/src/img/browserconfig.xml create mode 100644 web_favicon/static/src/img/favicon-16x16.png create mode 100644 web_favicon/static/src/img/favicon-32x32.png create mode 100644 web_favicon/static/src/img/favicon-96x96.png create mode 100644 web_favicon/static/src/img/favicon.ico create mode 100644 web_favicon/static/src/img/manifest.json create mode 100644 web_favicon/static/src/img/master_original_favicon.png create mode 100644 web_favicon/static/src/img/master_original_favicon.svg create mode 100644 web_favicon/static/src/img/mstile-144x144.png create mode 100644 web_favicon/static/src/img/mstile-150x150.png create mode 100644 web_favicon/static/src/img/mstile-310x150.png create mode 100644 web_favicon/static/src/img/mstile-310x310.png create mode 100644 web_favicon/static/src/img/mstile-70x70.png create mode 100644 web_favicon/static/src/img/website_favicon_sample.html diff --git a/web_favicon/README.rst b/web_favicon/README.rst index c9bb1ddb..be9fd7a5 100644 --- a/web_favicon/README.rst +++ b/web_favicon/README.rst @@ -1,25 +1,33 @@ .. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :alt: License: AGPL-3 + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 -==================== -Custom shortcut icon -==================== +============================== +Custom shortcut icon (favicon) +============================== This module was written to allow you to customize your Odoo instance's shortcut icon (aka favicon). This is useful for branding purposes, but also for integrators who have many different Odoo instances running and need to see at a glance which browser tab does what. +More info about favicon: https://en.wikipedia.org/wiki/Favicon + Configuration ============= -Upload your favicon (16x16, 32x32 or 64x64 pixels, 16 colors) on the company -form. The file format whould be ico, gif or png with 16x16, 32x32 or 64x64 -pixels and 16 colors. +Upload your favicon (16x16, 32x32, 64x64 or "as big as possible") on the +company form. The file format would be ico, gif or png with 16x16, 32x32 or +64x64 pixels and 16 colors. Highers resolutions or colors support depends on +the used browser, but most modern browsers do. Note that most browsers cache favicons basically forever, so if you want your icon to show up, you'll most probably have to delete you browser cache. +You have a sample SVG that can be used as template for generating your icon +in /static/src/img/master_original_favicon.svg. You can also search for some +favicon generators across the web. + Usage ===== @@ -27,14 +35,15 @@ Usage :alt: Try me on Runbot :target: https://runbot.odoo-community.org/runbot/162/8.0 -For further information, please visit: - -* https://www.odoo.com/forum/help-1 - Known issues / Roadmap ====================== -* allow to upload some big icon (preferrably SVG or the like) and generate icons suitable for mobile devices +* Allow to upload some big icon (preferrably SVG or the like) and generate + all the icons from it +* Generate icons suitable for mobile devices and web apps (see /static/src/img/ + folder inside the module for a sample of the possible current formats. +* Put the icon definition at system level, not at company level. It doesn't + make sense (as the icon is cached) to have a different icon per company. Bug Tracker =========== @@ -42,7 +51,9 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed feedback -`here `_. +`here `_. Credits ======= @@ -51,6 +62,7 @@ Contributors ------------ * Holger Brunn +* Pedro M. Baeza Maintainer ---------- @@ -65,4 +77,4 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -To contribute to this module, please visit http://odoo-community.org. +To contribute to this module, please visit https://odoo-community.org. diff --git a/web_favicon/__init__.py b/web_favicon/__init__.py index d8724ec7..a2666d4d 100644 --- a/web_favicon/__init__.py +++ b/web_favicon/__init__.py @@ -1,21 +1,5 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# This module copyright (C) 2015 Therp BV . -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + from . import models from . import controllers diff --git a/web_favicon/__openerp__.py b/web_favicon/__openerp__.py index 10d18800..b6d6491f 100644 --- a/web_favicon/__openerp__.py +++ b/web_favicon/__openerp__.py @@ -1,29 +1,17 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# This module copyright (C) 2015 Therp BV . -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# © 2015 Therp BV +# © 2016 Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + { "name": "Custom shortcut icon", "version": "8.0.1.0.0", - "author": "Therp BV,Odoo Community Association (OCA)", + "author": "Therp BV, " + "Tecnativa, " + "Odoo Community Association (OCA)", "license": "AGPL-3", "category": "Website", - "summary": "Allows to set a custom shortcut icon", + "summary": "Allows to set a custom shortcut icon (aka favicon)", "depends": [ 'web', ], @@ -31,14 +19,5 @@ "views/res_company.xml", 'views/templates.xml', ], - "qweb": [ - ], - "test": [ - ], - "auto_install": False, "installable": True, - "application": False, - "external_dependencies": { - 'python': [], - }, } diff --git a/web_favicon/controllers/__init__.py b/web_favicon/controllers/__init__.py index 5c319aec..7c3fa3f8 100644 --- a/web_favicon/controllers/__init__.py +++ b/web_favicon/controllers/__init__.py @@ -1,20 +1,4 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# This module copyright (C) 2015 Therp BV . -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + from . import web_favicon diff --git a/web_favicon/controllers/web_favicon.py b/web_favicon/controllers/web_favicon.py index f9212ce4..f0b92aa0 100644 --- a/web_favicon/controllers/web_favicon.py +++ b/web_favicon/controllers/web_favicon.py @@ -1,22 +1,7 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# This module copyright (C) 2015 Therp BV (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# © 2015 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + import StringIO import base64 from openerp import http diff --git a/web_favicon/models/__init__.py b/web_favicon/models/__init__.py index 6c860e44..54d77ccf 100644 --- a/web_favicon/models/__init__.py +++ b/web_favicon/models/__init__.py @@ -1,20 +1,4 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# This module copyright (C) 2015 Therp BV . -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + from . import res_company diff --git a/web_favicon/models/res_company.py b/web_favicon/models/res_company.py index 6f54bb46..e30c1b2a 100644 --- a/web_favicon/models/res_company.py +++ b/web_favicon/models/res_company.py @@ -1,22 +1,8 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# This module copyright (C) 2015 Therp BV (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# © 2015 Therp BV +# © 2016 Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + from openerp import models, fields @@ -24,6 +10,8 @@ class ResCompany(models.Model): _inherit = 'res.company' favicon_backend = fields.Binary() - favicon_backend_mimetype = fields.Char( - help='Set the mimetype of your file. Usually, that\'s one of\n' - 'image/x-icon, image/gif, image/png') + favicon_backend_mimetype = fields.Selection( + selection=[('image/x-icon', 'image/x-icon'), + ('image/gif', 'image/gif'), + ('image/png', 'image/png')], + help='Set the mimetype of your file.') diff --git a/web_favicon/static/description/icon.png b/web_favicon/static/description/icon.png index 3a0328b516c4980e8e44cdb63fd945757ddd132d..bc0090b3d2d9321a3f225477887f7f7d3e1c68dd 100644 GIT binary patch literal 3398 zcma)9^;Z)P*Pk>vN)QK1cS?6k3={-WVBkhfkQiM9>4AWBONVrKN+Td3BLybiCHmGTtp?gCBe+5WFDDgL09H;}~OKwHwobC@K*}E_KymBibfqkmGHdg*G zChEE#`|Fw^cUz(=5JA*I31pzrH=xlUZzV#FuXjLVxN2Hvf?FWqvSpeA#nILyP#ii@=25lRASa>RS=5KsaMw)b}m8Y-d&OD6teYQbLTZLqrf z%pUVmL0VT)t#AmD(Lk9sr8FZ>3kyhBGfO;h{d}?T__*(bAV`3gBuI&WSwK>X8d!rJ zRm$`;t8MVZZYD?2eGF7%qYG6Byi`K!n2Gk+9A!xq#idMiueM9xBG?J?sb`Vx{Vkl> zH>_*@a0Un-E{P)dA)#Ab26rpu40Y@={^Q8Rg*jc)Db9jiw#W_HK=nZws)rXG(08M# zZWd9kd)9rz!#~WA#-`>bz$c5KzGri_FKOXKL6dqu;!CprCew!JGaq>5_(`dqfw8Q9 z-V6xei>l+@D@Fr+E_|4hs{I+rzB!)_jvsuZlp1w?NMBS?-$E=$!NSZ>Je>zrTgx|# zii{m{je+P$XJui%9~Nr+ed%>w_s%wXu+{Qfar)vr;aA?=F%`A|?A*YoJIh_;oiqLM z`9GM=xi5`p@zPT9t?X|dBb>-HAHUcrSOJ_wTWYHnpyI=(K3nIzUw7>VU&swx+s1Lqy+TBX?3hEqbF;S69Uq7=n$Dm zvDIe>9Nhh%Nw(8vwsW^V=#sRYfg7!73=+zX09#4?2LCCdV@$$sj(SY zz<_bW8^Q3|q&cN+53hGH%rvSe_SYKfOY5mU|Hi}keq1mBmh)6oGecL_bdB8gO6uy9 zYV=7tH!-z>Xmnh?-{6|pD=w&b2xgbY=_KrZs8$2c=sse7YuAg|9lwIb-}Jz7a%DZA zv1|oXp2+rfZdkcg|MBhZ;@nI92{Q3Y*g!3IUfmHSeQDLJ+LK7U`n>+hWweAsZc7Hq`%g|| zdy6piO81&^pvw3L!CUW+{v$ zy+*nMk|r?cU}fwvi=u}Urxf#Y1h1G|CwiAWlX-NRurp<|PeiP6v4OU>Zwa(V^7X6T z{DlC~W{K;w{F_{T+gfbu?5A`;p`jx|q&4>d>~ZU|om#QD{NfGXNSjO4jf}zZ#h*lP zOJ~`DSE^;wQdfgiwjT9ie;q2}^Hil_G?oT67Cq9wPOZGh;(?vHh^Zy#=Fsr))huz_ z|Brayo>NXPqo2V?bj4S9-u}_5UC_Ik4g-1|>ahDYbJ8S~HeB?8Vb5(?u2O4Iqlo^adT#<)+Y!z&%-`$S@af!*i5hApY*hr8rP1JIV>j@#N4 zO@Z{m8}`MIVYe%O1*0Pe7DKc0vdD^MukZqwiM(yTs|E7Q*GBvf_DAF2SP&v0@=YSn zp`>|jIGn}F$!TWKT~}AvV=3S<+YA-UKIZ~WG%KcEwx~4I;`$Chn->+f?)d?%D!Pue z{zyBp5;$i5_r#d84IC7SBJD5I(^y-N-jdL~_6aE_;dmn`g@4k^Ic(3NRYg@Ki+WCB znAX*8E)0{500IAe&YEtIw*1>PmKM0NL!{%pZ)D1BlMna{nTHkGv8}>-4PrME^J>t2MAgES)*cj%GZp#wmi>fKsd9XHq|% zWps*Ev5Ym7wzNZaFevsGSt5bz!dzqiXdiVUI=|yYwb75E)xNi%>}F?YHNqwYo^<$f+4P&8-EQtPQ2qzD ztx424ALc-uK~f5ynl~KGpsyma-zcqmY=PmOuG_y4$h(rCkyCMMuBDE11*%Q8dc(nN zj<&nTbkS3=Bw*?aTsI-FpedzJ# z;G?I=;S2-;DbkDsU0poMD68C)LnpoS{<-XBz?5!VP2ao9A;}H2kd@622W76MBWA z61$-8r}9eu-K?bsB~1z|J5Pdjs2wFeFLDU=)O*+53A?slpNwuyL(aE�pi~x#&pE z^9nyi)_eO+_dnK7X{kEQEo3w}>5u}8d#h2tI%p3M`k|6fuW0Dq2{u8&`h4xbWB* zP79f(Z!ZPIVDvJ`{U5uhE6&YqkARqGOQnlh*Cd2w&j8tVb#?uh0Q<(Y@$qqayCAb< zJaJJ`(^`yrTlX*vRN#qtT4ZoALG{`wJx+z60OX8{Y?UY`F7Czq_fO@s4r*NPL#(T> zUv_T(5!a&!z{kf2{GF-JjVAJzXPj+xAY_v0PSYS#uKJh2x2h_N%ITp7yV)v?ZO{v5 zX&JAB>1xXnhB)AM~<>~1eO++IA<%%_JQuQxgc9euPIp(OKa(DpwP5TGI z-g^S^ch2_Ga6e>6%R`J(y_ zxaW-s$B~@X8L7?%Z|(0tDpkn^;0-*$qx7e6I|0fc1k1qQ?ptR0Jo$G7M-oG~h4b|5w6)#Lt{|DRJhqM3y literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I diff --git a/web_favicon/static/src/img/android-chrome-144x144.png b/web_favicon/static/src/img/android-chrome-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..47cbf21afcea0e9dd6da61a2bb377010bcab50bc GIT binary patch literal 1674 zcmbW1`#TegAIG;gw{kx?8g^#!#n=fM(Z;YHq%m#?rk z)#_`Tm=0$SxfG!|nsUUn!@+XfwBa~A|H65m&-?R!UZ3arynlQb2L^a)9E2PM000_3 z-Z+B7%m0xoNU_JLx+Mw&C%XH)0|2dMhjwF>6b#HDczFPxzA;`>fLf||c!uJ6>K_3; zENjS$qg$X~Fy1dItqFhoUk_@*pRI_}%OnI40jfR&AQ9xfe7(bh;iwgUHz})d!pABV z08rxk;M{}B(<70BEFnVuxuAyxlJ2-I7r(2`O{#*$fQeDVliWSlwS@Z+@8J@KoR@CY#&_E|;u#n>ho#2% zE=9|E^DC71xJoalN=b=BVs@q(4N*K&Q z6RWmM>QF9}HE!IbZC)T5-LXYm=9#fE%9Zij4gOHiVo(}#G0s-jxNaSm{36l(J7N83 z{f%nLhGTfS6}RHzEF~h*RLm;BiZRlTgxI5|5w2s49mwV7DYcwctw-aOFxWET!L0q! zp^%)K{k0lVk%+D0`visKc1^GDeIX5&v2`ZLw8`F)sMDwMKm=vrT9aTlJmLqd#;1Qm zo)`rn6FQjV{Wo95lY8i)&%{9_hiS3I|1RpaZ zpqzA>XBkaK-tPN}|89(XI@0_$NqLCXQcC$Wu4Rx=xzdgtXP<%x8fVf+R^65Fr`4_p z4eK~u`ewmYLV14G#Ihd{$V=1>r6-rf!^U7Q2Z`TIICxb&x?Z5Gq zeac3Ecx=xTm7g^=N1RZpI=7BZ+ch9f&F_~VvV-wAX4IL7+xjlPX|+7Y%10+K`ay#$ zXFZ4Doa2x34XzKnlx>z!amZ8nBSLFTL%I*d;tKulL^CeI`u22N z)-uRvfnfYQ4=YP(-{%t!kCB`*MRL5C18pw91US2k!Aetr>;$?P#5B{BX$|LE|44(b z8k%zcXgY6S8@C|5alyIxN&*)1wk$nWLIe{&_AGhX_;L%6Aa-7YGb=Vob=_$VwLw|w z=7@GkN{Cl@^Hz8+PxEK1fp>Y94Y4&HCZLhex*uUfpyZY1 zO*?;9&I(y{A`IBDP>$Iy7kco?t4Zzxo9ABhVP89!Km-GostgB2li zQrR^X?_fT9n-3n$w~rFX&=VDlsE*YQ6McR$yk}6q^^{c4sfYI1yr}h)tALo*Ng+z4 zE!Jp@vICd_mr3ThbZ+L>cQMAT^0^v4qgI{0BjfHXxl{vOQR#Ygw^C1|GLEVtji$jU z_$m4=0V&U_!`3LY@J0LuAm^{`N<`D;G0m=!?7_or%T+pWaQk(;XYiGPK676dc`0Y^ou|H9dl_-2;=Kc}BVxy;Su_``N}!LY*&5uU+u4P$rB{l?L>*7XRf+y2WYo#D#8)g_HWE)i#)gnGBhes4ejKcLHp zS&mkHRwl{8}yLG`dw_FnNX%^=`Xb3x{p>KI}n> Qihc+9-~(_^JxG+l0npneIsgCw literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/android-chrome-192x192.png b/web_favicon/static/src/img/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..95dd0dfc4ec9765d3bb9d89b8a63056631659ad9 GIT binary patch literal 2304 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 DhW7Pu literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/android-chrome-48x48.png b/web_favicon/static/src/img/android-chrome-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..5a31a338d060f6a17028d9d2575e672cbd56e83d GIT binary patch literal 693 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=fts&_Fr$;k>jEvTJ}?;m`m2 zYxml=HZH}>~3rzcIB#}u(Y4SPByoKv%Ry|FFae#S@5aKFjC>$^}pNs1+GRNRbHZ2wa!vO zvpBE&uGJgu=W`xjp4RtRf4BOQ`1w1xoZjWwQFy+=M?*4xLwoyQoxGp@i~476;`np< zRO7;4x5pcc3ZK2d@NTBeREu}aHL{O3XBRyyV~W53VcS!kr(71Qd)QB8-fKTLscD&R zWw6W2)x7We7oARAFy+vhUk#>jCwc5$UJ$%8I5V*58GDzJ>bs-=89l>Ka7ZoSP?1&v#wwvD|`(gNm}c_UW@om=#x(r{sP@XhIK z=UhBpnmV^z6BH7!(Enkt?y`m^~sl4f6e2- z1(_wfLU*!eZ7mNx-TQSO(>BJ5jNjv>h3|13;c$JiYtNo^gTH&~-aYT%CSt$r1NU0L WEWW$<`gMTO&*16m=d#Wzp$PykVK_Vh literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/android-chrome-72x72.png b/web_favicon/static/src/img/android-chrome-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..1e22c5202db42c05305214335f65ab51d1fba717 GIT binary patch literal 949 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAifOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%A+0*}aIpyul!%;=;sy8XTWx*tMG~$ktZ;G0<3vk|4ieh9@&` znAa_lV@Sl|wGlTbEm07d;+*GbGvWXL zOQqIkX|tHNm~6YZ%w1SZ`*o4TuVvRP12+rnZcS)hRvCJ@__K|!&*?weLGMpz%um#` zmYOK7#yQtUu1((O*}Tl=)<;vGcv~+N;9K{R?HRM{+qvPv6C{&!_UxI`t)%QLzpg*o zeC9>9?dz&-p16xuNT=WX?0kE+hwE53 zv^Selpa0?`dy0nSDQUeQHBM`ib;jy)bX-LBja zh~pA^q2ci9qNb6jL*7(l59?Fkm301EZ|Z3T+{PB{>d^Z*w&CIvrh^hX!k+J%U zyk6H=Jt}sg%j@NdH1%hr~&;^JdImoXFs_S+~gE#w>sN4i>d7e`@Sv f9+iAO`JVs8<_`}ZiMQzklRtx}tDnm{r-UW|BNMV+ literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/android-chrome-96x96.png b/web_favicon/static/src/img/android-chrome-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..63ba2618c2cfd688f316b15c446e70b325f416fe GIT binary patch literal 1213 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy#B(j9#r85lP9bN@+X1@ak-gWR1M z)}51i3FL4VctjQhHD3o|MkkHg6+l6c0G|+7pUlF=uHBTQeeESHfo6)A1o;IsgqmeM z=eflE=i6j4?S=Q`HokY>SAL>JCZ6L30|WDIPZ!6KjC)(7-Zm{(;1OZ`876Syd;R6? z?|I*E#Wgj={4+OEnd!;4eC4SfGfzHzyh%&)#x57%^3%&5)y~ZObLh&?te~|Y6=v^v zU%NQ3^84TGS6+4Od^+!a)x`9ZSBlQuO_Y#2T$y|Dt88M%wDh@OWe&c+Yu_sy9i5fF z{+wB~hx5%@&2!H#o3r+-y?f=ihy$zzA>cG*KPIY+f(+v*?so(=QhvsKwq_{AYep^VL&dEl-6sS@p$Tt&iCJ{oK(# zab;Y$|9{=T*=W7RuKYG`#T_@xRu#|G+?4C}VY1{=b$@wpO@Z$d*$PGO$cwQUIxE$+ zD9OvV#RXgtJL=(A5Oym6?tzV5Q#bM)yxsWhQN>@yz`ZXtPBevH`Xj_J>7j%62ic?U zy6cz{mUJyNs~2UO)aa0r$lVKmMEt4Ro|S2!|&3!P^MiRU!Sxl zdoXx#a5i>c+05(MXEXmz)$W#kmg0|uxZR%ZHVb*NzD@Q`(>&>>%YRmg^*-5mScs)U zxZusMud)n{%jPr8I5k&^ktM4#Y9iZvPbLQO*GCpqzn&ud?`ZAGWetZab~CaHtC_Cy zO1u&{S*C&^V7XA&0|^O7iJ2)H>^Uhjoh~2dGL3qZW5Tgvx@Lbf*NVxHpE&fqJ*>1~ zxy*?fnK4t}%`a+q|GmxT zaL`$E9r>%1c)Fa{tO!?dIvQllbp8Y1kITMJ*SqX|qaJyyCPjI#>tej@6#szX-jw|& zzrABzuTIz==Ja$?fol2ZmY0_K2@TwFr>3(gZ(JPoon1F?$FtJ`C%q$jwL9l~v1n@4 zte)4{{b;kEjfu{-RoCkueZBH&`hJxiOZTbdFa=#`HPDN^)_G?0*3UkZ&aL@#hQZVH z_t(P{LK-(NSU2Cm!AkJuvD>HIFFjy;8rAo)|Im^`=Re|G_9^OfEL`$6_uv0t_4h8F zwb`J(cGBzUty|&_>-(>{U%zHy~gxew2uEKC2s_T$N@ zv`afIyCSd4D^9<%(Y#A(;hw+Mw{}kBn!V0`O~Sl;KP_6`yYmU9FP!o0_WcVpX6`y; z7wNW&{piKO_!k_X7kG+KpUV34_h@~ literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/apple-touch-icon-114x114.png b/web_favicon/static/src/img/apple-touch-icon-114x114.png new file mode 100644 index 0000000000000000000000000000000000000000..0aaacd34759dbe8b2807d5cec34d86486ba85902 GIT binary patch literal 1275 zcmVPx#MNmvsMWaQFxpJqaNsiN}$oKE{`}g{?VVwW}|EW%q ztW=fn-RkDb-r2Ix;KA7b{Qm0Gu;hL7JpUztGu_BE6GjNHh~;NS+lL zlxdG6$Uw;np`jl+OL9u&+==u~lasQ#E~K}oiFYS*9Y}8#A#Y=XNT zR$2~7d7bybz9iiG@UJs|a!$Os%jACOZ$$#uFc;2G1ufK=~Bs`uKGON=c6 zgRk*Q_mP-;slq5SC`>4T!lD~RIw(gRkmgcS6Pj685!1hrFi;^BOowGi+2RJGcqb%OPKpaEIb+ zvV(|1-mR#PEV*Hh*%%N0_kWAs(bq%%K$fg|Pj{_>uSpZKqfgK?l4{$Tv+@^zc2x)> zyFR-41t_<)Ji9n#27-A2e?u2`TnG_{Ewy1u_N_U|TpxJpjfE)w{E8Pbu&w@uV@K{d zfMTt=l9DuKc9)!}Y)u`3Mkhh$yFr0+A28XA^fKa4Efy!%oO`p8Nzbbb9UalJz>uIttwAf$~z)4P2O-F~ZZzb3B;Mh(VsnzsnC6~Ft l`x*+LUFQ$-gZ%f9zW_-L^cyqs0oVWl002ovPDHLkV1innXb%7Y literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/apple-touch-icon-120x120.png b/web_favicon/static/src/img/apple-touch-icon-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..3909ec7f00c5abfa485b3122c3e7d180ee73a1ae GIT binary patch literal 1267 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 KMNUMnLSTXlDCzD1 literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/apple-touch-icon-152x152.png b/web_favicon/static/src/img/apple-touch-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..93fd730ba9c06dac2a7124e89fd315e57da044ef GIT binary patch literal 1570 zcmV+-2Hp9IP)0{{R3FC5Sl00004XF*Lt006O% z3;baP00001b5ch_0Itp)=>Px#MNmvsMgRZ*tyY$^WS*o(jHXJC`}O(3gR!GUi~jum zs!)>Nyw$sQsqfwD_wV)c=I_m#z|y70uw9wRkh$vAvCii6Z>InN1$#+E zK~#9!?OfTiQ>!F7pdg!5t{wLIT z!+MO12~ub+X1ND59_x_$PlD=(ZCb+YwEY*U6X3oa>u13AX`RfhmCccIayepmGpytn z>GGidCN0b{+{d?W9d~V!q~)@uTVM@`5z11?1>YXpFiCC6r1!Sa`V*G2Rn!z(J*+Qi zVQXUsoxcL>OV^g6ffQGx?Nw6p;Pz{26qbXuiM;Fz$}*Ake45rB!t#+Dxy*A|wB;l& zac;Y^%p^Ak_42djr}?r=>si(77m14|&`r*^A$RnbyqC7E$W8Ugx`w!}@T{9!;yRJ} zO1*E4>$HHa&K{j@O>+%0FKl~~^gAF*dj}cny_pOt&eHBj3Lf?|8>ii0n&>q85&ip0 zoJse#4k@KB4RQ6O*_~=-njWe6YBoNm?>YKmX4OK?kP7C)5&K*|bp+(c8GN+eFDO`M z>k9cg%CI$Fn481ET8nDi#{~mTVsoby%DT0ClmKwK)rhprsi?Pvu)RAZ*VPn@A*&?C zpV1UQG$fP@D~XYsOQg|p=zob}dP)580D@&DhUuEDurEaf2$mHXrpKz{LlIe-WfQDl zOKnl4aLE-}Hb~wm1R4OS{#|G$$g-jsKprdfNz3(0;0kHV3|Q6yo#UvsO?9&DO|{ivi<7eIAChd$ zFqma|9}B4%3&Y^6Sj39YDL7`9JSVGUkctJajs}$I1` z^jisVe>-2Vam&XqVkL(>3uDt$k_#+(CM(Ye3@|Y@y+4w-WWDkMgOn^Im{4`Uaw=JP ze`3Ew_rYK^158$hN_0<_|DXN+iM$&#tWE#C%E0o^+0 z`APZei2lQX{bxmalU2U*%0GY9j{#OGsh&S@dVZiNzEkf?$$3`-aZjKEbDYrykc%0r zwQ$B`FR!T94>TUed)(MTt`Y^lc{Jb-cN;kw5qw!vr2h+GE{ZL$d>x9MzCm3#Hd#Wo z!CXrfsw)UChXK{@#tJU8*(J~s(pya#iplvymAiZ{1{FMV$tX3cR5e|Duu0FtGO*M+ zRhcpm%OHlit+w2K-N}MIN2oOdHX!VB)t7Zkbu$T)W%Yy{u4My`3#EMcD5%%_;f?y&g)N{2~m2TP1>-{2Jph3^A^L zGJ&v4OO5epWAk5w^J12>aKy2Bdbo1WqJbLe0iJg^0IL}-yknUqR3*{v*MIiPo+!Wa=+j(EG$gJ?lX~?7OrcWm|DCNl8%cHaX4JcS0m3WPnVQ- z_^!#b?hTsOuzm`3Cqq-BIjk>e+d^WS3)5XMMD=GjJL9lvIo|XD(=Tje5HL7BhiMz` zf9k96;t5U)_Z{AuWbS6%hVJz#>bn%TV>DqulU=R;d9iJa>2shSdg!5t9{MBcFY;~+ UAH#I9{r~^~07*qoM6N<$g3rbVO8@`> literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/apple-touch-icon-180x180.png b/web_favicon/static/src/img/apple-touch-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..2899fa5da80dccdf5e8cf0a43bc8d87d02102773 GIT binary patch literal 1875 zcmV-Z2dwysP)Px#LQqUpMgRZ*wrisM_xjMF#QyyKvSFO9SC*qii=;=4 zsZNmd=(%AJfUob~>)W@|)~w6BcdE*jyy3#x=F8uWc*1G`00yr~L_t(| z+U;H0mg6W4ZH&Qe#u)7X|J6yVt9$CqR7CDd%YWp7J_mVh(|ZA)+$ppAKisckbd--J zf0rd*_W%I?gWIZ*w(B)zTBXn!z<+_OaQI7)ol8+K)nbKQuTqogEXpoTVstpCOCYx_ z@|Wd~!(sa)+ND$M*wvCvzCT%k8=}z0if=jS*{>F1yM>!VcWJxyv| z7WY>kbfRSSEF&p35Wyyp~Bo7c8915H)coW&jWo2H#!@yH0FVyT_L zsdER{iA|RAOO0A+E4#?IdDo;%jaukV%xE$tAWuy~EVL=zBquIqMlQ7%m@`Pg-Q(i* zf?DbW@l%Pc_DS&4`dx5z(7IA~qEhq9VdOo5)yigcr-6;uxAjcRzwi=`5Ts zPVkNi!h42U!fIW>Us?4yNy9~q-3#5O+G!eNUm>tU3g5X| ziv0E+PDd@Uxn=l5BbFNQFJNv+t7E$(&rEe}#6R2sm-eSM>)Oy%**qUSg#`lo|jXe*QG~r7T!}{RCC30P&^$`Ac&hXuwdLw_Irev~AUC z!>Q8%J*MCCAj)Rzp)Rx2ko8c_&LuE{4$aO5aO07$BL(t^xf!(Ji}Ik@BQ}SonlGM) zqP)<28W=MdD4v$>>DGRgZ!xJov5i~-^$aQI*-jy_7ja=7)ZzfnAAh6^CaZp2EV>30*PW4-W0sne;q%-MT8tN zHKdf#{(|2#m};;J(4@X2!Qslm8yDyv5WZ$6UuwAA5;C;#g}xznFo=o|@OlbVYU)c{ zM1jfC{~NSf7p9U2bi=TI&|cdjDhd%+7E%AG=oDmCBA{4Fa@$Cov^s(FyyA9YQ6~$iX^(04wTm(8U_K zK88-zILvrb3)wN!)hmtc-mR#Lk+?P#)!a=#B^>6OI0xGzXJwn0!M3?nl^@N>rCv;I z$r;fNMRggeL$|7`RJ+(dVOzIMr3*XIZG$#eHE_)ik&YP_04sK{YnD@HDj_`oQX_ZwC%`G=P=;qH)*gC#yX#SWMS=EEx7LuK{ z4f;lfefEXfGYX+%w=Agqz1O3L_*X=lZ2-D{w?BqDdj=TD-IOyhO8%;=u z2!b0DAI74l;oMvtiJEF;o*TH>U80~l@>wj1*Jr$&70(QTv4ddXunzIsIBUscZg zb?@iQ?x-f|KAxbt^y!?Z;ZDd0ihgT_D96Q!KP|UAWrSydKFP_n`Zs!jYkJbTPr}iB zyS_@ql2-SQFNV#2dosK60scAg_R9-rn}5?6&ThHomRoMQ<(6AO`3I66ZCQXo7SaF! N002ovPDHLkV1mYJt!e-O literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/apple-touch-icon-57x57.png b/web_favicon/static/src/img/apple-touch-icon-57x57.png new file mode 100644 index 0000000000000000000000000000000000000000..1f06b9f29d29d5c90410023fa2a4992d4fd919b1 GIT binary patch literal 677 zcmV;W0$TlvP)Px#QBX`&MgRZ*^5*aU{Qjv6DC zvt*vTcdE>ozUIr{zkaTyMvU*?>-X>V_3QH8xzpmr+qP|^$B($#vd`+&Y4ax;Y^(`WujZrM5XPq1`^!1m)%v%nYqF?Dsv23 zQJaQbe(G!I8=WJTfz!P_JU~Kmy$S?G#9ZML)HPxC?%%gs8 zSuaSB8yW&HF-v|_4|MBNHPnxb*-C?{ z;SC4XfL9#dJ8)O2u{?r%Gdfz%AP0AqIca-=8${SZ;rfU3|I)Xv+?{-$NJlB{$Taif z#L`Cbe$o-qcoWat%na=@UIpH>k=+t23!vCLxW}rhC*9)prZL}wuYYUU-2DG_i|%oU zaiVwMw+-Q{xC{^ejPG&hFlhCW#S`Aouj2Ur-u9pWt+5B8uYZg$g77SP%Gq^V00000 LNkvXXu0mjfA@x*5 literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/apple-touch-icon-60x60.png b/web_favicon/static/src/img/apple-touch-icon-60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..715f3339829524b03b2c62ccaf958a34e074a9d3 GIT binary patch literal 736 zcmV<60w4W}P)Px#T2M?>MgRZ*{rmm<_WJno_O4l%s7#NxY@?$^i>gqP zq(+SI-|MAGjk02#>(=GFcB$yk;m@7I{{8;MiM6z6px(RG)27Gb#M{AxvA=(>^XKr$ zkh$5h&i3u|%$UBl;OH6v00JaQL_t(Y$L&|yc7q@gjRXZ00TGD{{{L?_Ij5CD0coE* zj{_HmJ1dXJzkJK!?DQIO-BH}=sek?g>a6B9BR|4uGqqJ2beYDEoQ3MX0PYlLBqnri zZ=jWJ;?R%q4P~$0Ym$+Ab!luX7|DxBn%+0$R+dTB_Jh{(I2uhXUuH?!7) z(=!k2)!|dP2d{QP)nlk!zX=+0zFo+|K|t*7;Mb6x0}t}kvk^3!2|1jW4bB*D!O={+ z8#mHEIC%z3I+}oOle)U6c~_iS!SK}z==)Rv8t}9U_!yX^l93Nd6)0vkU($IaY0N$l zAbT#^J*~_KiuTbXbLnpUCHheMCv%qrx1R9kPBH&W9A8W+yQo?|vJz>7`jagSYu<=mNg+U^HYP@1erONnXQ>>2U5@X?> zFB#LqOuZCX65|F$PFN&TksSn+1>Jm3%n(md=P2YAmJ+r{yD-{8SD1q>8(8U71dS9h zuC^)nztQ?a`J&;NGM`R2!3;AR6gG^Y`%;-HjUU5=S-!)(T8s#X4K-XG!NW$%@T@jt zHZ@~*-=HnMHgXo3QFyE?3|n0?7+@RE)~NuEO)A$ndWYpUT^%jYLYe5ZW&M>go$fAQ z;*d!VpPi8RbFbT)$nEc_DVx}zb`7R4M#o*EU;Gl}=a)dc&o|*UN%#M8`jIaj12vs; S26k-#0000Px#R8UM*MWaQF@#OBZVVtg7m;U_yt5cKs@%I1!|D{Qd zs7;W@jknL9!ri*mz=5y5d#wET`nPSP%a^|Y{{OUSq1m&~>(%AdsL1Ed;O^Y%;=|gy zb*T00@tXtxj~P8^m_Y>Tk-dmDfbEosV@NK?K* z22RIdpFmf0Ps9u4B0=X2eXjus7Qfw}K?jVW2Ov0&vv>xfoX!Bm?p4T|g>_>91Y1lM zNDq#30YEThS0Z8*9L%qPTmmF3Lqi_PM2oKQW zZfb-EI<$-Fd#VC4c8a^uT0+6r_~7Ked?ZUnsqb&#X^k)lE)B0x`NrM7Erj zH^*VTnj>=byyEiM$U1r4tO=dXeHE!alFHw@u7YDScMqNKY@F2`bdaOymG;dPzr3~F9P`2#}g{eZ}GxhkJD#OB5pWvgSSUhNx? vEFW{axS?rf*U7dS+_Jy-$nx`|_3fbFQPF9c0n|D100000NkvXXu0mjf!bzjj literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/apple-touch-icon-76x76.png b/web_favicon/static/src/img/apple-touch-icon-76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..490ff715a5383f679b0d08e2051e91c048e778ee GIT binary patch literal 855 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 literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/apple-touch-icon.png b/web_favicon/static/src/img/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2899fa5da80dccdf5e8cf0a43bc8d87d02102773 GIT binary patch literal 1875 zcmV-Z2dwysP)Px#LQqUpMgRZ*wrisM_xjMF#QyyKvSFO9SC*qii=;=4 zsZNmd=(%AJfUob~>)W@|)~w6BcdE*jyy3#x=F8uWc*1G`00yr~L_t(| z+U;H0mg6W4ZH&Qe#u)7X|J6yVt9$CqR7CDd%YWp7J_mVh(|ZA)+$ppAKisckbd--J zf0rd*_W%I?gWIZ*w(B)zTBXn!z<+_OaQI7)ol8+K)nbKQuTqogEXpoTVstpCOCYx_ z@|Wd~!(sa)+ND$M*wvCvzCT%k8=}z0if=jS*{>F1yM>!VcWJxyv| z7WY>kbfRSSEF&p35Wyyp~Bo7c8915H)coW&jWo2H#!@yH0FVyT_L zsdER{iA|RAOO0A+E4#?IdDo;%jaukV%xE$tAWuy~EVL=zBquIqMlQ7%m@`Pg-Q(i* zf?DbW@l%Pc_DS&4`dx5z(7IA~qEhq9VdOo5)yigcr-6;uxAjcRzwi=`5Ts zPVkNi!h42U!fIW>Us?4yNy9~q-3#5O+G!eNUm>tU3g5X| ziv0E+PDd@Uxn=l5BbFNQFJNv+t7E$(&rEe}#6R2sm-eSM>)Oy%**qUSg#`lo|jXe*QG~r7T!}{RCC30P&^$`Ac&hXuwdLw_Irev~AUC z!>Q8%J*MCCAj)Rzp)Rx2ko8c_&LuE{4$aO5aO07$BL(t^xf!(Ji}Ik@BQ}SonlGM) zqP)<28W=MdD4v$>>DGRgZ!xJov5i~-^$aQI*-jy_7ja=7)ZzfnAAh6^CaZp2EV>30*PW4-W0sne;q%-MT8tN zHKdf#{(|2#m};;J(4@X2!Qslm8yDyv5WZ$6UuwAA5;C;#g}xznFo=o|@OlbVYU)c{ zM1jfC{~NSf7p9U2bi=TI&|cdjDhd%+7E%AG=oDmCBA{4Fa@$Cov^s(FyyA9YQ6~$iX^(04wTm(8U_K zK88-zILvrb3)wN!)hmtc-mR#Lk+?P#)!a=#B^>6OI0xGzXJwn0!M3?nl^@N>rCv;I z$r;fNMRggeL$|7`RJ+(dVOzIMr3*XIZG$#eHE_)ik&YP_04sK{YnD@HDj_`oQX_ZwC%`G=P=;qH)*gC#yX#SWMS=EEx7LuK{ z4f;lfefEXfGYX+%w=Agqz1O3L_*X=lZ2-D{w?BqDdj=TD-IOyhO8%;=u z2!b0DAI74l;oMvtiJEF;o*TH>U80~l@>wj1*Jr$&70(QTv4ddXunzIsIBUscZg zb?@iQ?x-f|KAxbt^y!?Z;ZDd0ihgT_D96Q!KP|UAWrSydKFP_n`Zs!jYkJbTPr}iB zyS_@ql2-SQFNV#2dosK60scAg_R9-rn}5?6&ThHomRoMQ<(6AO`3I66ZCQXo7SaF! N002ovPDHLkV1mYJt!e-O literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/browserconfig.xml b/web_favicon/static/src/img/browserconfig.xml new file mode 100644 index 00000000..65380f38 --- /dev/null +++ b/web_favicon/static/src/img/browserconfig.xml @@ -0,0 +1,12 @@ + + + + + + + + + #da532c + + + diff --git a/web_favicon/static/src/img/favicon-16x16.png b/web_favicon/static/src/img/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..b9f30800c257dee59bb854cd72c7f2b3e1994aed GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM*uE0G|+7pUlF=uH95bM|K7o01cNa3GxeOSl6^b=Hc@{tbXsERD>=~>RkR~ z_YM89;%E!C?0!C=D$W9r$YP-TuY)k7lg8`{px_Ko7sn8Z%c1_BLWdQ2iW?HPwK#0M z_P;)Zb&2s>eyP*bc$Aci-q(c8D=oQ_9T--1Gxy~l1CH_wGj{Oa-59&xW^rI&lEBU2 z$@8pZCUSktl(AlTktN`Z$Q|R28~*d@P5Wj3K_R7HXH}%y#IKgK!X`S&o%dT-*c|)e ziOIjs_YCjd@OG2gyj^CiSgTe~ HDWM4fzJ!|p literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/favicon-32x32.png b/web_favicon/static/src/img/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..8e73a16390f07e3927f45e085cae2e8ed067f4bb GIT binary patch literal 533 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaLr1AIbUeKHFdyLM9%9oZRV05n{xB*-tA;fnh#mOIaXe_VOE)mW2PsZcy@ zORCL;>eJDlIrjZPRh$JLk;OpwUk71ECym(^KsTy;x;TbdoNf({p46hi!&13gL*bRk zcl#H+CO0%iU5@uiT0WVtMdU}`>!m@nW?4+OPWyh5bK#4G*&jqQS1H^H`I{G#wcyOs zb2pZ=e_7h|cZvI#6A!1?EVfU(Ef#o6^1{aF8(#kTc(OLaz;)+(hR$8g`nEf3zUwC+ z{#=!-op7u`L*#(`tAiFRoYI9J9;q<43|OaR=&)hiV*U?{6%8KMWeMA`XfU?lIBU~) z#U*vCE}Otd>xXMu5+j`Ubj&%B=s0bmqR_VsEKZj#4Bxd{*lOpxDM zcVx!w7p;pA?~pm4b^Ln5ey1I>7jk6!b*1&s%013YiS+7k`Ba(dANkPG*`{OFw0&9G zX}kDNpEaNSx<}`|Bj>hHzuS891bbP0l+XkK D+M4Dc literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/favicon-96x96.png b/web_favicon/static/src/img/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..63ba2618c2cfd688f316b15c446e70b325f416fe GIT binary patch literal 1213 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy#B(j9#r85lP9bN@+X1@ak-gWR1M z)}51i3FL4VctjQhHD3o|MkkHg6+l6c0G|+7pUlF=uHBTQeeESHfo6)A1o;IsgqmeM z=eflE=i6j4?S=Q`HokY>SAL>JCZ6L30|WDIPZ!6KjC)(7-Zm{(;1OZ`876Syd;R6? z?|I*E#Wgj={4+OEnd!;4eC4SfGfzHzyh%&)#x57%^3%&5)y~ZObLh&?te~|Y6=v^v zU%NQ3^84TGS6+4Od^+!a)x`9ZSBlQuO_Y#2T$y|Dt88M%wDh@OWe&c+Yu_sy9i5fF z{+wB~hx5%@&2!H#o3r+-y?f=ihy$zzA>cG*KPIY+f(+v*?so(=QhvsKwq_{AYep^VL&dEl-6sS@p$Tt&iCJ{oK(# zab;Y$|9{=T*=W7RuKYG`#T_@xRu#|G+?4C}VY1{=b$@wpO@Z$d*$PGO$cwQUIxE$+ zD9OvV#RXgtJL=(A5Oym6?tzV5Q#bM)yxsWhQN>@yz`ZXtPBevH`Xj_J>7j%62ic?U zy6cz{mUJyNs~2UO)aa0r$lVKmMEt4Ro|S2!|&3!P^MiRU!Sxl zdoXx#a5i>c+05(MXEXmz)$W#kmg0|uxZR%ZHVb*NzD@Q`(>&>>%YRmg^*-5mScs)U zxZusMud)n{%jPr8I5k&^ktM4#Y9iZvPbLQO*GCpqzn&ud?`ZAGWetZab~CaHtC_Cy zO1u&{S*C&^V7XA&0|^O7iJ2)H>^Uhjoh~2dGL3qZW5Tgvx@Lbf*NVxHpE&fqJ*>1~ zxy*?fnK4t}%`a+q|GmxT zaL`$E9r>%1c)Fa{tO!?dIvQllbp8Y1kITMJ*SqX|qaJyyCPjI#>tej@6#szX-jw|& zzrABzuTIz==Ja$?fol2ZmY0_K2@TwFr>3(gZ(JPoon1F?$FtJ`C%q$jwL9l~v1n@4 zte)4{{b;kEjfu{-RoCkueZBH&`hJxiOZTbdFa=#`HPDN^)_G?0*3UkZ&aL@#hQZVH z_t(P{LK-(NSU2Cm!AkJuvD>HIFFjy;8rAo)|Im^`=Re|G_9^OfEL`$6_uv0t_4h8F zwb`J(cGBzUty|&_>-(>{U%zHy~gxew2uEKC2s_T$N@ zv`afIyCSd4D^9<%(Y#A(;hw+Mw{}kBn!V0`O~Sl;KP_6`yYmU9FP!o0_WcVpX6`y; z7wNW&{piKO_!k_X7kG+KpUV34_h@~ literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/favicon.ico b/web_favicon/static/src/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cdf7926f95255e6b02c27a8f1b2d93781b24b47d GIT binary patch literal 15086 zcmdU$J&0UY6vyvo61I{J0SSb_E+IlvB@hq-fwjq|O_f**L9pGmOpy%|1wph;3JW2q zl})ge38WIlLczvjM8rai(JE-j^Z$GM&gAafd*3^E=1md@&fbrA?m7SSanHRoybWO` zjKa~QLG4C(=WqzGhY&V4_Qqdm{!`7JKi`aB3t{Wk5YC84kF;WMUQGz%>-v0n<+CHA ztD>(&zl#28i2i-iWzmt849%Yu-4p#Ksxmay{Kuk`u?)tdZ$#~NroTN8zFLM_Frzo- z`Cj99Mc{?#GZ*uKgSFTTE_*hUoxsR5WXE$qX?!|f7x#H4g2!asS0CTn_;$>n z>WlYw#BVWTJ-)h{S`*K~)9~6F)>+@P{>|3F_z{}BUXVKRuv zff#6xwQ-KI=91`$D8_^waJ(2{9)-ic z2z{~NQ+;^Ag0J!UTsXAuR3ii1QhGddVE#mOyx-bq9OB33A4MJ=9-c>%b>W$Yd{2DW zMBw(wE#V<1SMr)e;Q5kt8%}(h^n>QfS&z^04f%Le^maq^Ek{jPt|b=x@XI2VzO?FKIzEqZFCcd6t;bPv`yqb+=E+558}HC9HKoqEw*5BNb8;bfUM+$LnfqdHI@>K6Mfl0%&pu4ZKvt*S z2@K>h^?`lbrz7{AoM0~`~C~I;6f*U#%FF{SJSns+FhxhhH&di2%G%0z|Rbm(Rg*dHXV&OpNw{IJzd$Ys+v}6 zZdRnp_*lc*$=Y;v62dAnk&TWjgsK`#f^_pc#d*v&^oY_FYL9Pj%Cl|H}jX$<>#jZcLmH@%^Aa<-Gh=vUX=I&nZ%Mhh97%#3LX)@Vjp?;s$nO0XL;YQZF*Kx zi%cdhHe&~v_&yCjWEo)_zQ#`KMk#L7MZ7z6R?pGx`R-sc+by<$4;jQ7;yl84ZQhb` zHg6Jfz=!kts05Rj7yFCuU*hKu^)lE1hOM@b`^H+sJ|hmEyNK71rF`fv#va?I_3S&( zchOR8ef;EmQO?A;?!i9HJVyt0X0CH3#vS)1kKY8yCt^{0MtE?;L(O8} zb=JrjS7~3esp;t8+#Dhvc6RJY-k?73vQ4_MgLsfv_u1WrXWnPhPn}|a zU<-FZ&R6n)x`$0*rDcqrJh$&n3+G8yO;#&j9MX$Qb<4{{j3;`zh;|&ph*k!!=#SXy zf!;ULn@#$kDB8`YT@PW(e^BXL<|N#DTDQE=B$VTkUQN>fQH`Z-qITC>y(TqX(RjV8 z9;=n|y>_#zY8?Z#U^Mx(wZ2BL;i0YZ2`6|bcth=!*SBQPl>Z7-TiYu;_pmkokRK}i Ypg+~_o}XrZ;{`3|XD?`}&$#jXe|Fz6@Bjb+ literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/manifest.json b/web_favicon/static/src/img/manifest.json new file mode 100644 index 00000000..0f649d7b --- /dev/null +++ b/web_favicon/static/src/img/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "Odoo", + "icons": [ + { + "src": "\/android-chrome-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": "0.75" + }, + { + "src": "\/android-chrome-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": "1.0" + }, + { + "src": "\/android-chrome-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": "1.5" + }, + { + "src": "\/android-chrome-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": "2.0" + }, + { + "src": "\/android-chrome-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": "3.0" + }, + { + "src": "\/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": "4.0" + } + ] +} diff --git a/web_favicon/static/src/img/master_original_favicon.png b/web_favicon/static/src/img/master_original_favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..22a0aa8fb9958087b237c0fb78cdb7a2ecd4ab37 GIT binary patch literal 7242 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%0D-R3HoE;>LB}~FOWKyV9a7TBH`{;&S zpn!~|?^&fJHbACpj%~rM;{P$*p60UYIAUw86l9&G2Nq=#u5eW30_V*!x#>N|==Gvh zwT1+~lO{e&T@_dI*@TRhFt<(9w`jKom6G^@n~|YH>Id9J#-ErAZlT>ipx;J1TLhgw zLfLHXE^BKlKUxM*>~Cu=VCa>sT1nrwz_DJBIafkk6P0~x6$E%=eBEI@W_ + + +image/svg+xml \ No newline at end of file diff --git a/web_favicon/static/src/img/mstile-144x144.png b/web_favicon/static/src/img/mstile-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..e44e2367521d4b7e6c5bf131e770798703baa0fc GIT binary patch literal 1820 zcmb`I=Q|q;1I0tEP$c?_S*lTrqExGt7rlv{Am%l$rbW<(xUs2Go0iBWs<`IWk{H)s zRU_1B5K3dT_NZL7YAe_KKfLF8&iOs(%lUeeEKx@MyyCn70D#}b7>>Rm@qgw4UgXFt zq2vp2U=5H40KngAe5V-Bi_S(s8$AG24oQByC^nYnHVAVszw`gM5SMPzF7_q-(I{&` zv#h`l_YpfwbpEVoGR#bs;*gj*;!~jI_Dhp0&K&^Y(ldb@*aT0}ohQi@MX)d@N2l28 z`T1}T>J1^(xSW@Bq9UQKr@kUYV^GEN*R^L)X1bozuUD=2*F?1D?_qBH#rk*R_Jc2O8`|h9%Z>%`)Oi=rJ=P9XDOY z1=jFohIw^_np`)bHeyCPDO(y;=B=h5W16%IMG%`NkVcQz`IvL>a0kVtphc#}Vpr+F zdlZRS7NS^3W!|HBFvU`wZsDgN#;oY99N&b-1FHztGLX)+O^||7tp|AqZRbY?w`de&G<+@X6eeN+S)u zsFK__N7KCb%fymj+Qrzj__B-@c=(-k|CkR?U!8eu!tng>ah6SwbKWQ`bxX58PeFT- zyntk?LNgy{Of7HMOynatxW+fW$*FQOET9n4SgZ=s`?dviUamC$2~v*rp@?f28s5sx zaAnx9%)$$l*G*L$xu*wUy$!DtHi7<@3}ee>w>J(!pSRt5o+J8?ynuH~^)Zf{mu)M! zL#_+H8H@6a4~=zToFps|l+DaNVJ44CL3iW3XYzj5#?I6Ky8B8%q3;iJ0 zuTiR#q_)<3jiyPyx30F9%f~1(DON0*D2M_}Qv)+ns64zpDd^iPac9lDmbLo#Qtzh= zlc8Iq4rj=#)u;qAQ(29jwdja#HC>LCQqLjYs`q;Y6;UkElCAX_Ew?1&gf8WZiALif zQeY}v1qd{f#-zhz>^@-&#?v6ssE2ypH6Xv-r1~k3tH1=FsE4;-tG{(7SpjebE?C71 ziQ~S#!ns2AKBX;PuB$iZBtYzFD?oIosfSK;Uq?n_jJE6|fIW`gF9=-x^KwG{rUO>e4J7^7ceb8hB-AMd(C9Or;Rs;&x32bQ`nd3?V zJ;may=D)ri03j>jnLn{^`k^o6JQXy$aSlda@F^mNg>PL?kCb_~P9zIXpJs7lYO@qx z5oo=tY5SsgSv$;+fU&kU+hU zzq3Iwu;VOWnWrE6b`v!)^mTir>7=x}ydd0IVlOgR)xCS5+PY!FO2FsfyaZR<-p^Ln zTJ7O&OkB&#_vH;dZrI|Mh2y&x!F#y&amFwNxiNLnxbT;c3$AZCRF5#FgSv64kzVP# zWwQ2ey9L8lRDzcpKI*VJAhfO&-SpiIK7kxf4L#ckQUHAa0}@mo>5y2i%o158|2gRx zl26CqJ8+8mtsecAdoWe=Pbk>+U)ITVPEhfy^V=+%$j_ z*ZIM}G$hvv3$GbEJYH;^m;O0A9@ee5qr9~=JD(JyjALfI(}E8+X7WziJH%J{0OR4I zv=Ue%o%yp1EmSdJCQ}(H?6x`@Mr(eQG4~0&EMJU4 z+PnQ-_UUBC;?>rR8Xx1R6_EEANeab2v({#uHq#&n-1VQ2`z;})&Gv`2i{H`d>HJLK eao4KgIdF5t$er)wrvAm_089`lc;$nK&;JDrs+a2k literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/mstile-150x150.png b/web_favicon/static/src/img/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..96b4e8657477f4e4cd653f4bb1f9e0e67cb455ae GIT binary patch literal 1632 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 Sasz1UzZeSPWM63)Nck6`8t*dz literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/mstile-310x310.png b/web_favicon/static/src/img/mstile-310x310.png new file mode 100644 index 0000000000000000000000000000000000000000..b9b4a3e835e6c16a269988457e36f1295ecd5690 GIT binary patch literal 3294 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 literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/mstile-70x70.png b/web_favicon/static/src/img/mstile-70x70.png new file mode 100644 index 0000000000000000000000000000000000000000..c02805fe1800ef77f751ad840be0a03467219e9b GIT binary patch literal 1232 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&v7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgDM4)6(a^~o&!PbCntW=|c^Sc#G#zhH(ZR@@42zW!nn@`}dnGZz0i@a=#7OSPLz$~FtKu^5L&Kdn1{ zB1qZPssDJdw0Yj09fgnC*cK;MabK*`V^zPWw|Zet&DD2@Q<}ay&8v6*WGOSb>fpPQ zyC=Wz{onBZ^_Lj?4a%QB3#AzP7az8;)IYDY#P-VMZR+WgOKO|MBR+nUS97^Fo%^ui z{L%+~rFZ7L6^0#twej}*$->P0_-Yr)AL(q4scLDwCCqPa`hNZ2n@uy#-sPXT$+mv> zH~Swqxh^F&X5RmQmi>oDM$xweJ*i4x)8!-XWTt$3)5Z|lQxCKmGiYhq?dRf{<0!?jVZxJe&KM?Ef0F{f&#P79PX3vYX1`z6 zknKbtTgUVw1`fva>zRyxG`=-h=y5}zU!h-d!alJjj1FPje})Q%ALUl{JfqJ&_sfad z3J+FfI2C<+anv#LgQ~98RA-L~Q@(U<@LKi4S@o5a$QO=Ko_im=kEoUy&wl-$^?~gE z7w!t7T@zTOe>L$PU3ZUl0rRPSMlKu9hnEYu{pjko+kf?J*jec)m4f~?t8Q|Y-|`Or z#qs^5c9ck`U-ietYYFqi)-5&h*wS(8vgC~Jdrmv1MjEJD{T1D$baB-)SFs-HJ8RaS ze9kF8C+X~E56g=S6X(CW_I&qIovV85vx^U&e4#vZ=IX-+Gj?9y9Qf<#vqwjhmUw?! zn7MvRX@SV|K)Dp!zH#49=|fZ`gQkOmEFcuR+bxN#Z>L! z6m2Nk{Pp)2v5%YQ+Me7St#p5VvH$X?0w+$Z-nM?bKk0bpGQIQHFFkC}d~xSs!v&*j zSM8h>oNq@+Ze9B?Up9O8H?x0R`GZwYN1tRldog)V&W#P5b*9<%GK z=kJ>zUM#;(%U0&^y3alPx1Nj3W8(k9d3og{NDKTu&U U`IIvfSX?l8y85}Sb4q9e0QhWd)&Kwi literal 0 HcmV?d00001 diff --git a/web_favicon/static/src/img/website_favicon_sample.html b/web_favicon/static/src/img/website_favicon_sample.html new file mode 100644 index 00000000..db828882 --- /dev/null +++ b/web_favicon/static/src/img/website_favicon_sample.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web_favicon/tests/__init__.py b/web_favicon/tests/__init__.py index 15f22fca..6a5f7312 100644 --- a/web_favicon/tests/__init__.py +++ b/web_favicon/tests/__init__.py @@ -1,20 +1,4 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# This module copyright (C) 2015 Therp BV . -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + from . import test_web_favicon diff --git a/web_favicon/tests/test_web_favicon.py b/web_favicon/tests/test_web_favicon.py index 0301639c..2af4f83c 100644 --- a/web_favicon/tests/test_web_favicon.py +++ b/web_favicon/tests/test_web_favicon.py @@ -1,22 +1,7 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# This module copyright (C) 2015 Therp BV . -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# © 2015 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + import base64 from openerp.tests.common import TransactionCase from openerp.tools.misc import file_open