关于 Odoo 模块从 v8 社区迁移到 v10 社区的疑虑——以及错误
Doubts about migration about Odoo modules from v8 to v10 community - and error
考虑这个方法:
@api.multi
def _get_loc_req(self): #, cr, uid, context=None
"""Get if a field is required or not by a Localization
@param uid: Integer value of the user
"""
context = dict(self._context or {})
res = True
ru_brw = self.pool.get('res.users').browse(
self.cr, uid, uid, context=context)
rc_obj = self.pool.get('res.company')
rc_brw = rc_obj.browse(self.cr, uid, ru_brw.company_id.id, context=context)
if rc_brw.country_id and rc_brw.country_id.code == 'VE' and \
rc_brw.printer_fiscal:
res = False
return res
如您所见,我添加了 @api.multi
注释 cr, uid, context=None
因为 multi 应该自动处理这些参数,对吗?
但是例如,如果我 运行 这段代码,它会抛出这个错误:
Traceback (most recent call last):
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 638, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 675, in dispatch
result = self._call_function(**self.params)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 331, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/service/model.py", line 119, in wrapper
return f(dbname, *args, **kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 324, in checked_call
result = self.endpoint(*a, **kw)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 933, in __call__
return self.method(*args, **kw)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 504, in response_wrap
response = f(*args, **kw)
File "/home/kristian/odoov10/odoo-10.0rc1c-20161005/odoo/addons/web/controllers/main.py", line 862, in call_kw
return self._call_kw(model, method, args, kwargs)
File "/home/kristian/odoov10/odoo-10.0rc1c-20161005/odoo/addons/web/controllers/main.py", line 854, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/api.py", line 679, in call_kw
return call_kw_model(method, model, args, kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/api.py", line 664, in call_kw_model
result = method(recs, *args, **kwargs)
File "/home/kristian/odoov10/odoo-10.0rc1c-20161005/odoo/addons/account/models/account_invoice.py", line 342, in create
invoice = super(AccountInvoice, self.with_context(mail_create_nolog=True)).create(vals)
File "/home/kristian/odoov10/odoo-10.0rc1c-20161005/odoo/addons/mail/models/mail_thread.py", line 227, in create
thread = super(MailThread, self).create(values)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/models.py", line 3778, in create
vals = self._add_missing_default_values(vals)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/models.py", line 1618, in _add_missing_default_values
defaults = self.default_get(list(missing_defaults))
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/models.py", line 1101, in default_get
defaults[name] = field.default(self)
File "/home/kristian/odoov10/gilda/l10n_ve_fiscal_requirements/model/invoice.py", line 61, in <lambda>
default=lambda s: s._get_loc_req(),
File "/home/kristian/odoov10/gilda/l10n_ve_fiscal_requirements/model/invoice.py", line 127, in _get_loc_req
self.cr, uid, uid, context=context)
AttributeError: 'account.invoice' object has no attribute 'cr'
在上面的方法中,我按照新的 api 将 cr
更改为 self.cr
,但没有成功,同样的错误,例如 self.pool.get
不应该是self.env
吗?还是可以一直这样?
一般来说,新 API 应该是什么样子?除了装饰器,还有 cr
statements?
我还有一个疑问,例如,这些方法可以这样声明:
@api.multi
def my_method(self):
return
但是如果最初有,cr, uid, ids, context
等,并且这些参数实际上在方法内部,(就像在上面的方法中一样)是否应该替换它们?它应该是什么样子?
我该如何解决这个问题?如果你能解释这些审问者也太棒了!
我觉得你的方法可以写成:
@api.model
def _get_loc_req(self):
company = self.env.user.company_id
if (company.country_id and company.country_id.code == 'VE' and
company.printer_fiscal):
return False
return True
关于您的第二个问题 - 在新的 API 中,无需明确传递 cr,
uid
、ids
和上下文 - cr
(self.env.cr
)、uid
(self.env.user
) 和 context
(self.env.context
) 通过环境 (self.env
) 和ids
的概念被替换为 record sets. Odoo 10 does not support the old API (pre version 8), so I would recommend spending some time for getting used to the new API: link, link, link, link. Also, you might take a look at the code of official Odoo addons for version 10.0 - 它们都是使用新的 API.
编写的
考虑这个方法:
@api.multi
def _get_loc_req(self): #, cr, uid, context=None
"""Get if a field is required or not by a Localization
@param uid: Integer value of the user
"""
context = dict(self._context or {})
res = True
ru_brw = self.pool.get('res.users').browse(
self.cr, uid, uid, context=context)
rc_obj = self.pool.get('res.company')
rc_brw = rc_obj.browse(self.cr, uid, ru_brw.company_id.id, context=context)
if rc_brw.country_id and rc_brw.country_id.code == 'VE' and \
rc_brw.printer_fiscal:
res = False
return res
如您所见,我添加了 @api.multi
注释 cr, uid, context=None
因为 multi 应该自动处理这些参数,对吗?
但是例如,如果我 运行 这段代码,它会抛出这个错误:
Traceback (most recent call last):
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 638, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 675, in dispatch
result = self._call_function(**self.params)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 331, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/service/model.py", line 119, in wrapper
return f(dbname, *args, **kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 324, in checked_call
result = self.endpoint(*a, **kw)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 933, in __call__
return self.method(*args, **kw)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/http.py", line 504, in response_wrap
response = f(*args, **kw)
File "/home/kristian/odoov10/odoo-10.0rc1c-20161005/odoo/addons/web/controllers/main.py", line 862, in call_kw
return self._call_kw(model, method, args, kwargs)
File "/home/kristian/odoov10/odoo-10.0rc1c-20161005/odoo/addons/web/controllers/main.py", line 854, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/api.py", line 679, in call_kw
return call_kw_model(method, model, args, kwargs)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/api.py", line 664, in call_kw_model
result = method(recs, *args, **kwargs)
File "/home/kristian/odoov10/odoo-10.0rc1c-20161005/odoo/addons/account/models/account_invoice.py", line 342, in create
invoice = super(AccountInvoice, self.with_context(mail_create_nolog=True)).create(vals)
File "/home/kristian/odoov10/odoo-10.0rc1c-20161005/odoo/addons/mail/models/mail_thread.py", line 227, in create
thread = super(MailThread, self).create(values)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/models.py", line 3778, in create
vals = self._add_missing_default_values(vals)
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/models.py", line 1618, in _add_missing_default_values
defaults = self.default_get(list(missing_defaults))
File "/home/kristian/.virtualenvs/odoov10/lib/python2.7/site-packages/odoo-10.0rc1c_20161005-py2.7.egg/odoo/models.py", line 1101, in default_get
defaults[name] = field.default(self)
File "/home/kristian/odoov10/gilda/l10n_ve_fiscal_requirements/model/invoice.py", line 61, in <lambda>
default=lambda s: s._get_loc_req(),
File "/home/kristian/odoov10/gilda/l10n_ve_fiscal_requirements/model/invoice.py", line 127, in _get_loc_req
self.cr, uid, uid, context=context)
AttributeError: 'account.invoice' object has no attribute 'cr'
在上面的方法中,我按照新的 api 将 cr
更改为 self.cr
,但没有成功,同样的错误,例如 self.pool.get
不应该是self.env
吗?还是可以一直这样?
一般来说,新 API 应该是什么样子?除了装饰器,还有 cr
statements?
我还有一个疑问,例如,这些方法可以这样声明:
@api.multi
def my_method(self):
return
但是如果最初有,cr, uid, ids, context
等,并且这些参数实际上在方法内部,(就像在上面的方法中一样)是否应该替换它们?它应该是什么样子?
我该如何解决这个问题?如果你能解释这些审问者也太棒了!
我觉得你的方法可以写成:
@api.model
def _get_loc_req(self):
company = self.env.user.company_id
if (company.country_id and company.country_id.code == 'VE' and
company.printer_fiscal):
return False
return True
关于您的第二个问题 - 在新的 API 中,无需明确传递 cr,
uid
、ids
和上下文 - cr
(self.env.cr
)、uid
(self.env.user
) 和 context
(self.env.context
) 通过环境 (self.env
) 和ids
的概念被替换为 record sets. Odoo 10 does not support the old API (pre version 8), so I would recommend spending some time for getting used to the new API: link, link, link, link. Also, you might take a look at the code of official Odoo addons for version 10.0 - 它们都是使用新的 API.