2015-12-08 7 views
2

Я хочу искать записи одного поля, которое зависит от других полей.
вот мой код,odoo/openERP one2many fields dynamic domain

Родитель Класс:

class SaleOrder(models.Model): 
    _inherit = 'sale.order' 

    customer_product_ids = fields.One2many('product.product', 
          compute='_get_partner_products') 
    order_line = fields.One2many('sale.order.line', 'order_id') 

Детский класс:

class SaleOrderLine(models.Model): 
    _inherit = 'sale.order.line' 

    order_id = fields.Many2one('sale.order') 
    product_id = fields.Many2one('product.product') 

Просмотр

<record id="view_ata_sale_order_form_inherit" model="ir.ui.view"> 
     <field name="name">view.ata.sale.order.form.inherit</field> 
     <field name="model">sale.order</field> 
     <field name="inherit_id" ref="sale.view_order_form"/> 
     <field name="arch" type="xml"> 
      <field name="partner_id" position="after"> 
       <field name="partner_channel_id" invisible="1"/> 
       <field name="customer_product_ids"/> 
      </field> 
      <xpath expr="//tree/field[@name='product_id']" position="attributes"> 
       <attribute name="domain">[('id', 'in', [rec.id for rec in parent.customer_product_ids])]</attribute> 
      </xpath> 
     </field> 
    </record> 

По умолчанию, клиент может видеть все продукты, определенные.
В моем случае, я должен фильтровать продукты зависит от выбранного клиента.
У каждого клиента могут быть разные продукты списка или если они не классифицируются, они могут видеть все продукты.

Я попытался код, приведенный выше, но получил сообщение об ошибке:

Uncaught Error: Expected "]", got "(name)" 

Я думаю, ошибка приходят из этого кода:

<attribute name="domain">[('id', 'in', [rec.id for rec in parent.partner_product_ids])]</attribute> 

мой вопрос,
есть возможность сделать понимание цикла питон как код выше (в пределах представления)?

спасибо.

ответ

1

Вы не можете поставить такой код там. Я хотел бы сделать это по-другому:

Изменить модель продукта добавления своего клиента

class Product(models.Model): 
    _inherit = 'product.product' 

    parent_id = fields.Many2one('res.partner') 

то вид может быть изменен намного проще:

<attribute name="domain">[('partner_id', '=', partner_id)]</attribute> 

или

<attribute name="domain">[('partner_id', '=', parent.partner_id)]</attribute> 

(в зависимости от вашего поля product_id ...

+0

Привет, Алессандро, спасибо за ваше предложение, я думаю, что нашел другой способ сделать это :) – yopiangi

4

В вашем случае вам нужно использовать onchange и вернуть динамический домен в one2many поле

вы должны иметь некоторые вещи, как это:

@api.onchange('partner') 
def onchange_partner(self): 
    ids=search for products that have this partner 
    then return some thing like this {'domain': {'Many2one or One2many': [('id', 'in', ids)}} 

я не буду писать код для вас, так что вы должны искать для onchange и примените его. Вы можете найти информацию here.

+0

привет Мостафа, да, я новый парень для разработки одухов, я пробовал ваше предложение, но оно не работает как ожидалось. Я отправляю свое решение, и оно работает. :) – yopiangi

1

Здравствуйте Мустафы и Алессандро Ruffolo

Спасибо очень много, чтобы ответить на мой вопрос :) (# извините за поздний ответ)

Я попытался решение от Мустафы Мохамеда, но это не влияет на продукцию (они продолжают отображать все продукты).
What should onchange methods do and return?

Вот мой код,

@api.multi 
def onchange_partner_id(self, part): 
    res = super(SaleOrder, self).onchange_partner_id(part) 
    domain = [('active', '=', True), ('sale_ok', '=', True)] 
    if part: 
     partner = self.env['res.partner'].browse(part) 
     if partner and partner.sales_channel_id: 
      domain.append(('sales_channel_ids', '=', 
          partner.sales_channel_id.id)) 
    product_ids = self.env['product.product'].search(domain) 
    res.update(domain={ 
     'order_line.product_id': ['id', 'in', [rec.id for rec in product_ids]] 
    }) 
    return res 

Я попробовал другое решение, поэтому я переопределить SEARCH_NAME и поиска метод в product.product модель, и это работает.

вот мой код,
1) наследуют sale_view.xml

<xpath expr="//tree/field[@name='product_id']" position="attributes"> 
    <attribute name="domain">[ 
     ('sales_channel_ids', '=', parent.partner_channel_id), 
     ('sale_ok', '=', True), 
     ('active', '=', True) 
    ]</attribute> 
    <attribute name="context">{ 
     'partner_channel_id': parent.partner_channel_id, 
     'partner_id': parent.partner_id, 
     'quantity': product_uom_qty, 
     'pricelist': parent.pricelist_id, 
     'uom': product_uom, 
     'company_id': parent.company_id 
    }</attribute> 
</xpath> 

и метод коррекции
2) SEARCH_NAME метод:

@api.model 
def name_search(self, name, args=None, operator='ilike', limit=100): 
    if 'partner_channel_id' in self._context: 
     target_domain = findDomain(args, 'sales_channel_ids') 
     if len(target_domain) == 1: 
      idx = target_domain.keys()[0] 
      domain = target_domain.values()[0] 
      if False in domain: 
       args.pop(idx) 
    return super(ProductProduct, self).name_search(name=name, 
               args=args, 
               operator=operator, 
               limit=limit) 

3) поиск метод:

@api.model 
def search(self, args, offset=0, limit=None, order=None, count=False): 
    if 'partner_channel_id' in self._context: 
     target_domain = findDomain(args, 'sales_channel_ids') 
     if len(target_domain) == 1: 
      idx = target_domain.keys()[0] 
      domain = target_domain.values()[0] 
      if False in domain: 
       args.pop(idx) 
    return super(ProductProduct, self).search(args=args, 
              offset=offset, 
              limit=limit, 
              order=order, 
              count=count) 

Что я пытаюсь сделать здесь, когда они обнаружили «partner_channel_id» в контексте и домене, как это ['sales_channel_ids', '=', False], я удалил этот домен и оставил (клиент не имеет канала могут видеть все продукты, без фильтрующих продуктов).

+0

наверняка это хорошее решение, я просто говорю вам, что у меня короче и проще :) Кроме того, я использовал его в своем собственном коде! –