mirror of
https://github.com/camptocamp/odoo-cloud-platform.git
synced 2026-06-24 02:08:36 +00:00
feat: remove after method (#393)
* fix: azure reading in stream monkey patch documents
This commit is contained in:
co-authored by
GitHub
parent
988d4906bf
commit
fc452c6a2a
@@ -2,3 +2,4 @@
|
||||
# Copyright 2021 Open Source Integrators
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||
from . import ir_attachment
|
||||
from . import ir_binary
|
||||
|
||||
@@ -117,11 +117,8 @@ class IrAttachment(models.Model):
|
||||
https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata#container-names
|
||||
"""
|
||||
running_env = os.environ.get("RUNNING_ENV", "dev")
|
||||
storage_name = os.environ.get('AZURE_STORAGE_NAME', r'{env}-{db}')
|
||||
storage_name = storage_name.format(
|
||||
env=running_env,
|
||||
db=self.env.cr.dbname
|
||||
)
|
||||
storage_name = os.environ.get("AZURE_STORAGE_NAME", r"{env}-{db}")
|
||||
storage_name = storage_name.format(env=running_env, db=self.env.cr.dbname)
|
||||
# replace invalid characters by _
|
||||
storage_name = re.sub(r"[\W_]+", "-", storage_name)
|
||||
# lowercase, max 63 chars
|
||||
@@ -136,7 +133,7 @@ class IrAttachment(models.Model):
|
||||
except exceptions.UserError:
|
||||
_logger.exception(
|
||||
"error accessing to storage '%s' please check credentials ",
|
||||
container_name
|
||||
container_name,
|
||||
)
|
||||
return False
|
||||
container_client = blob_service_client.get_container_client(container_name)
|
||||
@@ -153,14 +150,14 @@ class IrAttachment(models.Model):
|
||||
def _store_file_read(self, fname, bin_size=False):
|
||||
if fname.startswith("azure://"):
|
||||
key = fname.replace("azure://", "", 1).lower()
|
||||
if '/' in key:
|
||||
container_name, key = key.split('/', 1)
|
||||
if "/" in key:
|
||||
container_name, key = key.split("/", 1)
|
||||
else:
|
||||
container_name = None
|
||||
container_client = self._get_azure_container(container_name)
|
||||
# if container cannot be retrived, abort reading from azure storage
|
||||
if not container_client:
|
||||
return ''
|
||||
return ""
|
||||
try:
|
||||
blob_client = container_client.get_blob_client(key)
|
||||
read = blob_client.download_blob().readall()
|
||||
@@ -200,13 +197,13 @@ class IrAttachment(models.Model):
|
||||
def _store_file_delete(self, fname):
|
||||
if fname.startswith("azure://"):
|
||||
key = fname.replace("azure://", "", 1).lower()
|
||||
if '/' in key:
|
||||
container_name, key = key.split('/', 1)
|
||||
if "/" in key:
|
||||
container_name, key = key.split("/", 1)
|
||||
else:
|
||||
container_name = None
|
||||
container_client = self._get_azure_container(container_name)
|
||||
if not container_client:
|
||||
return ''
|
||||
return ""
|
||||
# delete the file only if it is on the current configured container
|
||||
# otherwise, we might delete files used on a different environment
|
||||
try:
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
# Copyright 2016-2019 Camptocamp SA
|
||||
# Copyright 2021 Open Source Integrators
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||
from odoo import models
|
||||
from odoo.http import Stream
|
||||
|
||||
|
||||
class IrBinary(models.AbstractModel):
|
||||
_inherit = "ir.binary"
|
||||
_description = "File streaming helper model for controllers"
|
||||
|
||||
def _azure_stream(self, attachment):
|
||||
# we will create or own tream and return it
|
||||
stream_data = self.env["ir.attachment"]._store_file_read(attachment.store_fname)
|
||||
azurestream = Stream(
|
||||
type="data",
|
||||
data=stream_data,
|
||||
path=None,
|
||||
url=None,
|
||||
mimetype=attachment.mimetype or None,
|
||||
download_name=attachment.name,
|
||||
size=len(stream_data),
|
||||
etag=attachment.checksum,
|
||||
)
|
||||
return azurestream
|
||||
|
||||
def _record_to_stream(self, record, field_name):
|
||||
"""
|
||||
Low level method responsible for the actual conversion from a
|
||||
model record to a stream. This method is an extensible hook for
|
||||
other modules. It is not meant to be directly called from
|
||||
outside or the ir.binary model.
|
||||
|
||||
:param record: the record where to load the data from.
|
||||
:param str field_name: the binary field where to load the data
|
||||
from.
|
||||
:rtype: odoo.http.Stream
|
||||
"""
|
||||
if (
|
||||
record._name == "ir.attachment"
|
||||
and record.store_fname
|
||||
and record.store_fname.startswith("azure://")
|
||||
):
|
||||
# we will create or own tream and return it
|
||||
return self._azure_stream(record)
|
||||
elif (
|
||||
record._name == "documents.document"
|
||||
and record.attachment_id
|
||||
and record.attachment_id.store_fname
|
||||
and record.attachment_id.store_fname.startswith("azure://")
|
||||
):
|
||||
return self._azure_stream(record.attachment_id)
|
||||
|
||||
else:
|
||||
return super()._record_to_stream(record, field_name)
|
||||
|
||||
|
||||
# This part is used if the customer install tne enterprise module documents
|
||||
try:
|
||||
from odoo.addons import documents
|
||||
|
||||
documents.models.ir_binary.IrBinary._record_to_stream = IrBinary._record_to_stream
|
||||
except ImportError:
|
||||
# document enterprise module if not installed, we just ignore
|
||||
pass
|
||||
Reference in New Issue
Block a user