From 049205e5607e984d1c3d08762267b0386b931341 Mon Sep 17 00:00:00 2001 From: Patrick Tombez Date: Tue, 3 Nov 2020 11:36:50 +0100 Subject: [PATCH 1/4] [MIG] attachment_s3: Migration to 14.0 --- attachment_s3/__manifest__.py | 4 +- .../migrations/13.0.0.0.1/post-migration.py | 61 ------------------- attachment_s3/models/ir_attachment.py | 8 +-- 3 files changed, 5 insertions(+), 68 deletions(-) delete mode 100644 attachment_s3/migrations/13.0.0.0.1/post-migration.py diff --git a/attachment_s3/__manifest__.py b/attachment_s3/__manifest__.py index 6587650..35e1468 100644 --- a/attachment_s3/__manifest__.py +++ b/attachment_s3/__manifest__.py @@ -4,7 +4,7 @@ {'name': 'Attachments on S3 storage', 'summary': 'Store assets and attachments on a S3 compatible object storage', - 'version': '13.0.1.0.0', + 'version': "14.0.1.0.0", 'author': 'Camptocamp,Odoo Community Association (OCA)', 'license': 'AGPL-3', 'category': 'Knowledge Management', @@ -14,5 +14,5 @@ }, 'website': 'https://www.camptocamp.com', 'data': [], - 'installable': False, + 'installable': True, } diff --git a/attachment_s3/migrations/13.0.0.0.1/post-migration.py b/attachment_s3/migrations/13.0.0.0.1/post-migration.py deleted file mode 100644 index 0e3d96f..0000000 --- a/attachment_s3/migrations/13.0.0.0.1/post-migration.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright 2016-2019 Camptocamp SA -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) - -import logging -import os - -from contextlib import closing - -import odoo - -_logger = logging.getLogger(__name__) - - -def migrate(cr, version): - if not version: - return - cr.execute(""" - SELECT value FROM ir_config_parameter - WHERE key = 'ir_attachment.location' - """) - row = cr.fetchone() - bucket = os.environ.get('AWS_BUCKETNAME') - - if row[0] == 's3' and bucket: - uid = odoo.SUPERUSER_ID - registry = odoo.modules.registry.Registry(cr.dbname) - new_cr = registry.cursor() - with closing(new_cr): - with odoo.api.Environment.manage(): - env = odoo.api.Environment(new_cr, uid, {}) - store_local = env['ir.attachment'].search( - [('store_fname', '=like', 's3://%'), - '|', ('res_model', '=', 'ir.ui.view'), - ('res_field', 'in', ['image_small', - 'image_medium', - 'web_icon_data']) - ], - ) - - _logger.info( - 'Moving %d attachments from S3 to DB for fast access', - len(store_local) - ) - for attachment_id in store_local.ids: - # force re-storing the document, will move - # it from the object storage to the database - - # This is a trick to avoid having the 'datas' function - # fields computed for every attachment on each - # iteration of the loop. The former issue being that - # it reads the content of the file of ALL the - # attachments on each loop. - try: - env.clear() - attachment = env['ir.attachment'].browse(attachment_id) - _logger.info('Moving attachment %s (id: %s)', - attachment.name, attachment.id) - attachment.write({'datas': attachment.datas}) - new_cr.commit() - except: - new_cr.rollback() diff --git a/attachment_s3/models/ir_attachment.py b/attachment_s3/models/ir_attachment.py index 657cce7..8ce5f49 100644 --- a/attachment_s3/models/ir_attachment.py +++ b/attachment_s3/models/ir_attachment.py @@ -107,7 +107,7 @@ class IrAttachment(models.Model): return bucket @api.model - def _store_file_read(self, fname, bin_size=False): + def _store_file_read(self, fname): if fname.startswith('s3://'): s3uri = S3Uri(fname) try: @@ -120,10 +120,8 @@ class IrAttachment(models.Model): try: key = s3uri.item() bucket.meta.client.head_object( - Bucket=bucket.name, Key=key + Bucket=bucket.name, Key=key ) - if bin_size: - return bucket.Object(key).content_length with io.BytesIO() as res: bucket.download_fileobj(key, res) res.seek(0) @@ -135,7 +133,7 @@ class IrAttachment(models.Model): ) return read else: - return super()._store_file_read(fname, bin_size) + return super()._store_file_read(fname) @api.model def _store_file_write(self, key, bin_data): From 3655bce3ae282a0fa63ca234593c04e1e3fc0d8e Mon Sep 17 00:00:00 2001 From: Patrick Tombez Date: Tue, 3 Nov 2020 11:36:50 +0100 Subject: [PATCH 2/4] [MIG] attachment_swift: Migration to 14.0 --- attachment_swift/__manifest__.py | 4 ++-- attachment_swift/models/ir_attachment.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/attachment_swift/__manifest__.py b/attachment_swift/__manifest__.py index 69b247e..d78ea82 100644 --- a/attachment_swift/__manifest__.py +++ b/attachment_swift/__manifest__.py @@ -4,7 +4,7 @@ {'name': 'Attachments on Swift storage', 'summary': 'Store assets and attachments on a Swift compatible object store', - 'version': '13.0.1.0.0', + 'version': "14.0.1.0.0", 'author': 'Camptocamp,Odoo Community Association (OCA)', 'license': 'AGPL-3', 'category': 'Knowledge Management', @@ -17,5 +17,5 @@ }, 'website': 'https://www.camptocamp.com', 'data': [], - 'installable': False, + 'installable': True, } diff --git a/attachment_swift/models/ir_attachment.py b/attachment_swift/models/ir_attachment.py index bc81aca..f5b42de 100644 --- a/attachment_swift/models/ir_attachment.py +++ b/attachment_swift/models/ir_attachment.py @@ -121,7 +121,7 @@ class IrAttachment(models.Model): return conn @api.model - def _store_file_read(self, fname, bin_size=False): + def _store_file_read(self, fname): if fname.startswith('swift://'): swifturi = SwiftUri(fname) try: @@ -141,7 +141,7 @@ class IrAttachment(models.Model): 'Error reading object from Swift object store') return read else: - return super()._store_file_read(fname, bin_size) + return super()._store_file_read(fname) def _store_file_write(self, key, bin_data): if self._storage() == 'swift': From 4d665d96c166e22174bc5bbdc3fae69cac642e5d Mon Sep 17 00:00:00 2001 From: Patrick Tombez Date: Tue, 3 Nov 2020 11:36:50 +0100 Subject: [PATCH 3/4] [MIG] base_attachment_object_storage: Migration to 14.0 --- base_attachment_object_storage/__manifest__.py | 4 ++-- .../models/ir_attachment.py | 13 ++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/base_attachment_object_storage/__manifest__.py b/base_attachment_object_storage/__manifest__.py index d2b5777..e410519 100644 --- a/base_attachment_object_storage/__manifest__.py +++ b/base_attachment_object_storage/__manifest__.py @@ -4,13 +4,13 @@ {'name': 'Base Attachment Object Store', 'summary': 'Base module for the implementation of external object store.', - 'version': '13.0.1.1.0', + 'version': "14.0.1.0.0", 'author': 'Camptocamp,Odoo Community Association (OCA)', 'license': 'AGPL-3', 'category': 'Knowledge Management', 'depends': ['base'], 'website': 'http://www.camptocamp.com', 'data': ['data/res_config_settings_data.xml'], - 'installable': False, + 'installable': True, 'auto_install': True, } diff --git a/base_attachment_object_storage/models/ir_attachment.py b/base_attachment_object_storage/models/ir_attachment.py index 260c6ca..cd26db6 100644 --- a/base_attachment_object_storage/models/ir_attachment.py +++ b/base_attachment_object_storage/models/ir_attachment.py @@ -178,13 +178,13 @@ class IrAttachment(models.Model): return super()._get_datas_related_values(data, mimetype) @api.model - def _file_read(self, fname, bin_size=False): + def _file_read(self, fname): if self._is_file_from_a_store(fname): - return self._store_file_read(fname, bin_size=bin_size) + return self._store_file_read(fname) else: - return super()._file_read(fname, bin_size=bin_size) + return super()._file_read(fname) - def _store_file_read(self, fname, bin_size=False): + def _store_file_read(self, fname): storage = fname.partition('://')[0] raise NotImplementedError( 'No implementation for %s' % (storage,) @@ -202,16 +202,15 @@ class IrAttachment(models.Model): ) @api.model - def _file_write(self, value, checksum): + def _file_write(self, bin_data, checksum): location = self.env.context.get('storage_location') or self._storage() if location in self._get_stores(): - bin_data = base64.b64decode(value) key = self.env.context.get('force_storage_key') if not key: key = self._compute_checksum(bin_data) filename = self._store_file_write(key, bin_data) else: - filename = super()._file_write(value, checksum) + filename = super()._file_write(bin_data, checksum) return filename @api.model From 718c0372c066948296f23a282030ee6257d844a1 Mon Sep 17 00:00:00 2001 From: Patrick Tombez Date: Tue, 3 Nov 2020 11:36:51 +0100 Subject: [PATCH 4/4] [MIG] base_fileurl_field: Migration to 14.0 --- base_fileurl_field/__manifest__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/base_fileurl_field/__manifest__.py b/base_fileurl_field/__manifest__.py index 7bd94c1..2fe939e 100644 --- a/base_fileurl_field/__manifest__.py +++ b/base_fileurl_field/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base FileURL Field", "summary": "Implementation of FileURL type fields", - "version": "13.0.1.0.0", + "version": "14.0.1.0.0", "category": "Technical Settings", 'author': 'Camptocamp, Odoo Community Association (OCA)', 'license': 'AGPL-3', @@ -11,5 +11,5 @@ "base_attachment_object_storage", ], "auto_install": False, - "installable": False, + "installable": True, }