Odoo Help


This community 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.


Count Rows of one2many field - numbering positions

on 4/24/14, 2:11 AM 2,837 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 1 5
Rajkot, India
--Hardikgiri Goswami--

OpenERP/Odoo Customization/Integration Expert / Python Programmer

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.

Your Answer

Please try to give a substantial answer. If you wanted to comment on the question or answer, just use the commenting tool. Please remember that you can always revise your answers - no need to answer the same question twice. Also, please don't forget to vote - it really helps to select the best questions and answers!

About This Community

This community is for professionals and enthusiasts of our products and services. Read Guidelines

Question tools

0 follower(s)


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