Q: Grouping and summing quantity lines with same product I have this function it filters in all selected MO's raw material lines, and then creates a report that is displayed in tree view.
But I have one problem, there can be allot lines with the same product. So my goal is to group all these lines and display them then just in one line with summed quantity.
Can someone help me with this?
class RawMaterialReport(models.Model):
    _name = 'raw.material.report'
    _description = 'Raw Material Report'

    product_id = fields.Many2one('product.product', string='Product', required=False)
    code = fields.Char(string='Code', required=True, readonly=True)
    total_qty = fields.Float(string='Total Qty', digits=(6, 2), readonly=True)
    virtual_qty = fields.Float(string='Forcasted Qty', digits=(6, 2), readonly=True)
    origin = fields.Char(string='Origin', required=True, readonly=True)
    production_id = fields.Many2one('mrp.production')


@api.multi
def open_raw_materials(self):
    self.search([]).unlink()
    mrp_productions = self._context.get('active_ids')
    mrp_production = self.env['mrp.production'].browse(mrp_productions)
    products_without_default_code = mrp_production.mapped('move_raw_ids').filtered(
        lambda x: not x.product_id.default_code
    )

    raws = mrp_production.mapped('move_raw_ids').sorted(
        key=lambda r: r.product_id.default_code
    )

    for r in raws:
        vals = {
            'product_id': r.product_id.id,
            'code': r.product_id.default_code,
            'total_qty': r.product_id.qty_available,
            'virtual_qty': r.product_id.virtual_available,
            'origin': r.reference,
            'production_id': r.raw_material_production_id.id,
        }
        self.create(vals)


A: Instead of creating the record directly, keep them in dictionary grouped by product ID and when ever you find that the product all ready have a record just sum its
quantity.
@api.multi
def open_raw_materials(self):
    self.search([]).unlink()
    mrp_productions = self._context.get('active_ids')
    mrp_production = self.env['mrp.production'].browse(mrp_productions)
    products_without_default_code = mrp_production.mapped('move_raw_ids').filtered(
        lambda x: not x.product_id.default_code
    )

    raws = mrp_production.mapped('move_raw_ids').sorted(
        key=lambda r: r.product_id.default_code
    )

    # to group by product
    recs = {}
    for r in raws:
        product_id = self.product_id.id
        if product_id in recs:
            # here just update the quantities or any other fields you want to sum
            recs[product_id]['product_uom_qty'] += self.product_id.product_uom_qty 
        else:
            # keep the record in recs
            recs[product_id] = {
                'product_id': r.product_id.id,
                'code': r.product_id.default_code,
                'total_qty': r.product_id.product_uom_qty,
                'virtual_qty': r.product_id.virtual_available,
                'origin': r.reference,
                'production_id': r.raw_material_production_id.id,
            }
    for vals in recs.values():
        # create records this will create a record by product
        self.create(vals)

