87 lines
2.9 KiB
Python
87 lines
2.9 KiB
Python
|
# Copyright 2017 Akretion (http://www.akretion.com).
|
||
|
# @author Sébastien BEAU <sebastien.beau@akretion.com>
|
||
|
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
|
||
|
|
||
|
import base64
|
||
|
import logging
|
||
|
|
||
|
import requests
|
||
|
|
||
|
from odoo import api, fields, models
|
||
|
from odoo.tools import ImageProcess
|
||
|
|
||
|
_logger = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
class StorageThumbnail(models.Model):
|
||
|
_name = "storage.thumbnail"
|
||
|
_description = "Storage Thumbnail"
|
||
|
_inherits = {"storage.file": "file_id"}
|
||
|
_default_file_type = "thumbnail"
|
||
|
|
||
|
size_x = fields.Integer("X size")
|
||
|
size_y = fields.Integer("Y size")
|
||
|
url_key = fields.Char(
|
||
|
"Url key", help="Specific URL key for generating the url of the image"
|
||
|
)
|
||
|
file_id = fields.Many2one("storage.file", "File", required=True, ondelete="cascade")
|
||
|
res_model = fields.Char(readonly=False, index=True)
|
||
|
res_id = fields.Integer(readonly=False, index=True)
|
||
|
|
||
|
def _prepare_thumbnail(self, image, size_x, size_y, url_key):
|
||
|
image_resize_format = (
|
||
|
self.env["ir.config_parameter"]
|
||
|
.sudo()
|
||
|
.get_param("storage.image.resize.format")
|
||
|
)
|
||
|
if image_resize_format:
|
||
|
extension = image_resize_format
|
||
|
else:
|
||
|
extension = image.extension
|
||
|
return {
|
||
|
"data": self._resize(image, size_x, size_y, extension),
|
||
|
"res_model": image._name,
|
||
|
"res_id": image.id,
|
||
|
"name": "%s_%s_%s%s"
|
||
|
% (url_key or image.filename, size_x, size_y, extension),
|
||
|
"size_x": size_x,
|
||
|
"size_y": size_y,
|
||
|
"url_key": url_key,
|
||
|
}
|
||
|
|
||
|
def _resize(self, image, size_x, size_y, fmt):
|
||
|
image_resize_server = (
|
||
|
self.env["ir.config_parameter"]
|
||
|
.sudo()
|
||
|
.get_param("storage.image.resize.server")
|
||
|
)
|
||
|
if image_resize_server and image.backend_id.served_by != "odoo":
|
||
|
values = {"url": image.url, "width": size_x, "height": size_y, "fmt": fmt}
|
||
|
url = image_resize_server.format(**values)
|
||
|
return base64.encodebytes(requests.get(url).content)
|
||
|
image_process = ImageProcess(image.data)
|
||
|
return image_process.resize(max_width=size_x, max_height=size_y).image_base64()
|
||
|
|
||
|
def _get_default_backend_id(self):
|
||
|
"""Choose the correct backend.
|
||
|
|
||
|
By default : it's the one configured as ir.config_parameter
|
||
|
Overload this method if you need something more powerfull
|
||
|
"""
|
||
|
return self.env["storage.backend"]._get_backend_id_from_param(
|
||
|
self.env, "storage.thumbnail.backend_id"
|
||
|
)
|
||
|
|
||
|
@api.model
|
||
|
def create(self, vals):
|
||
|
vals["file_type"] = self._default_file_type
|
||
|
if "backend_id" not in vals:
|
||
|
vals["backend_id"] = self._get_default_backend_id()
|
||
|
return super().create(vals)
|
||
|
|
||
|
def unlink(self):
|
||
|
files = self.mapped("file_id")
|
||
|
result = super().unlink()
|
||
|
files.unlink()
|
||
|
return result
|