Как применить фильтр домена к product_id в sale.order.line на основе прайс-листа, выбранного в sale.order?

Я определил product_id в class sale_order_line как показано ниже:

class sale_order_line(osv.osv):
    _inherit = 'sale.order.line'

    def _get_product_ids(self):

        return [('sale_ok', '=', True), ('state', 'in', ['sellable', 'custom']), ('id', '=', )]

    _columns = {
        'product_id': fields.many2one('product.product', 'Product',
                                      domain=_get_product_ids,
                                      change_default=True),
    }

Вид формы sale.order имеет приведенный ниже фрагмент где product_id Показано:

 <field name="product_id"
context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'shop':parent.shop_id, 'uom':product_uom}"
groups="base.group_user"
on_change="product_id_change(parent.pricelist_id, product_id, product_uom_qty, False, product_uos_qty, False, name, parent.partner_id, False, True, parent.date_order, False, parent.fiscal_position, False, context)"/>

Первоначально в Sale Orders(model: sale.order) Я выбираю pricelist_id поле. Затем я нажимаю "Добавить товар" в разделе "Строки заказа", чтобы добавить строку заказа на продажу. В виде вида sale.order.lineМне нужно только показать продукты в product_id на основе pricelist_id Я выбрал ранее.

В product.product класс pricelist_id это пустышка Поэтому я не могу понять, как добавить фильтр домена, поскольку он всегда будет возвращать нулевое значение.

Не могли бы вы помочь мне, как применить жесткий фильтр на product_id поле many2one, чтобы показать только продукты, основанные на выбранных pricelist_id в родительском классе?

2 ответа

Извините, но я не могу полностью понять вашу проблему. Вам необходимо добавить жесткий домен в поле product_id для sale.order.line, основываясь на значении pricelist_id, установленном в sale.order. Я процитирую вас:

Мне нужно только показывать товары в "product_id" на основе ценника, который я выбрал ранее

Насколько я помню, в Openerp 7 (и последующих версиях) у вас есть поле product_id только в записях элементов версии прайс-листа: это означает, что вы должны пройти через это отношение класса product.pricelistproduct.pricelist.versionproduct.pricelist.item
принимая во внимание, что каждый прайс-лист может иметь разные версии, а каждая версия - разные позиции.

Я прав или я ошибся? Мне кажется немного странным управлять всем этим беспорядком:) (если только вы не создадите некоторые функциональные поля непосредственно в product.pricelist). Можете ли вы объяснить это лучше?

Кроме того, мне кажется, что вы можете управлять жестким доменом для объявлений полей, используя лямбда-функции. Это может дать вам возможность создавать более сложные домены. Дайте ему попытку:

class sale_order_line(osv.osv):
    _inherit = 'sale.order.line'

    def _get_product_ids(self, cr, uid, ids, context=None):
        return [(...), (...)]

    _columns = {
        'product_id': fields.many2one('product.product', 'Product',
             #domain=lambda self: self._get_product_ids(),
             domain=lambda self: self._get_product_ids(self._cr, self._uid, [], self._context),
             change_default=True
         ),                                        
    }

В моем понимании вам нужен зависимый выпадающий аккаунт many2one. Например, у меня есть два поля many2one (campus_id и Department_id), и мы хотим изменить отдел на основе поля кампуса. Если вы хотите сделать это, то ниже приведен фрагмент кода:

1    @api.onchange('campus_id')
2    def _campus_onchange(self):
3        res = {}
4        res['domain']={'department_id':[('campus_id', '=', self.campus_id.id)]}
5        return res
Другие вопросы по тегам