如何在销售订单的单独字段中选择产品和变体



在Odoo 8的product.py中,我看到name_search方法将产品名称和变体连接为产品名称。然而,我的产品有数百种特性。

高度:500mm,505mm,。。。3000mm

宽度:500mm,505mm,。。。4000mm

因此,无法搜索所需的变体

因此,我需要首先选择产品,然后选择Height属性,然后选择Width属性

理论上我需要覆盖搜索方法

  1. 删除产品名称中的变体
  2. 创建搜索方法以选择第一个属性
  3. 创建另一种搜索方法以选择第二个属性
  4. 然后它需要将产品名称+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的结构,否则你首先需要传递一个上下文来过滤产品,而不是绕过

希望每个人都能理解。我对编程很陌生,所以如果我错过了情节,请告诉我。

奥多是令人难以置信的感谢伙计们

相关内容

  • 没有找到相关文章

最新更新