Как применить фильтр домена к 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.pricelist
→ product.pricelist.version
→ product.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