在Odoo 8的product.py
中,我看到name_search
方法将产品名称和变体连接为产品名称。然而,我的产品有数百种特性。
高度:500mm,505mm,。。。3000mm
宽度:500mm,505mm,。。。4000mm
因此,无法搜索所需的变体
因此,我需要首先选择产品,然后选择Height属性,然后选择Width属性
理论上我需要覆盖搜索方法
- 删除产品名称中的变体
- 创建搜索方法以选择第一个属性
- 创建另一种搜索方法以选择第二个属性
- 然后它需要将产品名称+att1+att2返回到主搜索方法
class product_product(models.Model):
_inherit = 'product.product'
#This search filter the products by selected product category
def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False):
if context is None:
context = {}
if context.get('material_id'):
productobj = self.pool.get('product.product').read(cr, uid, context['material_id'],['materialoptions_id'])
args = [('categ_id','=',productobj['materialoptions_id'][0])] + args
return super(product_product, self).search(cr, uid, args, offset, limit, order, context=context, count=count)
#And this is where I want to sperate the product and its attributes
#DONT KNOW WHERE TO EVEN START WITHOUT BREAKING THE PRODUCT.PY NAME_SEARCH
product.py
def name_get(self, cr, user, ids, context=None):
if context is None:
context = {}
if isinstance(ids, (int, long)):
ids = [ids]
if not len(ids):
return []
def _name_get(d):
name = d.get('name','')
code = context.get('display_default_code', True) and d.get('default_code',False) or False
if code:
name = '[%s] %s' % (code,name)
return (d['id'], name)
partner_id = context.get('partner_id', False)
if partner_id:
partner_ids = [partner_id, self.pool['res.partner'].browse(cr, user, partner_id, context=context).commercial_partner_id.id]
else:
partner_ids = []
# all user don't have access to seller and partner
# check access and use superuser
self.check_access_rights(cr, user, "read")
self.check_access_rule(cr, user, ids, "read", context=context)
result = []
for product in self.browse(cr, SUPERUSER_ID, ids, context=context):
variant = ", ".join([v.name for v in product.attribute_value_ids])
name = variant and "%s (%s)" % (product.name, variant) or product.name
sellers = []
if partner_ids:
sellers = filter(lambda x: x.name.id in partner_ids, product.seller_ids)
if sellers:
for s in sellers:
seller_variant = s.product_name and (
variant and "%s (%s)" % (s.product_name, variant) or s.product_name
) or False
mydict = {
'id': product.id,
'name': seller_variant or name,
'default_code': s.product_code or product.default_code,
}
result.append(_name_get(mydict))
else:
mydict = {
'id': product.id,
'name': name,
'default_code': product.default_code,
}
result.append(_name_get(mydict))
return result
所以我认为最好的"变通办法"是创建3个自定义字段
-
产品类型(所选类别中的所有产品名称)
-
宽度(链接到"产品类型"中选择的产品的属性)
-
高度(链接到"产品类型"中选择的产品的属性)
产品领域之上。然后,通过连接这3个值,我可以将上下文"name"传递给要匹配的产品搜索方法。因此,只显示一个符合以上标准的产品
希望这对我有所帮助-
为什么这是最好的方式?可能应该加上这个。教育价值与否。
因为,在调试时,您会看到产品及其属性共享一个id。这是因为odoo将每个产品变体视为一个产品。没有"主要"产品,然后是儿童变体。这是一个相同的。
LOOK HERE===================================================
{'lang': 'en_US', 'tz': False, 'uid': 1, 'material_id': 19}
LOOK HERE3===================================================
{'lang': 'en_US', 'tz': False, 'uid': 1, 'material_id': 19}
[33, 34, 35, 36]
LOOK HERE2===================================================
{'default_code': False, 'id': 33, 'name': u'Palisade Fence (Domestic 110mm) (1800, 3000mm)'}
LOOK HERE3===================================================
{'lang': 'en_US', 'tz': False, 'uid': 1, 'material_id': 19}
[33, 34, 35, 36]
LOOK HERE2===================================================
{'default_code': False, 'id': 34, 'name': u'Palisade Fence (Domestic 110mm) (1800, 3005mm)'}
LOOK HERE3===================================================
{'lang': 'en_US', 'tz': False, 'uid': 1, 'material_id': 19}
[33, 34, 35, 36]
LOOK HERE2===================================================
{'default_code': False, 'id': 35, 'name': u'Palisade Fence (Domestic 110mm) (1805, 3000mm)'}
LOOK HERE3===================================================
{'lang': 'en_US', 'tz': False, 'uid': 1, 'material_id': 19}
[33, 34, 35, 36]
这就是为什么每个变体都有自己的材料清单(这正是我所需要的,感谢出色的odoo开发人员)所以,除非你想改变odoo的结构,否则你首先需要传递一个上下文来过滤产品,而不是绕过
希望每个人都能理解。我对编程很陌生,所以如果我错过了情节,请告诉我。
奥多是令人难以置信的感谢伙计们