【问题标题】:How to unlink One2many Field values on onchange in Odoo如何在 Odoo 中取消链接 onchange 上的 One2many 字段值
【发布时间】:2017-02-17 06:07:25
【问题描述】:

我创建了一个模块来根据客户将销售订单行添加到采购订单行。

Selecting customer

当我添加销售订单时,它将添加到采购订单中。

SO added

我试图从 one2many 字段中取消链接特定 ID。在图片中添加 SO 字段

    class PurchaseOrder(models.Model):
    _inherit= "purchase.order"
    _name = "purchase.order"


    order_ids = fields.Many2many('sale.order', String="Add Order",domain="[('partner_id', 'child_of', partner_id),('state', 'in', ('quotation','socreated','done'))]")




    @api.onchange('order_ids')
    def orders_change(self):
        if not self.order_ids:
            return {}
        if not self.partner_customer_id:
            warning = {
                'title': _('Warning!'),
                'message': _('You must first select a partner!'),
            }
            # self.order_ids =False
            return {'warning': warning}

        line_ids = [] 

        u_ids=[]

        new_lines = self.env['purchase.order.line']


        for qt in self.order_ids:
            for i in self.order_line.mapped('sale_order_id'):

                line_ids.append(i)

            for u in self.order_ids:
                if u.id in line_id:
                    u_ids.append(u)
                    line_ids.remove(u)


            if line_ids and u_ids:
                lp = self.order_line.filtered(lambda r: r.sale_order_id <= line_ids[0])
                lp2 = self.order_line.filtered(lambda r: r.sale_order_id <= u_ids[0])


                for line in self.order_line:
                    if line in lp:
                        # self.order_line = [(6, 0, lp2.ids)]

                        line.unlink()

                continue



            for line in qt.order_line:
                # Load a PO line only once
                if line in self.order_line.mapped('sale_order_line_id'):
                    continue


                #seller section
                seller = line.product_id._select_seller(
                    line.product_id,
                    partner_id=self.partner_id,
                    quantity=line.product_uom_qty,
                    date=self.date_order and self.date_order[:10],
                    uom_id=line.product_uom)

                price_unit = self.env['account.tax']._fix_tax_included_price(seller.price,
                                                                             line.product_id.supplier_taxes_id,
                                                                             line.tax_id) if seller else 0.0
                if price_unit and seller and self.currency_id and seller.currency_id != self.currency_id:
                    price_unit = seller.currency_id.compute(price_unit, self.currency_id)

                if seller and line.product_uom and seller.product_uom != line.product_uom:
                    price_unit = self.env['product.uom']._compute_price(seller.product_uom.id, price_unit,
                                                                        to_uom_id=line.product_uom.id)
                unit = price_unit

                qty = line.product_uom_qty
                if float_compare(qty, 0.0, precision_rounding=line.product_uom.rounding) <= 0:
                    qty = 0.0
                tax_id = line.tax_id or line.product_id.taxes_id

                data = {
                    'sale_order_line_id': line.id,
                    'name': line.name,
                    'sequence_number':line.sequence_number,
                    'product_id': line.product_id.id,
                    'product_qty': qty,
                    'product_uom': line.product_id.uom_po_id or line.product_id.uom_id,
                    'price_unit': unit,
                    'cpo_no' : line.order_id.cpo_number,
                    'cpo_product_qty': qty,
                    'cpo_product_uom': line.product_id.uom_id,
                    'cpo_price_unit': line.price_unit,
                    'discount': 0.0,
                    'date_planned':(datetime.today() + relativedelta(weeks=4)).strftime(DEFAULT_SERVER_DATETIME_FORMAT),

                }
                new_line = new_lines.new(data)
                new_line._set_additional_fields(self)
                new_lines += new_line
        if new_lines :
            self.order_line += new_lines



class PurchaseOrderLine(models.Model):
    _inherit= "purchase.order.line"
    _name = "purchase.order.line"

    sale_order_line_id = fields.Many2one('sale.order.line', 'Order Line', ondelete='set null', select=True
                                        )

    sale_order_id = fields.Many2one('sale.order', related='sale_order_line_id.order_id', string='Order',
                                   store=False)

当我删除 order_ids 时,我想从 order_line (po) 中取消相关行的链接

link_ids 将在它被选中时保存 order_ids,当一个 id 从 order_ids 中删除时,它将从 link_ids 中删除。 u_ids 将在 order_id 删除时保留其余部分。

当我从 order_ids 中删除一个 id 时,我想从 order_line 中取消相关行的链接

但我不能删除它。

我有用户 [6,0,ids] 方法来替换值,它不会在创建状态下工作。 请帮帮我。

【问题讨论】:

  • 当您更改 order_ids 时,所选 SO 的行会正常添加,但当您删除它时,行不会?
  • 是的。如果我从 order_ids 中删除任何添加的 id,我想从 order_line 中删除其行
  • 尝试使用 [(5,0,0)] 删除每条记录,然后添加 ID。这对我有用,但唯一的问题是,如果其他字段触发 onchange 方法不是相同的 many2many 或 one2many 字段,它会起作用
  • 但是 [(5,0,0)] 在 create() 中不起作用,对吧?
  • 如果您没有找到任何解决方案,为什么在他更改所选订单 ID 时不使用更新按钮,他需要在显示 one2many 字段之前进行验证,这样您就可以一直进行写入,因为create 将在他验证选择时发生。我想说的是找到它的工作原理并围绕它工作以找到使用它的方法

标签: python openerp odoo-9


【解决方案1】:
new_lines = self.env['purchase.order.line']
        for qt in self.order_ids:
            for i in self.order_line.mapped('sale_order_id'):
                line_id.append(i.id)
                line_ids.append(i)
            for u in self.order_ids:
                if u.id in line_id:
                    u_id.append(u.id)
                    line_id.remove(u.id)
                    u_ids.append(u)
                    line_ids.remove(u)
            k = self.order_line.mapped('sale_order_id')
            if line_id and line_ids and u_ids:
                lp = self.order_line.filtered(lambda r: r.sale_order_id <= line_ids[0])
                lp6 = self.order_line.filtered(lambda r: r.sale_order_id not in line_ids)
                lp2 = self.order_line.filtered(lambda r: r.sale_order_id in u_ids)

                for line in self.order_line:
                    if line in lp:
                        self.update({
                            'order_line': [(5, _, _)],
                        })
                for o in lp6:
                    data = {
                        'sale_order_line_id': o.sale_order_line_id.id,
                        'name': o.name,
                        'sequence_number': o.sequence_number,
                        'product_id': o.product_id.id,
                        'product_qty': o.product_qty,
                        'product_uom': o.product_uom,
                        'price_unit': o.price_unit,
                        'cpo_no': o.cpo_no,
                        'cpo_product_qty': o.cpo_product_qty,
                        'cpo_product_uom': o.cpo_product_uom,
                        'cpo_price_unit': o.cpo_price_unit,
                        # 'quote_ref':line.order_id.origin,
                        'discount': 0.0,
                        'date_planned': (datetime.today() + relativedelta(weeks=4)).strftime(
                            DEFAULT_SERVER_DATETIME_FORMAT),
                    }
                    for line in qt.order_line:
                                # Load a PO line only once
                        if line in self.order_line.mapped('sale_order_line_id'):
                            continue
                    new_line = new_lines.new(data)
                    new_line._set_additional_fields(self)
                    new_lines += new_line



                    new_line = False

                continue

【讨论】:

    【解决方案2】:

    对不起,我来晚了,已经有时间了:

    尝试使用[(5,0,0)] 删除每条记录,然后添加 ID。这对我有用,但唯一的问题是,如果其他字段触发 onchange 方法不是相同的 many2many 或 one2many 字段,它会起作用

    但是在创建模式下,如果您没有找到任何解决方案,为什么在他更改所选订单 ID 时不使用更新按钮,他需要在显示 one2many 字段之前进行验证,这样您将始终进行写入,因为创建当他验证选择时会发生。我想说的是找到它的工作原理并围绕它工作以找到使用它的方法

    【讨论】:

    • 是的,我已使用 [5,,] 删除所有数据,我在创建时遇到的问题已通过以下方式解决: - 当我从 many2many i 中删除销售订单 ID 时将过滤不包含该 sale_order_id 的行并使用 new_line add 方法重写这些行。
    • lp6 = self.order_line.filtered(lambda r: r.sale_order_id not in line_ids)
    • 如果我们想看你的作品,请给你答案
    【解决方案3】:

    对于你用来建立关系的字段:-

    sale_order_id = fields.Many2one('sale.order', related='sale_order_line_id.order_id', string='Order',
                                   store=False)
    

    请尝试赋予属性 ondelete = 'cascade' 并将行更改为:-

    sale_order_id = fields.Many2one('sale.order', related='sale_order_line_id.order_id', string='Order', ondelete ='cascade'
                                   store=False)
    

    如果你这样放,当相关的销售订单被删除时,带有关系记录的one2many条目也将被删除。这只是一个示例,您可以尝试这种方式。 谢谢

    【讨论】:

    • 它不起作用,实际上是从采购订单中删除 order_ids [many2many],我想从 po 行中删除相应的订单 ID
    【解决方案4】:

    以下是one2many中删除记录的常用逻辑

    @api.onchage('field_name')
    def onchange_field_name(self):
      for line in self.one2many_field_records:
        if line.order_id == 'your_satisfying_condition':
            line.unlink()
    

    这是删除订单行记录的常用方法

    【讨论】:

    • 这会删除所有表单视图数据,例如重置。
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    相关资源
    最近更新 更多