为什么科目模块升级了一些表上的解除链接记录? [英] Why is the account module upgrade unlinking records on some tables?

查看:27
本文介绍了为什么科目模块升级了一些表上的解除链接记录?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只是想确保升级baseaccount模块一切正常,因为如果我对模块进行新的更改,我希望将来升级数据库。

我已在模型account.acount.type上手动创建了新记录。但是,当我尝试升级account模块时,出现了写在此问题底部的异常。Odoo正试图从该模型中删除记录。为什么会发生这种情况?

我已经安装了Account模块,但是我没有从该表中删除任何记录,我只是添加了几个类型。因此expected behaviour of upgrading modules with data is

noupdate表示第二次升级此模块时,不会再次更新此记录。noupdate="1"内的记录将仅在安装时初始化。

提示:如果您删除了该记录,则下次更新系统将重新创建该记录。通常是那些有可能从前端修改的记录,给定内部noupdate=1。例如,自动调度程序记录。

<data noupdate="1">
    <!-- account.account.type -->
    <record model="account.account.type" id="data_account_type_receivable">
        <field name="name">Receivable</field>
        <field name="type">receivable</field>
        <field name="include_initial_balance" eval="True"/>
    </record>

    <!-- [...]  -->

这是升级账户模块时日志中出现的错误

2018-12-11 20:35:31,729 18018 INFO db_name odoo.addons.base.ir.ir_model: Deleting 59@account.account.type (l10n_es.account_type_third_parties)
2018-12-11 20:35:31,760 18018 ERROR db_name odoo.sql_db: bad query: b'DELETE FROM account_account_type WHERE id IN (59)'
ERROR: null value in column "user_type_id" violates not-null constraint
DETAIL:  Failing row contains (14927, Account name or description, null, 4, f, null, other, null, f, null, 1, null, 1, 2018-12-11 18:10:24.091826, 1, 2018-12-11 18:10:24.091826, t).
CONTEXT:  SQL statement "UPDATE ONLY "public"."account_account" SET "user_type_id" = NULL WHERE $1 OPERATOR(pg_catalog.=) "user_type_id""
2018-12-11 20:35:31,763 18018 WARNING db_name odoo.modules.loading: Transient module states were reset
2018-12-11 20:35:31,763 18018 ERROR db_name odoo.modules.registry: Failed to load registry
Traceback (most recent call last):
  File "/path/to/odoo/src/modules/registry.py", line 85, in new
    odoo.modules.load_modules(registry._db, force_demo, status, update_module)
  File "/path/to/odoo/src/modules/loading.py", line 414, in load_modules
    env['ir.model.data']._process_end(processed_modules)
  File "/path/to/odoo/src/linked/base/ir/ir_model.py", line 1628, in _process_end
    record.unlink()
  File "/path/to/odoo/src/models.py", line 2935, in unlink
    cr.execute(query, (sub_ids,))
  File "/path/to/odoo/src/sql_db.py", line 155, in wrapper
    return f(self, *args, **kwargs)
  File "/path/to/odoo/src/sql_db.py", line 232, in execute
    res = self._obj.execute(query, params)
psycopg2.IntegrityError: null value in column "user_type_id" violates not-null constraint
This is raised because the account type is being used by some account.

问题

  • 所以唯一的解决方案是使用现有的帐户类型,而不是创建新的帐户类型?

  • 源代码中是否有执行此解链操作的位置?有人知道吗?

  • 这是正常行为吗?

注意:我从头开始手动导入科目表

推荐答案

这应该是正常行为,特别是对于iiRC根本不是特殊型号的account.account.type

在模块更新时,Odoo总是删除不存在的外部ID的记录。此上下文中的非现有外部ID是什么?它们是系统中的外部ID,例如您的l10n_es.account_type_third_parties已不在模块中(此处为l10n_es)。

实际上,这对Odoo开发人员来说是非常重要的信息。我不确定它是否在文档中。

关于代码:正在发生here

@api.model
def _process_end(self, modules):
    """ Clear records removed from updated module data.
    This method is called at the end of the module loading process.
    It is meant to removed records that are no longer present in the
    updated data. Such records are recognised as the one with an xml id
    and a module in ir_model_data and noupdate set to false, but not
    present in self.loads.
    """
    if not modules or tools.config.get('import_partial'):
        return True

    bad_imd_ids = []
    self = self.with_context({MODULE_UNINSTALL_FLAG: True})

    query = """ SELECT id, name, model, res_id, module FROM ir_model_data
                WHERE module IN %s AND res_id IS NOT NULL AND noupdate=%s ORDER BY id DESC
            """
    self._cr.execute(query, (tuple(modules), False))
    for (id, name, model, res_id, module) in self._cr.fetchall():
        if (module, name) not in self.loads:
            if model in self.env:
                _logger.info('Deleting %s@%s (%s.%s)', res_id, model, module, name)
                record = self.env[model].browse(res_id)
                if record.exists():
                    record.unlink()
                else:
                    bad_imd_ids.append(id)
    if bad_imd_ids:
        self.browse(bad_imd_ids).unlink()
    self.loads.clear()

这篇关于为什么科目模块升级了一些表上的解除链接记录?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆