Odoo Help


Count Rows of one2many field - numbering positions

on 4/24/14, 2:11 AM 4,871 views

I try to implement numbering positions in invoices. I got a field "position" in the one2many field and it looks like this

<field name="invoice_line" widget="one2many_list" context="{'type': type,'order_id':active_id}">
      <field name="position"/>

My class

class account_invoice_line(osv.osv):
    _inherit = 'account.invoice.line'
    _columns = {
        'position': fields.char('Position'),

    def position_number(self, cr, uid, context=None):
        return ACTUAL ROW NUMBER

    _defaults = {
        'position': lambda obj, cr, uid, context: obj.position_number(cr, uid, context),


I have no Idea how to get the actual row number or how to count the rows. I found this, but it's not working :-/

def _default_sequence(self, cr, uid, context=None):
        if context is None:
            context = {}
        max_sequence = 0
        if context.get('order_id'):
            sale_order_line_ids = self.search(cr, uid, [('order_id', '=', context['order_id'])])
            if sale_order_line_ids:
                max_sequence = max([line['position'] for line in self.read(cr, uid, sale_order_line_ids, ['position'])])
        return max_sequence + 1

    _defaults = {
        'sequence': lambda obj, cr, uid, context: obj._default_sequence(cr, uid, context),

Can anybody help me?


Hardikgiri Goswami

--Hardikgiri Goswami--
| 2 2 5
Rajkot, India
--Hardikgiri Goswami--

OpenERP/Odoo Customization/Integration Expert / Python Programmer

Email : hardikgiri.goswami@gmail.com

Skype ID : hardikgiri.goswami

Hardikgiri Goswami
On 4/24/14, 6:00 AM

I have do it using on_change attribute of order_line. I have made changes in xml like this.

<field name="order_line" on_change="update_seq(order_line)">

and the python side in sale.order added following method.

def update_seq(self, cr, uid, ids, order_line, context=None):
        new_order_line = []
        counter = 1
        for line in order_line:
            if line[0] in [1,4]:
                line[0] = 1
            if type(line[2]) == type({}):
                line[2] = {'seq':counter}
            counter = counter + 1
        return {'value': {'order_line': new_order_line} }

Just try it. and post here if any problem occurs.

Okay, I tried it, but I have the problem, that the onchange function won't be executed. So I have a field: <field name="position" on_change="position_number(cr, uid, context)"/> and a function "def position_number(self, cr, uid, context=None): print("bla")" but the function will not be executed. Why?

on 4/24/14, 8:11 PM

Because, from the XML part you can not pass cr, uid and context. These are the default parameter that OpenERP core will be pass automatically. That's is the only reason the method is not going to execute.

Hardikgiri Goswami
on 5/11/14, 4:30 AM
Kevin Kong
On 5/16/16, 11:43 PM

I just have an app to slove this problem. search rowno in app store.

About This Community

This platform is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.


Odoo Training Center

Access to our E-learning platform and experience all Odoo Apps through learning videos, exercises and Quizz.

Test it now

Question tools

0 follower(s)


Asked: 4/24/14, 2:11 AM
Seen: 4871 times
Last updated: 5/16/16, 11:43 PM