Files
session_redis_public/attachment_s3/migrations/13.0.0.0.1/post-migration.py
T
Yannick Payot 9ca3f6a710 Change CI to GitHub actions
Use copier template from oca/oca-addons-repo-template

Target Python3.8

Apply linting

Fix a missing call to super
2023-05-24 16:09:11 +02:00

70 lines
2.4 KiB
Python

# 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 Exception:
new_cr.rollback()