Merge pull request #314 from camptocamp/10.0-bp-attachment_azure-containername

[10.0][IMP] attachment_azure: Write and read storage name along filename for extended usability
This commit is contained in:
Yannick Vaucher authored and GitHub committed 2021-11-15 16:03:53 +01:00
commit 78301ff808
2 files changed
+17 -5

No files matched your search

+3
View File
@@ -27,6 +27,9 @@ The container name can be overridden with environment variable ``AZURE_STORAGE_N
The strings ``{db}`` and ``{env}`` can be used inside that variable and the values
will be replaced respectively by the database name and environment name.
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):
``--load=web,attachment_azure``
+14 -5
View File
@@ -129,8 +129,9 @@ class IrAttachment(models.Model):
return str.lower(storage_name)[:63]
@api.model
def _get_azure_container(self):
container_name = self._get_container_name()
def _get_azure_container(self, container_name=None):
if not container_name:
container_name = self._get_container_name()
blob_service_client = self._get_blob_service_client()
container_client = blob_service_client.get_container_client(container_name)
try:
@@ -146,8 +147,12 @@ class IrAttachment(models.Model):
@api.model
def _store_file_read(self, fname, bin_size=False):
if fname.startswith("azure://"):
container_client = self._get_azure_container()
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:
blob_client = container_client.get_blob_client(key)
if bin_size:
@@ -166,11 +171,11 @@ class IrAttachment(models.Model):
location = self.env.context.get("storage_location") or self._storage()
if location == "azure":
container_client = self._get_azure_container()
filename = "azure://%s/%s" % (container_client.container_name, key)
with io.BytesIO() as file:
blob_client = container_client.get_blob_client(key.lower())
file.write(bin_data)
file.seek(0)
filename = "azure://%s" % (key)
try:
blob_client.upload_blob(file, blob_type="BlockBlob")
except ResourceExistsError:
@@ -189,8 +194,12 @@ class IrAttachment(models.Model):
@api.model
def _store_file_delete(self, fname):
if fname.startswith("azure://"):
container_client = self._get_azure_container()
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
# otherwise, we might delete files used on a different environment
try:
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.