How to Implement enumerate() in Odoo?

What is enumerate()?

Python's enumerate() function adds a counter/index to an iterable (like a list or recordset), allowing you to loop with both index and value.


✅ Syntax

for index, value in enumerate(iterable, start=0):

    # use index and value

  • iterable: A list, tuple, or Odoo recordset.
  • start: Optional index to start counting from (default is 0).



📌 Realistic Use Cases in Odoo


1. Numbering Items in a List (e.g., in Report or Email Body)

Suppose you're preparing a message with numbered order lines:


body = "Order Lines:\n"

for idx, line in enumerate(self.order_line, start=1):

    body += f"{idx}. {line.product_id.name} - Qty: {line.product_uom_qty}\n"

self.message_post(body=body)


This creates a structured, user-friendly message with line numbers.


2. Generate Indexed Data in Excel Export

When exporting product lines to Excel:​


row = 2

for idx, line in enumerate(order.order_line, start=1):

    sheet.write(row, 0, idx)  # Serial number

    sheet.write(row, 1, line.product_id.name)

    sheet.write(row, 2, line.product_uom_qty)

    row += 1


You provide a clear, indexed list in the export file.


 3. Detecting First Record in a Loop

Sometimes you need to treat the first item differently:


for idx, partner in enumerate(partners):

    if idx == 0:

        _logger.info("Primary partner: %s", partner.name)

    else:

        _logger.info("Secondary partner: %s", partner.name)


✅ Summary Table


Function

Purpose

Example Use Case

enumerate()

Loop with index and value

Numbering order lines, Excel serials

start parameter

Set custom starting index

Start from 1 instead of 0