Odoo 8在销售订单的单独字段中选择产品和变量

时间:2015-04-08 11:16:12

标签: product odoo variant sales

你好其他程序员

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

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

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

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

所以我需要先选择产品, 然后是高度属性, 然后是宽度属性

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

  1. 删除产品名称中的变体

  2. 创建搜索方法以选择第一个属性

  3. 创建另一种搜索方法以选择第二个属性

  4. 然后需要将产品名称+ att1 + att2返回到主搜索方法

  5. 有人能指出我正确的方向吗?

    我的模特 class product_product(models.Model):

    _inherit = 'product.product'
    

    此搜索按选定的产品类别

    过滤产品
    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)
    

    这就是我想要对产品及其属性进行处理的地方

    不要知道什么时候开始没有打破产品.PY NAME_SEARCH

    product.py

    def name_get(self,cr,user,ids,context = None):         如果上下文为None:             context = {}         if isinstance(ids,(int,long)):             ids = [ids]         如果不是len(ids):             返回[]

        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
    

1 个答案:

答案 0 :(得分:0)

所以我认为最好的“解决方法”就是如果我创建3个自定义字段

  • 产品类型(所选类别中的所有产品名称)

  • 宽度(链接到“产品类型”中所选产品的属性)

  • 高度(链接到“产品类型”中所选产品的属性)

在产品领域之上。然后通过连接这3个值,我可以将上下文“name”传递给产品搜索方法以进行匹配。因此,只显示一个符合上述标准的产品

希望这有助于-me -

为什么这是最好的方法?可能应该添加这个。教育价值,什么不是。

因为,在调试时你会看到产品,它的属性共享一个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的结构,否则首先需要传递一个上下文来过滤产品,而不是相反

希望这对每个人都有意义。我对编程非常陌生,所以请告诉我,如果我错过了这个情节。

odoo是令人难以置信的谢谢你们