Hi,
My basic intention was to display Part-Number of the product for all products and give ability to search by Part-Number.
I accomplished it this way in product.product class,(Code between #Vivek and #End are my code snippets)
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 = d.get('default_code',False)
# Vivek
part_number = d.get('part_number',False)
if part_number:
name = '%s-%s' % (name,part_number)
#End
elif code:
name = '[%s] %s' % (code,name)
elif d.get('variants'):
name = name + ' - %s' % (d['variants'],)
return (d['id'], name)
partner_id = context.get('partner_id', False)
result = []
for product in self.browse(cr, user, ids, context=context):
sellers = filter(lambda x: x.name.id == partner_id, product.seller_ids)
# Vivek
prd_temp = self.pool.get('product.template').browse(cr, user, product.id, context=context)
# End
if sellers:
for s in sellers:
mydict = {
'id': product.id,
'name': s.product_name or product.name,
#vivek
'part_number': prd_temp.part_number,
#End
'default_code': s.product_code or product.default_code,
'variants': product.variants
}
result.append(_name_get(mydict))
else:
mydict = {
'id': product.id,
'name': product.name,
#vivek
'part_number': prd_temp.part_number,
#End
'default_code': product.default_code,
'variants': product.variants
}
result.append(_name_get(mydict))
return result
def name_search(self, cr, user, name='', args=None, operator='ilike', context=None, limit=100):
if not args:
args = []
if name:
ids = self.search(cr, user, [('default_code','=',name)]+ args, limit=limit, context=context)
if not ids:
ids = self.search(cr, user, [('ean13','=',name)]+ args, limit=limit, context=context)
if not ids:
# Do not merge the 2 next lines into one single search, SQL search performance would be abysmal
# on a database with thousands of matching products, due to the huge merge+unique needed for the
# OR operator (and given the fact that the 'name' lookup results come from the ir.translation table
# Performing a quick memory merge of ids in Python will give much better performance
ids = set()
ids.update(self.search(cr, user, args + [('default_code',operator,name)], limit=limit, context=context))
if not limit or len(ids) < limit:
# we may underrun the limit because of dupes in the results, that's fine
ids.update(self.search(cr, user, args + [('name',operator,name)], limit=(limit and (limit-len(ids)) or False) , context=context))
# vivek
# Purpose : To filter the product by using part_number
ids.update(self.search(cr, user, args + [('part_number',operator,name)], limit=(limit and (limit-len(ids)) or False) , context=context))
#End
ids = list(ids)
if not ids:
ptrn = re.compile('(\[(.*?)\])')
res = ptrn.search(name)
if res:
ids = self.search(cr, user, [('default_code','=', res.group(2))] + args, limit=limit, context=context)
else:
ids = self.search(cr, user, args, limit=limit, context=context)
result = self.name_get(cr, user, ids, context=context)
return result
But the problem with this particular functionality is "It's a global change" wherever you get to list the products the display will be Product Name - Part Number. If someone can do that better for context specific actions it will be great.
Thanks mike for your valuable input (It was useful and i've upvoted it)
Further answers are eagerly welcome. :)
Use name_get(), It will be helpful.