Почему модуль учетной записи обновляет несвязанные записи в некоторых таблицах? - PullRequest
0 голосов
/ 12 декабря 2018

Я просто хотел убедиться, что при обновлении модуля base или account все работает нормально, потому что, если я внесу новые изменения в модуль, я хочу обновить базу данных в будущем.

Iсоздали новые записи вручную на модели account.acount.type.Но когда я пытаюсь обновить модуль account, возникает исключение, написанное внизу этого вопроса.Odoo пытается удалить записи из этой модели.Почему это происходит?

Я установил модуль учетной записи, но я не удалил ни одной записи из этой таблицы, я только добавил еще несколько типов.Таким образом, ожидаемое поведение при обновлении модулей с данными : :

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.

Вопросы

  • Так что единственноерешение состоит в том, чтобы использовать уже существующие типы учетных записей вместо создания новых?

  • Есть ли место в исходном коде, где выполняется это действие отмены связи?Кто-нибудь знает?

  • Это нормальное поведение?

Примечание : я импортировал план счетов вручнуюс нуля

1 Ответ

0 голосов
/ 12 декабря 2018

Это должно быть нормальным поведением, особенно для account.account.type, который IIRC вообще не является специальной моделью.

При обновлении модуля odoo всегда удаляет записи для несуществующих внешних идентификаторов.Что такое несуществующие внешние идентификаторы в этом контексте?Это внешние идентификаторы в системе, например ваши l10n_es.account_type_third_parties, которых больше нет в модуле (здесь l10n_es).

На самом деле это очень важная информация для разработчиков odoo.Я не уверен, что это в документации.

И насчет кода: это происходит здесь

@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()
...