Merge pull request #308 from camptocamp/14.0-fp-attachment_azure-containername

[14.0][IMP] attachment_azure: Write and read storage name along filename for extended usability
This commit is contained in:
Yannick Vaucher
2021-11-15 11:02:24 +01:00
committed by GitHub
co-authored by GitHub
2 changed files with 17 additions and 5 deletions
+3
View File
@@ -51,6 +51,9 @@ Activate Azure Blob storage:
One container will be created per database using the `RUNNING_ENV` environment variable One container will be created per database using the `RUNNING_ENV` environment variable
and the name of the database. By default, `RUNNING_ENV` is set to `dev`. and the name of the database. By default, `RUNNING_ENV` is set to `dev`.
The container name will also be stored in the database for each attachment,
and will be used to access the right container in the storage.
This addon must be added in the server wide addons with (``--load`` option): This addon must be added in the server wide addons with (``--load`` option):
``--load=web,attachment_azure`` ``--load=web,attachment_azure``
+13 -4
View File
@@ -127,7 +127,8 @@ class IrAttachment(models.Model):
return str.lower(storage_name)[:63] return str.lower(storage_name)[:63]
@api.model @api.model
def _get_azure_container(self): def _get_azure_container(self, container_name=None):
if not container_name:
container_name = self._get_container_name() container_name = self._get_container_name()
blob_service_client = self._get_blob_service_client() blob_service_client = self._get_blob_service_client()
container_client = blob_service_client.get_container_client(container_name) container_client = blob_service_client.get_container_client(container_name)
@@ -144,8 +145,12 @@ class IrAttachment(models.Model):
@api.model @api.model
def _store_file_read(self, fname, bin_size=False): def _store_file_read(self, fname, bin_size=False):
if fname.startswith("azure://"): if fname.startswith("azure://"):
container_client = self._get_azure_container()
key = fname.replace("azure://", "", 1).lower() key = fname.replace("azure://", "", 1).lower()
if '/' in key:
container_name, key = key.split('/')
else:
container_name = None
container_client = self._get_azure_container(container_name)
try: try:
blob_client = container_client.get_blob_client(key) blob_client = container_client.get_blob_client(key)
read = blob_client.download_blob().readall() read = blob_client.download_blob().readall()
@@ -161,11 +166,11 @@ class IrAttachment(models.Model):
location = self.env.context.get("storage_location") or self._storage() location = self.env.context.get("storage_location") or self._storage()
if location == "azure": if location == "azure":
container_client = self._get_azure_container() container_client = self._get_azure_container()
filename = "azure://%s/%s" % (container_client.container_name, key)
with io.BytesIO() as file: with io.BytesIO() as file:
blob_client = container_client.get_blob_client(key.lower()) blob_client = container_client.get_blob_client(key.lower())
file.write(bin_data) file.write(bin_data)
file.seek(0) file.seek(0)
filename = "azure://%s" % (key)
try: try:
blob_client.upload_blob(file, blob_type="BlockBlob") blob_client.upload_blob(file, blob_type="BlockBlob")
except ResourceExistsError: except ResourceExistsError:
@@ -184,8 +189,12 @@ class IrAttachment(models.Model):
@api.model @api.model
def _store_file_delete(self, fname): def _store_file_delete(self, fname):
if fname.startswith("azure://"): if fname.startswith("azure://"):
container_client = self._get_azure_container()
key = fname.replace("azure://", "", 1).lower() key = fname.replace("azure://", "", 1).lower()
if '/' in key:
container_name, key = key.split('/')
else:
container_name = None
container_client = self._get_azure_container(container_name)
# delete the file only if it is on the current configured container # delete the file only if it is on the current configured container
# otherwise, we might delete files used on a different environment # otherwise, we might delete files used on a different environment
try: try: