2017-02-17 8 views
0

Я создал модуль, чтобы добавить строки заказа на продажу в соответствии с клиентом в строках заказа PO.Как отключить One2many Значения поля on onchange в Odoo

Selecting customer

Когда я добавить торговцем Order будет добавлен в РО порядке.

SO added

Я пытался разъединить к конкретным идентификаторам из one2many поля. в картине Добавить 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 (ро)

link_ids проведет order_ids, когда он выбран, когда идентификатор удаленный из order_ids, он будет удален из link_ids. u_ids оставит остальную часть order_id при ее удалении.

когда я удалить идентификатор из order_ids Iwant отвязать связанную линию от Order_Line

, но я не могу удалить его.

У меня есть пользователь [6,0, ids] метод для замены значений, он не будет работать в состоянии создания. Пожалуйста, помогите мне.

+0

при изменении order_ids линии выбранного SO addes нормально, но когда вы удалите его линия не будет ? – Cherif

+0

есть. если я удалю добавленный id из order_ids, я хочу удалить его строку из order_line –

+0

, попробуйте удалить каждую запись с помощью [(5,0,0)], затем добавьте идентификаторы. это работало для меня, но единственная проблема заключается в том, что она работает, если другое поле запускает метод onchange не одно и то же many2many или one2many поле – Cherif

ответ

0

Для поля вы использовали, чтобы сделать соотношение: -

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

пожалуйста, попробуйте дать атрибут OnDelete = «каскад» и измените строку, как: -

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

Если положить, как это , когда удаляется связанный с ним заказ на продажу, одна запись с записью отношения также будет удалена. Это всего лишь пример, и вы можете попробовать это. Благодаря

+0

Позвольте мне попробовать, спасибо Burmese –

+0

он не будет работать, фактически удаляет order_ids [many2many] из заказа purcahse, и я хочу удалить соответствующий идентификатор заказа из строки po –

+0

Но я думаю, что ваш код неправильный –

1

Ниже приведена общая логика для удаления записи в 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() 

Это обычный способ удаления ордерной линии записи

1

К сожалению я поздно это было время журнала:

попытайтесь удалить каждую запись с помощью [(5,0,0)], затем добавьте идентификаторы. это работало для меня, но единственная проблема заключается в том, что она работает, если другое поле запускает метод onchange не одно и то же many2many или one2many поле

но в режиме создания, если вы не нашли решения, почему бы вам не использовать обновление когда он изменяет выбранные идентификаторы заказа, которые ему нужно проверить, прежде чем показывать поле one2many, и таким образом вы будете работать над записью всегда, потому что создание произойдет, когда он проверит выбор.то, что я пытаюсь сказать, это найти то, что она работает и работать Arround его, чтобы найти способ использовать его

+0

да, я использовал [5, _, _], чтобы удалить все данные, и проблема, с которой я столкнулся в создании, была решена: - когда я удаляю идентификатор заказа на продажу из many2many, я буду фильтровать строки, которые не содержат this sale_order_id и используйте метод new_line add для перезаписи строк. –

+0

lp6 = self.order_line.filtered (lambda r: r.sale_order_id not in line_ids) –

+0

ответьте, если вы хотите, чтобы мы видели вашу работу – Cherif

0
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