openerp服务器操作python cod

2024-04-25 13:14:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道我是否应该在这里问这个问题(我现在想也许主持人会把它移到stackoverflow),但我在openerp或launchpad论坛上没有得到答案。
在OpenERP 6.0.1中,当在发票窗体中放置一个按钮来执行它时,以下函数将执行它应该执行的操作:

class account_invoice(osv.osv):
    _inherit = "account.invoice"

    """ Function to update all lines on invoice """
    def update_invoice(self, cr, uid, ids, context=None):
        if context is None:
            context = {}
        line_obj = self.pool.get('account.invoice.line')
        invoice_ids = self.browse(cr, uid, ids, context)
        for invoice in invoice_ids:
            for line in invoice.invoice_line:
                if line.product_id:
                    res = line_obj.product_id_change(cr, uid, [line.id], (line.product_id and line.product_id.id or False), uom=(line.uos_id and line.uos_id.id or False), qty=(line.quantity or 0),
                name=(line.name or ''), type=(invoice.type or False), partner_id=invoice.partner_id.id, fposition_id=invoice.fiscal_position.id, price_unit=(line.price_unit or 0),
                address_invoice_id=(invoice.address_invoice_id and invoice.address_invoice_id.id or False), currency_id=(invoice.currency_id and invoice.currency_id.id or False), context=context)
                    price_unit = res['value']['price_unit']
                    discount = res['value']['discount']
                    line_obj.write(cr, uid, [line.id], {'price_unit': price_unit})
                    line_obj.write(cr, uid, [line.id], {'discount': discount})
        return True

    account_invoice()

这意味着在表单中单击此按钮时,发票行的价格单位和折扣将更新。在

我正在尝试为“python code”类型的对象“Invoice”创建一个服务器操作,该操作对菜单项中的所有发票执行此功能。在python代码框中,我写道:

^{pr2}$

但它不起作用。我做错什么了?在

编辑: 有人能帮我写一个更新所有发票行的函数吗?类似于/account/wizard/account_invoice中的行_状态.py? 在


Tags: oridfalseobjidsuidcontextline
3条回答

如果我想在屏幕中的选定行上运行一些代码,我将使用带有client_action_multi的向导。这里的a wizard I wrote只是在选股时设置了一个“健全检查”标志:

import wizard
import pooler

def _set_flags(self, cr, uid, data, context):
    stock_picking_obj = pooler.get_pool(cr.dbname).get('stock.picking')

    move_ids = data['ids']
    picking_ids = stock_picking_obj.search(
        cr,
        uid,
        [('move_lines', 'in', move_ids)])
    stock_picking_obj.write(cr, uid, picking_ids, {'sanity_checked': True})
    return {}

class sanity_checked(wizard.interface):
    states = {
        'init': {
            'actions': [_set_flags],
            'result': {'type': 'state', 'state':'end'}
        },
    }
sanity_checked('promise.date.sanity.checked')

configure the wizardclient_action_multi一起使用,以便可以在列表中的选定记录上执行它:

^{pr2}$

要实际运行向导,请单击菜单栏中的“操作”按钮。在

在服务器操作中,您可以编写简单的python代码。。你想用self.pool.get(). 从服务器上是不可能的行动。和请具体说明你的要求

我成功地写出了我需要的东西,这里是:

class account_invoice_update(osv.osv_memory):

_name = "account.invoice.update"

""" Function to update all lines on selected invoice(s) """
def invoice_update(self, cr, uid, ids, context=None):
    if context is None:
        context = {}

    pool_obj = pooler.get_pool(cr.dbname)
    data_inv = pool_obj.get('account.invoice').read(cr, uid, context['active_ids'], ['state'], context=context)

    for record in data_inv:
        if record['state'] in ('cancel','paid','open'):
            raise osv.except_osv(_('Warning'), _("Selected Invoice(s) cannot be cancelled as they are already in 'Cancelled','Done', or 'Open' state!"))

    inv_obj = self.pool.get('account.invoice')
    inv_line_obj = self.pool.get('account.invoice.line')
    for invoice in inv_obj.browse(cr, uid, context.get('active_ids'), context=context):
        for line in invoice.invoice_line:
            res = inv_line_obj.product_id_change(cr, uid, [line.id], (line.product_id and line.product_id.id or False), uom=(line.uos_id and line.uos_id.id or False), qty=(line.quantity or 0), name=(line.name or ''), type=(invoice.type or False), partner_id=invoice.partner_id.id, fposition_id=invoice.fiscal_position.id, price_unit=(line.price_unit or 0), address_invoice_id=(invoice.address_invoice_id and invoice.address_invoice_id.id or False), currency_id=(invoice.currency_id and invoice.currency_id.id or False), context=context)
            price_unit = res['value']['price_unit']
            discount = res['value']['discount']
            inv_line_obj.write(cr, uid, [line.id], {'price_unit': price_unit})
            inv_line_obj.write(cr, uid, [line.id], {'discount': discount})

    return {'type': 'ir.actions.act_window_close'}

account_invoice_update()

相关问题 更多 >