Динамические записи¶
Хотя 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
__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])