【问题标题】:openerp server action - python codeopenerp 服务器操作 - python 代码
【发布时间】:2012-03-17 16:51:47
【问题描述】:

我不知道我是否应该在这里问这个问题(我现在想也许版主会将其移至 stackoverflow),但我在 openerp 或启动板论坛上没有得到答案。
在 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 代码”类型的对象“发票”创建一个服务器操作,该操作在菜单项的所有发票上执行此功能。在python代码框中,我写道:

inv = self.pool.get('account.invoice')
line_obj = self.pool.get('account.invoice.line')
for invoice in inv.browse(cr, uid, ids):
    for line in invoice.invoice_line:
        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})

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

编辑: 谁能帮我写一个更新所有发票行的函数,类似于 /account/wizard/account_invoice_state.py 中的那些?

【问题讨论】:

  • 你能更准确地说“它不起作用”部分吗?
  • 好吧,如果我在语法上犯了错误,我会在双击菜单项时得到相应的错误。现在它不会导致错误,所以它只被执行,发票不会改变。好像该功能在错误的地方执行并且没有应用于任何实际发票。希望我足够清楚
  • @3a2roub:你应用了什么样的调试?如果可能,您可以使用 print 等输出功能或 GUI 交互来跟踪函数以检查问题所在。
  • @NiklasB。对正在发生的事情进行一些调试的唯一方法是在 GUI 中使用 debug_sql 日志级别,正如您所知,单击一下会留下很长的输出。但是,没有显示错误,也许有人尝试将实际上通过按钮在表单中工作的函数update_invoice 转换为python代码类型的服务器操作会更容易。我确定我的在某种程度上是有缺陷的!我想我只需要正确的语法即可将这几行应用于所有发票上的所有行。
  • 你的函数在你按下按钮时被调用?

标签: python openerp


【解决方案1】:

如果我想在屏幕中的选定行上运行一些代码,我使用带有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 结合起来,这样就可以对列表中的选定记录执行:

<wizard
        id="wiz_sanity_checked"
        model="stock.move"
        string="Sanity Checked"
        name="promise.date.sanity.checked"
        keyword="client_action_multi"/>

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

【讨论】:

    【解决方案2】:

    在服务器操作中,您可以编写简单的 python 代码。您正在尝试使用 self.pool.get()。服务器操作不可能。请具体说明您的要求

    【讨论】:

    • 我意识到这就是为什么我专注于在 account_invoice_state.py 中编写一个类似于函数的函数: invoice_confirm 并因此从动作。现在只需正确修改上面提到的 update_invoice 函数,这就是我卡住的地方。我应该发布我试图模仿的示例函数吗?
    【解决方案3】:

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

    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()
    

    【讨论】:

    • 什么是pooler,您是如何定义它的?你导入了吗?或者它是您分配给其他东西的全局变量?
    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 2015-12-24
    • 2019-07-06
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    相关资源
    最近更新 更多