如何在不执行超级写入的情况下覆盖写入方法?

How can override write method without executing the super write?

在membership.py文件中,class account_invoice_line继承了'account.invoice.line'并覆盖了write方法,该方法将在新的发票行创建时创建一个新的成员行在现有发票中创建。对我来说,当在现有发票中创建新的发票行时,它是不正确的,它必须与现有的成员行相关,而不是创建新的成员行 所以我必须覆盖write方法,但是member.py文件中的write方法总是被执行的问题。

那么有人能告诉我如何在不通过 membership.py 文件中的写入方法的情况下覆盖写入方法吗?

这是文件 membership.py 中的代码:

class account_invoice_line(osv.osv):
_inherit='account.invoice.line'

def write(self, cr, uid, ids, vals, context=None):
    """Overrides orm write method
    """
    member_line_obj = self.pool.get('membership.membership_line')
    res = super(account_invoice_line, self).write(cr, uid, ids, vals, context=context)
    for line in self.browse(cr, uid, ids, context=context):
        if line.invoice_id.type == 'out_invoice':
            ml_ids = member_line_obj.search(cr, uid, [('account_invoice_line', '=', line.id)], context=context)
            if line.product_id and line.product_id.membership and not ml_ids:
                # Product line has changed to a membership product
                date_from = line.product_id.membership_date_from
                date_to = line.product_id.membership_date_to
                if line.invoice_id.date_invoice > date_from and line.invoice_id.date_invoice < date_to:
                    date_from = line.invoice_id.date_invoice
                member_line_obj.create(cr, uid, {
                                'partner': line.invoice_id.partner_id.id,
                                'membership_id': line.product_id.id,
                                'member_price': line.price_unit,
                                'date': time.strftime('%Y-%m-%d'),
                                'date_from': date_from,
                                'date_to': date_to,
                                'account_invoice_line': line.id,
                                }, context=context)
            if line.product_id and not line.product_id.membership and ml_ids:
                # Product line has changed to a non membership product
                member_line_obj.unlink(cr, uid, ml_ids, context=context)
    return res

def unlink(self, cr, uid, ids, context=None):
    """Remove Membership Line Record for Account Invoice Line
    """
    member_line_obj = self.pool.get('membership.membership_line')
    for id in ids:
        ml_ids = member_line_obj.search(cr, uid, [('account_invoice_line', '=', id)], context=context)
        member_line_obj.unlink(cr, uid, ml_ids, context=context)
    return super(account_invoice_line, self).unlink(cr, uid, ids, context=context)

def create(self, cr, uid, vals, context=None):
    """Overrides orm create method
    """
    member_line_obj = self.pool.get('membership.membership_line')
    result = super(account_invoice_line, self).create(cr, uid, vals, context=context)
    line = self.browse(cr, uid, result, context=context)
    if line.invoice_id.type == 'out_invoice':
        ml_ids = member_line_obj.search(cr, uid, [('account_invoice_line', '=', line.id)], context=context)
        if line.product_id and line.product_id.membership and not ml_ids:
            # Product line is a membership product
            date_from = line.product_id.membership_date_from
            date_to = line.product_id.membership_date_to
            if line.invoice_id.date_invoice > date_from and line.invoice_id.date_invoice < date_to:
                date_from = line.invoice_id.date_invoice
            member_line_obj.create(cr, uid, {
                        'partner': line.invoice_id.partner_id and line.invoice_id.partner_id.id or False,
                        'membership_id': line.product_id.id,
                        'member_price': line.price_unit,
                        'date': time.strftime('%Y-%m-%d'),
                        'date_from': date_from,
                        'date_to': date_to,
                        'account_invoice_line': line.id,
                    }, context=context)
    return result

account_invoice_line()

你可以像下面这样绕过超级方法的调用。

您需要传递 osv.osv class 而不是您的 class 名称来调用直接基本写入方法。

res = super(osv.osv, self).write(cr, uid, ids, vals, context=context)

会绕过osv.osvclass.

的all super write方法直接调用

注意:您也可以调用任何其他 class 而不是 osv.osv。为此,您必须按照以下方式进行操作。

例如

from openerp.addons.account.account_invoice import account_invoice


class account_invoice_inherit(osv.osv):
def write( . .. . )

    res = super(account_invoice,self).write(. .. .)

    . .. .

    return res

这里从这个class系统会直接调用account_invoiceclass的write方法。

希望对您有所帮助。