У меня есть модель, которая содержит родителя и несколько дочерних элементов.
Родитель имеет вычисляемое поле «product_remaining», которое обновляется после модификации другого поля в любом из дочерних элементов («lot_qty») ).
Поле "product_remaining" отображается в дереве для всех детей с использованием поля "related" в модели детей.
Все работает нормально, за исключением того, что дерево обновляется только поле «product_remaining» в строке, для которой было выполнено изменение, и оно не обновляет никакую другую строку.
Кроме того, если я щелкну, чтобы изменить строку, которая не была обновлена предыдущим изменением, и оставив без изменения, строка обновляется корректно.
Есть ли способ обновить / обновить sh все затронутые строки в древовидном представлении, а не только ту, в которой было сделано изменение?
Я использую Odoo v10.
Вот соответствующий код:
Python:
class Te2PackLotOperation(models.TransientModel):
_name = 'te2.pack.lot.operation'
parent_id = fields.Many2one('te2.pack.product.operation', readonly=True, ondelete='cascade')
product_id = fields.Many2one('product.product', 'Product', related='parent_id.product_id')
product_qty = fields.Float('Total', readonly=True, related='parent_id.product_qty')
product_remaining = fields.Float('Remaining', readonly=True, related='parent_id.product_remaining')
lot_id = fields.Many2one('stock.production.lot')
lot_qty = fields.Float('Done')
packing = fields.Char('Packing')
@api.onchange('lot_qty')
def onchange_lot_qty(self):
rec = self._origin
rec.write({'lot_qty': self.lot_qty})
class Te2PackProductOperation(models.TransientModel):
_name = 'te2.pack.product.operation'
product_id = fields.Many2one('product.product', 'Product', readonly=True)
product_qty = fields.Float('Total', readonly=True)
product_remaining = fields.Float('Remaining', readonly=True, stored=False, compute='_product_remaining_get')
lot_ids = fields.One2many('te2.pack.lot.operation', 'parent_id')
def _product_remaining_get(self):
for rec in self:
already_done = 0
for lot in rec.lot_ids:
already_done += lot.lot_qty
rec.product_remaining = rec.product_qty - already_done
XML:
<record id="te2_stock_picking_advanced_view_form" model="ir.ui.view">
<field name="name">te2.pack.operation.form</field>
<field name="model">te2.pack.product.operation</field>
<field name="arch" type="xml">
<form string="Advanced Stock Picking">
<field name="lot_ids">
<tree editable="bottom" create="false" delete="false"
decoration-danger="product_remaining!=0" decoration-success="product_remaining==0"
default_order="product_id">
<field name="product_id"/>
<field name="product_qty"/>
<field name="product_remaining"/>
<field name="lot_id"
domain="[('product_id','=', product_id)]"
/>
<field name="use_date"/>
<field name="lot_qty"/>
<field name="packing"/>
<button name="add_lot" string="Lot Split" type="object" icon="fa-list"/>
</tree>
</field>
<footer>
<button name="save" string="Save" type="object" class="oe_highlight" />
<button string="Cancel" class="oe_link" special="cancel"/>
</footer>
</form>
</field>
</record>