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

时间:2015-05-19 11:00:20

标签: python-2.7 openerp-7

在membership .py文件中,类account_invoice_line将继承' account.invoice.line' 并覆盖写入方法,当新的发票行时,将创建新的成员行 在现有发票中创建。对我来说,当创建新的发票行时,它是不正确的 在现有发票中,它必须与现有成员行相关,而不是创建新成员行 所以我必须覆盖write方法,但始终执行member.py文件中的write方法的问题 。所以有人可以告诉我如何覆盖write方法而不通过membership.fe文件中的write方法。这是files.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()

1 个答案:

答案 0 :(得分:0)

你可以绕过调用super方法,如下所示。

您需要传递osv.osv类来调用直接写入方法,而不是您的类名。

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

它将绕过所有超级写入方法并直接调用osv.osv类。

注意:您也可以调用任何其他类而不是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

这里从这个类系统中直接调用account_invoice类的写方法。

我希望它会对你有所帮助。