mirror of
https://github.com/camptocamp/odoo-cloud-platform.git
synced 2026-06-23 18:04:34 +00:00
[MIG] attachment_s3: Migration to 14.0
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
{'name': 'Attachments on S3 storage',
|
{'name': 'Attachments on S3 storage',
|
||||||
'summary': 'Store assets and attachments on a S3 compatible object 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)',
|
'author': 'Camptocamp,Odoo Community Association (OCA)',
|
||||||
'license': 'AGPL-3',
|
'license': 'AGPL-3',
|
||||||
'category': 'Knowledge Management',
|
'category': 'Knowledge Management',
|
||||||
@@ -14,5 +14,5 @@
|
|||||||
},
|
},
|
||||||
'website': 'https://www.camptocamp.com',
|
'website': 'https://www.camptocamp.com',
|
||||||
'data': [],
|
'data': [],
|
||||||
'installable': False,
|
'installable': True,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
|
||||||
@@ -107,7 +107,7 @@ class IrAttachment(models.Model):
|
|||||||
return bucket
|
return bucket
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _store_file_read(self, fname, bin_size=False):
|
def _store_file_read(self, fname):
|
||||||
if fname.startswith('s3://'):
|
if fname.startswith('s3://'):
|
||||||
s3uri = S3Uri(fname)
|
s3uri = S3Uri(fname)
|
||||||
try:
|
try:
|
||||||
@@ -120,10 +120,8 @@ class IrAttachment(models.Model):
|
|||||||
try:
|
try:
|
||||||
key = s3uri.item()
|
key = s3uri.item()
|
||||||
bucket.meta.client.head_object(
|
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:
|
with io.BytesIO() as res:
|
||||||
bucket.download_fileobj(key, res)
|
bucket.download_fileobj(key, res)
|
||||||
res.seek(0)
|
res.seek(0)
|
||||||
@@ -135,7 +133,7 @@ class IrAttachment(models.Model):
|
|||||||
)
|
)
|
||||||
return read
|
return read
|
||||||
else:
|
else:
|
||||||
return super()._store_file_read(fname, bin_size)
|
return super()._store_file_read(fname)
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _store_file_write(self, key, bin_data):
|
def _store_file_write(self, key, bin_data):
|
||||||
|
|||||||
Reference in New Issue
Block a user