This question has been flagged

I am modifying Purchase module to add a new field in purchase order lines. I have successfully added the code to create model and view the custom field. But unable to add the custom field to total amount of the P.O. line.

class customPo(object):

    _inherit="purchase.order"
    _name = 'customPo'

    def _amount_all(self, cr, uid, ids, field_name, arg, context=None):
        res = {}
        cur_obj=self.pool.get('res.currency')
        for order in self.browse(cr, uid, ids, context=context):
            res[order.id] = {
                'amount_untaxed': 0.0,
                'amount_tax': 0.0,
                'amount_total': 0.0,
            }
            val = val1 = 0.0
            cur = order.pricelist_id.currency_id
            for line in order.order_line:
               # val1 += line.price_subtotal
               val1 = val1 + line.data + line.price_subtotal
               for c in self.pool.get('account.tax').compute_all(cr, uid, line.taxes_id, line.price_unit, line.product_qty, line.product_id, order.partner_id)['taxes']:
                    val += c.get('amount', 0.0)
            res[order.id]['amount_tax']=cur_obj.round(cr, uid, cur, 42.0)
            res[order.id]['amount_untaxed']=cur_obj.round(cr, uid, cur, val1)
            res[order.id]['amount_total']=res[order.id]['amount_untaxed'] + res[order.id]['amount_tax']
        return res

        _columns = {
            'order_line': fields.one2many('purchase.order.line', 'order_id', 'Order Lines', states={'approved':[('readonly',True)],'done':[('readonly',True)]}),
            'amount_untaxed': fields.function(_amount_all, digits_compute= dp.get_precision('Account'), string='Untaxed Amount',
                store={
                    'purchase.order.line': (_get_order, None, 10),
                }, multi="sums", help="The amount without tax", track_visibility='always'),
            'amount_tax': fields.function(_amount_all, digits_compute= dp.get_precision('Account'), string='Taxes',
                store={
                    'purchase.order.line': (_get_order, None, 10),
                }, multi="sums", help="The tax amount"),
            'amount_total': fields.function(_amount_all, digits_compute= dp.get_precision('Account'), string='Total',
                store={
                    'purchase.order.line': (_get_order, None, 10),
                }, multi="sums",help="The total amount"),
        }
customPo()

class customPol(osv.osv):
    _inherit = 'purchase.order.line'
    # _name = 'something.notpurchase'
    _columns = {
        'data': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Product Price')),
    }

customPol()

I have kept the tax static as 42 so, I can know when the overridden method is called but it never happens.

My view file is the following.

<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
        <record id="custom_purchse_wa" model="ir.ui.view">
            <field name="name">Custom Field New</field>
            <field name="model">purchase.order</field>
            <field name="inherit_id" ref="purchase.purchase_order_form"/>
            <field name="arch" type="xml">
                <xpath expr="/form/sheet/notebook/page/field[@name='order_line']/tree/field[@name='price_unit']" position="after">
                <field name="data" string="Custom field"/>
                </xpath>
            </field>
        </record>
</data>
</openerp>
Avatar
Discard

Ok, just some general things that need to be changed here: First of all _columns looks like its under the indentation of your _ammount_all function. this needs to be in the scope of the object, not the function. Its good form to declare these at the beginning of your class.

Best Answer

Change this:

class customPo(object):

_inherit="purchase.order"
_name = 'customPo'

And do this:

class customPo(osv.osv):

_inherit="purchase.order"
#_name = 'customPo'
Avatar
Discard
Author

wow I missed osv.osv! but after this edit it doesnt work, still the method from purchase.py is being called not my custom code.

Ashok, how were you expecting the method to be called? Is this an override of an existing method? or is it called on change of some field?

Author

it is override of existing method in purchase module. it is being called by the view <field name="model">purchase.order</field>

Author Best Answer

The _columns was indented to be inside the method which didnt made any columns therby breaking the method, fixed the indentation add one more dependent method and it worked.

Avatar
Discard
Best Answer
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
        <record id="custom_purchse_wa" model="ir.ui.view">
            <field name="name">Custom Field New</field>
            <field name="model">purchase.order</field>
            <field name="inherit_id" ref="purchase.purchase_order_form"/>
            <field name="arch" type="xml">
                <xpath expr="/form/sheet/notebook/page/field/tree[@string='Purchase Order Lines']/field[@name='price_unit']" position="after">
                <field name="data" string="Custom field"/>
            </xpath>
        </field>
    </record>

</data> </openerp>

Avatar
Discard
Author

still not working, in fact no changes at all..

ddi you run "update module" from the settings menu for your module?

Author

issue solved, the _columns was indented inside of the function and the fuction :/

Best Answer

use this

class purchase_order_line(osv.osv):
    _inherit = 'purchase.order.line'
    _columns = {
        'data': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Product Price')),
    }

purchase_order_line()

and add this in xml

<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
        <record id="custom_purchse_module_inherit" model="ir.ui.view">
            <field name="name">purchase.order.form</field>
            <field name="model">purchase.order</field>
            <field name="inherit_id" ref="purchase.purchase_order_form"/>
            <field name="arch" type="xml">
                <xpath expr="/form/sheet/notebook/page/field[@name='order_line']/tree[@string='Purchase Order Lines']/field[@name='price_unit']" position="after">
                <field name="data" string="Custom field"/>
            </xpath>
        </field>
    </record>

</data> </openerp>
Avatar
Discard
Author

Do you think changing names and ids will work?