Questo sito utilizza cookie per le proprie funzionalità e per inviarti pubblicità e servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina o cliccando qualunque suo elemento acconsenti all’uso dei cookie.

Accedendo al link http://www.odoo-italia.org/index.php/home/cookie-policy puoi leggere in dettaglio le modalità di trattamento dei cookie da parte dell'Associazione Odoo Italia.

Benvenuto, Ospite
Nome utente: Password: Ricordami
  • Pagina:
  • 1
  • 2

ARGOMENTO: ProducTemplate, doppia chiamata al metodo write

ProducTemplate, doppia chiamata al metodo write 2 Anni 8 Mesi fa #24205

  • MiCantino
  • Avatar di MiCantino
  • Offline
  • Expert Boarder
  • Messaggi: 137
  • Ringraziamenti ricevuti 7
  • Karma: 1
Sto realizzando una funzione tale per cui a fronte della variazione della tipologia di prodotto assegno un valore al campo "Riferimento Interno" (default_code).
Ho scritto tutti i miei metodi per il calcolo del valore, ma ho un problema nel salvataggio.
Il metodo write del ProductTemplate viene richiamato due volte, immagino per l'architettura dell'oggetto e delle sue dipendenze.

Ora, il bello (brutto) è che alla prima esecuzione il campo flag e il campo codice vengono popolati correttamente, alla seconda esecuzione il campo flag è già settato a True, mentre il dafault_code non è popolato e quindi il valore non viene salvato.

Qualcuno sa spiegarmi come mai?
        @api.multi
	def write(self, vals):
		self.ensure_one()
		if not self.campo_flag:
			newpn = self.categ_id._get_next_code(True) #metodo per il calcolo del valore
			vals['default_code'] = newpn
			vals['campo_flag'] = True

		return super(ProductTemplate, self).write(vals)

P.S.
odoo v8
Ultima modifica: 2 Anni 8 Mesi fa da MiCantino.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

ProducTemplate, doppia chiamata al metodo write 2 Anni 8 Mesi fa #24207

  • gigidn
  • Avatar di gigidn
  • Offline
  • Platinum Boarder
  • Messaggi: 1925
  • Ringraziamenti ricevuti 446
  • Karma: 22
Fai attenzione che default_code è un related su ProdutTemplate ... il vero valore sta in ProductProduct è su questo ultimo oggetto che devi definire il metodo write.
@KTec
www.ktec.it
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Ringraziano per il messaggio: MiCantino

ProducTemplate, doppia chiamata al metodo write 2 Anni 8 Mesi fa #24209

  • MiCantino
  • Avatar di MiCantino
  • Offline
  • Expert Boarder
  • Messaggi: 137
  • Ringraziamenti ricevuti 7
  • Karma: 1
Hai ragione, ma il problema non l'ho risolto, anzi.
Quando invoco la create sul ProductProduct (invocata dalla ProductTemplate) mi trovo un oggetto ProductTemplate non salvato, con tutti i valori vuoti.
       @api.model
	def create(self, vals):
		prodtmpl = self.product_tmpl_id
		if not prodtmpl.campo_flag:
			newpn = prodtmpl.categ_id._get_next_code(True)
			vals['default_code'] =newpn

			prodtmpl.campo_flag = True

		return super(ProductProduct, self).create(vals)
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

ProducTemplate, doppia chiamata al metodo write 2 Anni 8 Mesi fa #24210

  • gigidn
  • Avatar di gigidn
  • Offline
  • Platinum Boarder
  • Messaggi: 1925
  • Ringraziamenti ricevuti 446
  • Karma: 22
Sinceramente non ho mai fatto una cosa del genere quindi non so l'ordine delle write e se il riferimento viene dato dalla cache oppure ha valori inconsistenti, devi fare un po' di prove.

Se effettivamente nella chiamata alla write di ProductProduct il corrispondente ProductTemplate è inconsistente va trovato un work arround per sistemare la cosa.

Fai un trace ... analizza la chiamata agli oggetti e tutti i loro valori e decidi come comportarti ... una soluzione sporca (ma la eviterei) è che nella write di ProductTemplate scandisci tutte le varianti e setti il corrispondente default_code.

Altra strada potrebbe essere sovrascrivere il metodo create di ProductTemplate (ma se devo essere purista neanche questa mi piace molto).

In definitiva .... tocca studiarci un po' su :)
@KTec
www.ktec.it
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Ringraziano per il messaggio: MiCantino

ProducTemplate, doppia chiamata al metodo write 2 Anni 8 Mesi fa #24227

  • OpenCode
  • Avatar di OpenCode
  • Offline
  • Gold Boarder
  • Vi Veri Veniversum Vivus Vici
  • Messaggi: 179
  • Ringraziamenti ricevuti 32
  • Karma: 4
C'è modo di avere un codice più completo?
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

ProducTemplate, doppia chiamata al metodo write 2 Anni 8 Mesi fa #24228

  • MiCantino
  • Avatar di MiCantino
  • Offline
  • Expert Boarder
  • Messaggi: 137
  • Ringraziamenti ricevuti 7
  • Karma: 1
Scusa, la "sporcizia"...
sto continuando a testare, attualmente questo codice mi salva il default_code solo su un prodotto già creato
class ProductTemplate(models.Model):
	_inherit = 'product.template'

	campo_flag = fields.Boolean(default=False)

	@api.onchange('categ_id')
	def _onchange_category(self):
		if not self.campo_flag:
			newpn = self.categ_id._get_next_code(False)
			self.default_code = newpn

	@api.multi
	def write(self, vals):
		self.ensure_one()
		if not self.campo_flag:
			newpn = self.categ_id._get_next_code(False)
			vals['default_code'] = newpn
			# prodprodargs = ['product_tmpl_id','=',str(self.id)]
			# productpr_ids= self.env['product.product'].browse(prodprodargs)
			# for prod in productpr_ids:
			# 	prod.default_code = newpn
			#vals['campo_flag'] = True

		return super(ProductTemplate, self).write(vals)

class ProductProduct(models.Model):
	_inherit = 'product.product'

	@api.multi
	def write(self, vals):
		self.ensure_one()
		prodtmpl = self.product_tmpl_id
		newpn = prodtmpl.categ_id._get_next_code(True)
		vals['default_code'] = newpn

		return super(ProductProduct, self).write(vals)

	# @api.model
	# def create(self, vals):
	# 	tmplargs = ['id','=', vals['product_tmpl_id']]
	# 	templ_ids= self.env('product.template').search(tmplargs)
	# 	for mytmp in templ_ids:
	# 		newpn = mytmp.categ_id._get_next_code(True)
	# 		vals['default_code'] = newpn
	#
	# 	return super(ProductProduct, self).create(vals)
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
  • Pagina:
  • 1
  • 2
Tempo creazione pagina: 0.138 secondi

Odoo Italia Associazione - C.F: 94200470485 - Sede: Viale dei Cadorna, 83 - Firenze - Italy

Protected by R Antispam