Meine grundlegende Absicht war es, die Teilenummer des Produkts für alle Produkte anzuzeigen und die Möglichkeit zu geben, nach Part-Number zu suchen.
ich es auf diese Weise in Produkt.Produkt Klasse erreicht, (-Code zwischen #Vivek und #End meinen Code-Schnipsel sind)
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
Aber das Problem mit dieser besonderen Funktionalität ist: „Es ist eine globale Änderung "wo immer Sie die Produkte auflisten, wird die Anzeige Produktname - Teilenummer. Wenn jemand das besser für kontextspezifische Aktionen tun kann, wird es großartig.
Weitere Antworten sind sehr willkommen. :)
Danke Adrian, Es war wirklich gut und nützlich. Ich habe jedoch die Absicht, die Teilenummer aus der vorhandenen Produktliste zu suchen (statt nach Namen, nach Teilenummern suchen). Wenn ich ein many2one-Feld spezifiziere, kann ich die ersten paar Buchstaben des Namens eingeben und die Produktnamen, die übereinstimmen, werden fallengelassen, in meinem Fall würde ich nach Teilenummern suchen müssen. Hoffe, ich habe meine Bedürfnisse klar erklärt. Bitte geben Sie mir einige Vorschläge, dies umzusetzen. Vielen Dank – Vivek