Как я могу перенести старое двоичное поле Odoo в новые версии odoo с attachment = True? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть старая версия odoo (v6), и я перевожу ее на odoo-10. Проблема, с которой я сталкиваюсь, связана с миграцией данных в двоичном поле. Поскольку odoo-10 имеет атрибут «attachment = True», но для более старых версий этого не было. Итак, могу ли я получить небольшое представление от сообщества стеков о том, как я могу выполнить свою задачу и как я могу перенести эту таблицу postgres в odoo-10-совместимые данные. Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 15 апреля 2019

Просто перенесите данные как есть, пусть они существуют в базе данных. Мне пришлось написать модуль, чтобы выполнить то же требование, потому что у клиента были вложения в базе данных вместо использования вложения.

Следующий код работает, он не является официальным в приложениях моей компании в магазине приложений Odoo, но в конечном итоге найдет в нем свой путь; -)

from odoo import api, models, exceptions
from odoo.osv import expression


class IrAttachment(models.Model):
    """ Attachment Extensions"""

    _inherit = 'ir.attachment'

    @api.model
    def _relocate_binary_data(
            self, model=None, fields=None, domain=None, limit=0):
        """ Relocates binary data into attachments. This method
            has no functionality to reverse the process.

            Use this to change binary fields to attachment usage,
            which is done by using the parameter attachment=True

            @param model: Model Name (required)
            @param fields: List of binary field names (required)
            @param domain: optional search domain to filter treated records
                (default: []==no filter)
            @param limit: optional filter limit (default: 0==unlimited)"""
        if not model or not fields:
            raise exceptions.Warning(
                "model and fields are required parameters")
        # only touch records with binary data in one of the provided fields
        default_domain = [[(f, '!=', False)] for f in fields]
        default_domain = expression.OR(default_domain)
        domain = expression.AND([domain, default_domain])
        records = self.env[model].with_context(active_test=False).search(
            domain, limit=limit)
        # relocate the binary data to attachments
        for record in records:
            for field in fields:
                # search for existing attachments (for re-runs)
                attachment = records.env['ir.attachment'].sudo().search([
                    ('res_model', '=', record._name),
                    ('res_field', '=', field),
                    ('res_id', '=', record.id),
                ])
                # write the binary value to existing attachment or create one
                if attachment:
                    attachment.write({'datas': getattr(record, field)})
                else:
                    self.env['ir.attachment'].create({
                        'name': record.name,
                        'res_model': record._name,
                        'res_field': field,
                        'res_id': record.id,
                        'type': 'binary',
                        'datas': getattr(record, field)
                    })
        # empty the database binary data
        records.write({f: None for f in fields})

Вы должны написать ir.cron или ir.actions.server, чтобы использовать этот метод.

1 голос
/ 12 апреля 2019

Если вы посмотрите на функцию чтения для двоичного класса (<path_to_v12>/odoo/fields.py lines 1786-1800, цитируемое ниже), вы заметите, что он ищет в ir.attachment записи, имеющие правильную модель, поле и идентификатор.

def read(self, records):
    # values are stored in attachments, retrieve them
    assert self.attachment
    domain = [
        ('res_model', '=', records._name),
        ('res_field', '=', self.name),
        ('res_id', 'in', records.ids),
    ]
    # Note: the 'bin_size' flag is handled by the field 'datas' itself
    data = {att.res_id: att.datas
            for att in records.env['ir.attachment'].sudo().search(domain)}
    cache = records.env.cache
    for record in records:
        cache.set(record, self, data.get(record.id, False))

Итак, мое обоснованное предположение состоит в том, что вы можете обновить свои записи 'ir_attachment' и добавить res_model (обратите внимание, что это строка!), res_field (также строка) и res_id (это целое число сохраняется в поле id соответствующей записи).

0 голосов
/ 24 апреля 2019

Лучше всего использовать XMLRPC для чтения данных из SRC и записи данных в DEST. Который позаботится о вашей проблеме. Он будет считывать данные из двоичного поля при создании вложения, которое он будет хранить в файловой системе.

...