继承多个模型并重写其中之一的方法
Inherit multiple model and override method of one of them
我正在尝试覆盖 maintenance.request
中的 create
方法来发送我的模板(以通知维护团队成员有关新请求)。为此,我还需要继承 mail.thread
。这是我的问题。
我有 model.py
这样的:
class custom_maintenance_notify(models.Model):
_name = 'maintenance.request'
_inherit = ['maintenance.request','mail.thread']
@api.model
def create(self, vals):
record = super(MaintenanceRequest, self).create(vals)
template_id = self.env.ref('custom_maintenance.new_request_template').id
if template_id:
record.message_post_with_template(template_id)
return record
mail_template.xml
像这样:
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- <data noupdate="0"> -->
<data>
<record id="new_request_template" model="mail.template">
<field name="name">New maintenance request</field>
<field name="model_id" ref="maintenance.model_maintenance_request"/>
<field name="subject">New maintenance request - ${object.company_id.name}</field>
<field name="partner_to">${",".join(map(str, object.maintenance_team_id.member_ids.mapped('partner_id').ids))}</field>
<field name="body_html" type="xml">
<div>
Test
</div>
</field>
<field name="lang">${object.partner_id.lang}</field>
<field name="auto_delete" eval="False"/>
<field name="user_signature" eval="False"/>
</record>
</data>
</odoo>
和 _manifest_
像这样:
'depends': ['base','web','maintenance','mail'],
'data': [
# ...
'data/mail_template.xml',
],
当我尝试创建新的维护记录时出现此错误:
File "/usr/lib/python3/dist-packages/odoo/addons/custom_maintenance/models/models.py", line 35, in create
record = super(MaintenanceRequest, self).create(vals)
NameError: name 'MaintenanceRequest' is not defined
所以我尝试将 _name
更改为 MaintenanceRequest 但是这样我什至无法升级模型并且出现此错误:
ValueError: The _name attribute MaintenanceRequest is not valid.
重命名结果相同 class。
我该如何解决这个问题?
正如我在另一个问题中所写:
super
应使用 class 名称调用,在您的示例中为 custom_maintenance_notify
,或者因为您使用的是 Python 3,您可以简单地使用 super()
没有参数。
@api.model
def create(self, vals):
record = super().create(vals)
template_id = self.env.ref('custom_maintenance.new_request_template').id
if template_id:
record.message_post_with_template(template_id)
return record
而且即使你想覆盖mail.thread
的(其他语言中是抽象模型或接口)方法,你也不必再次继承:
class MaintenanceRequest(models.Model):
_inherit = 'maintenance.request'
# override a mail.thread method
@api.model
def message_new(self, msg_dict, custom_values=None):
res = super().message_new(msg_dict, custom_values)
# do stuff
return res
最后但同样重要的是:尽量遵守 Odoo 命名约定。这就是我在上面的示例中所做的:class 名称与 Odoo 的原始代码完全相同。
我正在尝试覆盖 maintenance.request
中的 create
方法来发送我的模板(以通知维护团队成员有关新请求)。为此,我还需要继承 mail.thread
。这是我的问题。
我有 model.py
这样的:
class custom_maintenance_notify(models.Model):
_name = 'maintenance.request'
_inherit = ['maintenance.request','mail.thread']
@api.model
def create(self, vals):
record = super(MaintenanceRequest, self).create(vals)
template_id = self.env.ref('custom_maintenance.new_request_template').id
if template_id:
record.message_post_with_template(template_id)
return record
mail_template.xml
像这样:
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- <data noupdate="0"> -->
<data>
<record id="new_request_template" model="mail.template">
<field name="name">New maintenance request</field>
<field name="model_id" ref="maintenance.model_maintenance_request"/>
<field name="subject">New maintenance request - ${object.company_id.name}</field>
<field name="partner_to">${",".join(map(str, object.maintenance_team_id.member_ids.mapped('partner_id').ids))}</field>
<field name="body_html" type="xml">
<div>
Test
</div>
</field>
<field name="lang">${object.partner_id.lang}</field>
<field name="auto_delete" eval="False"/>
<field name="user_signature" eval="False"/>
</record>
</data>
</odoo>
和 _manifest_
像这样:
'depends': ['base','web','maintenance','mail'],
'data': [
# ...
'data/mail_template.xml',
],
当我尝试创建新的维护记录时出现此错误:
File "/usr/lib/python3/dist-packages/odoo/addons/custom_maintenance/models/models.py", line 35, in create
record = super(MaintenanceRequest, self).create(vals)
NameError: name 'MaintenanceRequest' is not defined
所以我尝试将 _name
更改为 MaintenanceRequest 但是这样我什至无法升级模型并且出现此错误:
ValueError: The _name attribute MaintenanceRequest is not valid.
重命名结果相同 class。
我该如何解决这个问题?
正如我在另一个问题中所写:
super
应使用 class 名称调用,在您的示例中为 custom_maintenance_notify
,或者因为您使用的是 Python 3,您可以简单地使用 super()
没有参数。
@api.model
def create(self, vals):
record = super().create(vals)
template_id = self.env.ref('custom_maintenance.new_request_template').id
if template_id:
record.message_post_with_template(template_id)
return record
而且即使你想覆盖mail.thread
的(其他语言中是抽象模型或接口)方法,你也不必再次继承:
class MaintenanceRequest(models.Model):
_inherit = 'maintenance.request'
# override a mail.thread method
@api.model
def message_new(self, msg_dict, custom_values=None):
res = super().message_new(msg_dict, custom_values)
# do stuff
return res
最后但同样重要的是:尽量遵守 Odoo 命名约定。这就是我在上面的示例中所做的:class 名称与 Odoo 的原始代码完全相同。