继承多个模型并重写其中之一的方法

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 的原始代码完全相同。