0
votes

I have a function field that doesn't give any errors but then also doesn't set any values even when it should.

code:

class stock_move_custom(osv.osv):
_name = 'stock.move'
_inherit = 'stock.move'

def _penalty(self, cr, uid, ids, field_name, arg, context=None):
    if not ids: return {}
    res = {}
    for id in ids:
        res[id] = 20.0

    for line in self.browse(cr, uid, ids, context=context):
        if line.picking_id:
            if line.picking_id.purchase_id:
                if line.picking_id.purchase_id.penalty_id:
                    res[line.id] = 10.0
    return res     

    _columns = {
            'value_forpenalty': fields.float('Value', digits=(16,2)),
            'actual_penalty': fields.function(_penalty, type='float', digits=(16,2), string='Penalty', store=True, select=True)
            }
stock_move_custom()

Note: penalty_id is a many2one added to a custom child of purchase.order.

Q1. All I get is a 0 for penalty. Neither 20 nor 10. What could be wrong? If it is because of ids being blank, how do I get around that?

Q2. How do I pass the value_forpenalty to the the function as I will eventually need it to calculate the penalty? So when a user enters value for the value_forpenalty field in the form (and press a calculate button, or ideally without that), the value should get passed to the function for calculation.

Thanks

1

1 Answers

0
votes

I your code work as you accepted, no problem in your code.

Can you restart your server and check again.

for line in self.browse(cr, uid, ids, context=context):
        if line.picking_id and line.picking_id.purchase_id and line.picking_id.purchase_id.penalty_id:
            res[line.id] = 10.0

And passing your argument value_forpenalty, you can get this value in you function from line

like

    res[line.id] = line.value_forpenalty

Hope this helpful to you