web/web_favicon/models/res_company.py

91 lines
3.3 KiB
Python

# Copyright 2015 Therp BV <http://therp.nl>
# Copyright 2016 Pedro M. Baeza
# Copyright 2024 OERP Canada <https://www.oerp.ca>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import base64
import hashlib
import io
from random import randrange
from PIL import Image
import odoo
from odoo import api, fields, models, tools
from odoo.http import request
class ResCompany(models.Model):
_inherit = "res.company"
def _get_default_favicon(self, original=False):
img_path = odoo.tools.misc.file_path("web/static/img/favicon.ico")
with tools.file_open(img_path, "rb") as f:
if original:
return base64.b64encode(f.read())
# Modify the source image to add a colored bar on the bottom
# This could seem overkill to modify the pixels 1 by 1, but
# Pillow doesn't provide an easy way to do it, and this
# is acceptable for a 16x16 image.
color = (
randrange(32, 224, 24),
randrange(32, 224, 24),
randrange(32, 224, 24),
)
original = Image.open(f)
new_image = Image.new("RGBA", original.size)
height = original.size[1]
width = original.size[0]
bar_size = 1
for y in range(height):
for x in range(width):
pixel = original.getpixel((x, y))
if height - bar_size <= y + 1 <= height:
new_image.putpixel((x, y), (color[0], color[1], color[2], 255))
else:
new_image.putpixel(
(x, y), (pixel[0], pixel[1], pixel[2], pixel[3])
)
stream = io.BytesIO()
new_image.save(stream, format="ICO")
return base64.b64encode(stream.getvalue())
favicon = fields.Binary(
string="Company Favicon",
help="This field holds the image used to display favicon for a given company.",
default=_get_default_favicon,
)
@api.model_create_multi
def create(self, vals_list):
# add default favicon
for vals in vals_list:
if not vals.get("favicon"):
vals["favicon"] = self._get_default_favicon()
return super().create(vals_list)
# Get favicon from current company
@api.model
def _get_favicon(self):
"""Returns a local url that points to the image field of a given record."""
if self.env.context.get("website_id"):
website = self.env["website"].browse(self.env.context.get("website_id"))
return website.image_url(website, "favicon")
company_id = (
request.httprequest.cookies.get("cids")
if request.httprequest.cookies.get("cids")
else False
)
company = (
self.browse(int(company_id.split(",")[0])).sudo()
if company_id and self.browse(int(company_id.split(",")[0])).sudo().favicon
else False
)
if company:
sha = hashlib.sha512(str(company.write_date).encode("utf-8")).hexdigest()[
:7
]
return f"/web/image/{self._name}/{company.id}/favicon?unique={sha}"
else:
return False