действие сервера openerp - код Python - PullRequest
3 голосов
/ 17 марта 2012

Я не знаю, должен ли я задавать этот вопрос здесь (сейчас я думаю, что, возможно, модератор переместит его в 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», который выполняет эту функцию для всех счетов из пункта меню. в поле кода 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})

но это не работает. что я делаю не так?

EDIT: Может ли кто-нибудь помочь мне написать функцию, которая обновляет все строки счетов-фактур, аналогичные тем, которые указаны в /account/wizard/account_invoice_state.py?

Ответы [ 3 ]

1 голос
/ 28 марта 2012

Если я хочу запустить какой-то код в выбранных строках на экране, я использую мастер с client_action_multi.Вот мастер, которого я написал , который просто устанавливает флаг «проверено работоспособность» на складе:

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

I настроить мастера с client_action_multi, так чтоможет быть выполнена для выбранных записей в списке:

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

Чтобы запустить мастер, нажмите кнопку «Действие» в строке меню.

0 голосов
/ 28 марта 2012

Мне удалось успешно написать то, что мне нужно, вот оно:

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()
0 голосов
/ 21 марта 2012

В действии сервера вы можете написать простые коды Python. Вы пытаетесь использовать self.pool.get (). Это невозможно из-за действий сервера. И, пожалуйста, уточните ваше требование

...