Динамические записи

Хотя XML позволяет создавать только * статические * записи, существует способ динамического создания записи с помощью кода Python. Например, вам нужны динамические записи, чтобы добавить поддержку для корпоративных и общественных выпусков или добавить некоторые записи для каждой компании в базе данных и т. Д.

Есть несколько способов выполнить код при установке:

  • СДЕЛАТЬ
  • СДЕЛАТЬ
  • СДЕЛАТЬ

Проблема с динамическими записями заключается в том, что odoo рассматривает такие записи как записи, которые были в XML-файлах, но теперь удалены. Это означает, что odoo удалит такие динамические записи сразу после обновления. Есть два способа решить это.

noupdate = False

Просто добавьте update = True в вашу запись `` ir.model.data``:

debt_account = registry['account.account'].create(cr, SUPERUSER_ID, {
    'name': 'Debt',
    'code': 'XDEBT',
    'user_type_id': registry.get('ir.model.data').get_object_reference(cr, SUPERUSER_ID, 'account', 'data_account_type_current_assets')[1],
    'company_id': company.id,
    'note': 'code "XDEBT" should not be modified as it is used to compute debt',
})
registry['ir.model.data'].create(cr, SUPERUSER_ID, {
    'name': 'debt_account_' + str(company.id),
    'model': 'account.account',
    'module': 'pos_debt_notebook',
    'res_id': debt_account,
    'noupdate': True,  # If it's False, target record (res_id) will be removed while module update
})

noupdate = True

Если по какой-то причине вы не можете использовать noupdate = False, вы можете использовать следующий трюк.

Вот пример из модуля `` web_debranding``. Для создания записей в `` ir.model.data`` мы используем имя `` _web_debranding``. Тогда odoo будет считать такие записи принадлежащими другому модулю (`` _web_debranding``) и не удалит их. Но это также означает, что odoo не удалит их после удаления. Для дальнейшего случая нам нужно использовать `` uninstall_hook``.

файл питона

from openerp import SUPERUSER_ID, models, tools, api

MODULE = '_web_debranding'

class view(models.Model):
    _inherit = 'ir.ui.view'

    def _create_debranding_views(self, cr, uid):

        self._create_view(cr, uid, 'menu_secondary', 'web.menu_secondary', '''
        <xpath expr="//div[@class='oe_footer']" position="replace">
           <div class="oe_footer"></div>
       </xpath>''')

    def _create_view(self, cr, uid, name, inherit_id, arch, noupdate=False, type='qweb'):
        registry = self.pool
        view_id = registry['ir.model.data'].xmlid_to_res_id(cr, SUPERUSER_ID, "%s.%s" % (MODULE, name))
        if view_id:
            registry['ir.ui.view'].write(cr, SUPERUSER_ID, [view_id], {
                'arch': arch,
            })
            return view_id

        try:
            view_id = registry['ir.ui.view'].create(cr, SUPERUSER_ID, {
                'name': name,
                'type': type,
                'arch': arch,
                'inherit_id': registry['ir.model.data'].xmlid_to_res_id(cr, SUPERUSER_ID, inherit_id, raise_if_not_found=True)
            })
        except:
            import traceback
            traceback.print_exc()
            return
        registry['ir.model.data'].create(cr, SUPERUSER_ID, {
            'name': name,
            'model': 'ir.ui.view',
            'module': MODULE,
            'res_id': view_id,
            'noupdate': noupdate,
        })
        return view_id

файл yaml

-
  !python {model: ir.ui.view}: |
    self._create_debranding_views(cr, uid)

__openerp__.py

'uninstall_hook': 'uninstall_hook',
'data': [
    'path/to/file.yml'
]

__init__.py

from openerp import SUPERUSER_ID

MODULE = '_web_debranding'
def uninstall_hook(cr, registry):
    registry['ir.model.data']._module_data_uninstall(cr, SUPERUSER_ID, [MODULE])