You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
6.1 KiB
158 lines
6.1 KiB
# -*- coding: utf-8 -*-
|
|
# © 2016 Antiun Ingeniería S.L. - Jairo Llopis
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
|
|
from odoo import api, SUPERUSER_ID
|
|
import logging
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
def pre_init_hook_for_submodules(cr, model, field):
|
|
"""Moves images from single to multi mode.
|
|
|
|
Feel free to use this as a ``pre_init_hook`` for submodules.
|
|
|
|
:param str model:
|
|
Model name, like ``product.template``.
|
|
|
|
:param str field:
|
|
Binary field that had the images in that :param:`model`, like
|
|
``image``.
|
|
"""
|
|
env = api.Environment(cr, SUPERUSER_ID, {})
|
|
with cr.savepoint():
|
|
table = env[model]._table
|
|
column_exists = table_has_column(cr, table, field)
|
|
# fields.Binary(), extract the binary content directly from the table
|
|
if column_exists:
|
|
extract_query = """
|
|
SELECT id, '%(model)s', '%(model)s,' || id, 'db', %(field)s
|
|
FROM %(table)s
|
|
WHERE %(field)s IS NOT NULL
|
|
""" % {
|
|
"table": table,
|
|
"field": field,
|
|
"model": model,
|
|
}
|
|
image_field = 'file_db_store'
|
|
# fields.Binary(attachment=True), get the ir_attachment record ID
|
|
else:
|
|
extract_query = """
|
|
SELECT
|
|
res_id,
|
|
res_model,
|
|
CONCAT_WS(',', res_model, res_id),
|
|
'filestore',
|
|
id
|
|
FROM ir_attachment
|
|
WHERE res_field='%(field)s' AND res_model='%(model)s'
|
|
""" % {"model": model, "field": field}
|
|
image_field = 'attachment_id'
|
|
cr.execute(
|
|
"""
|
|
INSERT INTO base_multi_image_image (
|
|
owner_id,
|
|
owner_model,
|
|
owner_ref_id,
|
|
storage,
|
|
%s
|
|
)
|
|
%s
|
|
""" % (image_field, extract_query)
|
|
)
|
|
|
|
|
|
def uninstall_hook_for_submodules(cr, registry, model, field=None,
|
|
field_medium=None, field_small=None):
|
|
"""Moves images from multi to single mode and remove multi-images for a
|
|
given model.
|
|
|
|
:param odoo.sql_db.Cursor cr:
|
|
Database cursor.
|
|
|
|
:param odoo.modules.registry.RegistryManager registry:
|
|
Database registry, using v7 api.
|
|
|
|
:param str model:
|
|
Model technical name, like "res.partner". All multi-images for that
|
|
model will be deleted
|
|
|
|
:param str field:
|
|
Binary field that had the images in that :param:`model`, like
|
|
``image``.
|
|
|
|
:param str field_medium:
|
|
Binary field that had the medium-sized images in that :param:`model`,
|
|
like ``image_medium``.
|
|
|
|
:param str field_small:
|
|
Binary field that had the small-sized images in that :param:`model`,
|
|
like ``image_small``.
|
|
"""
|
|
env = api.Environment(cr, SUPERUSER_ID, {})
|
|
with cr.savepoint():
|
|
Image = env["base_multi_image.image"]
|
|
images = Image.search([("owner_model", "=", model)],
|
|
order="sequence, id")
|
|
if images and (field or field_medium or field_small):
|
|
main_images = {}
|
|
for image in images:
|
|
if image.owner_id not in main_images:
|
|
main_images[image.owner_id] = image
|
|
main_images = main_images.values()
|
|
Model = env[model]
|
|
Field = field and Model._fields[field]
|
|
FieldMedium = field_medium and Model._fields[field_medium]
|
|
FieldSmall = field_small and Model._fields[field_small]
|
|
# fields.Binary(), save the binary content directly to the table
|
|
if field and not Field.attachment \
|
|
or field_medium and not FieldMedium.attachment \
|
|
or field_small and not FieldSmall.attachment:
|
|
fields = []
|
|
if field and not Field.attachment:
|
|
fields.append(field + " = " + "%(image)s")
|
|
if field_medium and not FieldMedium.attachment:
|
|
fields.append(field_medium + " = " + "%(image_medium)s")
|
|
if field_small and not FieldSmall.attachment:
|
|
fields.append(field_small + " = " + "%(image_small)s")
|
|
query = """
|
|
UPDATE %(table)s
|
|
SET %(fields)s
|
|
WHERE id = %%(id)s
|
|
""" % {
|
|
"table": Model._table,
|
|
"fields": ", ".join(fields),
|
|
}
|
|
for main_image in main_images:
|
|
vars = {"id": main_image.owner_id}
|
|
if field and not Field.attachment:
|
|
vars["image"] = main_image.image_main
|
|
if field_medium and not FieldMedium.attachment:
|
|
vars["image_medium"] = main_image.image_medium
|
|
if field_small and not FieldSmall.attachment:
|
|
vars["image_small"] = main_image.image_small
|
|
cr.execute(query, vars)
|
|
# fields.Binary(attachment=True), save the ir_attachment record ID
|
|
if field and Field.attachment \
|
|
or field_medium and FieldMedium.attachment \
|
|
or field_small and FieldSmall.attachment:
|
|
for main_image in main_images:
|
|
owner = Model.browse(main_image.owner_id)
|
|
if field and Field.attachment:
|
|
Field.write(owner, main_image.image_main)
|
|
if field_medium and FieldMedium.attachment:
|
|
FieldMedium.write(owner, main_image.image_medium)
|
|
if field_small and FieldSmall.attachment:
|
|
FieldSmall.write(owner, main_image.image_small)
|
|
images.unlink()
|
|
|
|
|
|
def table_has_column(cr, table, field):
|
|
query = """
|
|
SELECT %(field)s
|
|
FROM information_schema.columns
|
|
WHERE table_name=%(table)s and column_name=%(field)s;
|
|
"""
|
|
cr.execute(query, {'table': table, 'field': field})
|
|
return bool(cr.fetchall())
|