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: [Solved] [9.0] @api.constrains e sequence number

[Solved] [9.0] @api.constrains e sequence number 2 Anni 6 Mesi fa #25032

  • pablo
  • Avatar di pablo
  • Offline
  • Junior Boarder
  • Messaggi: 36
  • Karma: 0
Sto creando un modulo che lavora in maniera simile ad un ordine di vendita (documento testata dettaglio).

Prima della validazione del documento mi devo assicurare che l'importo dell'ordine non superi il budget disponibile e lo faccio con il decorator @api.constrains.
Nella create ho poi aggiunto la chiamata per generare il numero dell'ordine. Se tutto va a buon fine, non c'è nessun problema, se invece la funzione "collegata" ad @api.constrains solleva l'eccezione ValidationError, il contatore stacca (erroneamente) il numero di sequenza succesivo ma il documento non viene giustamente creato. Il documento che verrà creato dopo però non avrà il numero di sequenza corretto ma salterà di tante volte quante sono state le creazioni fallite a causa dell'eccezione.

Faccio un esempio:
1.Creo un nuovo documento di ordine: Sequence NR: ORD0001
2.Creo un nuovo documento di ordine ma viene sollevata un eccezione dal metodo legato ad @api.constrains
3.Creo un nuovo documento di ordine ma viene sollevata un eccezione dal metodo legato ad @api.constrains
4.Creo un nuovo documento di ordine: Sequence NR: ORD0004

Quando invece il Sequence number dell'ordine al passo 4 avrebbe dovuto essere ORD0002
@api.model
def create(self, vals):
	# Sequence number generation
	pdb.set_trace()
	vals['name'] = self.env['ir.sequence'].next_by_code('job.orders')

	res = super(PrizeOrder, self).create(vals)
	return res

Il seguente metodo scatta alla validazione (quando si salva il documento) solo se viene modificata una delle righe di 'ord_lines' (one2many).
sarebbe stato più corretto mettere il campo 'amount_total' (che è l'importo totale dell'ordine) come parametro di @api.constrains, ma a quanto pare non accetta campi computed (e amount_total lo è)
@api.one
@api.constrains('ord_lines')
def _check_amount(self):
	if self.amount_total > self.points:
		raise exceptions.ValidationError("Not enough points! Remove some products.")
Ultima modifica: 2 Anni 6 Mesi fa da pablo.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

[9.0] @api.constrains e sequence number 2 Anni 6 Mesi fa #25034

  • iw3hxn
  • Avatar di iw3hxn
  • Offline
  • Gold Boarder
  • Messaggi: 252
  • Ringraziamenti ricevuti 93
  • Karma: 2
Ciao Pablo, prova a cambiare l'ordine con cui fai le cose

ovvero prima chiamare super con vals = '/'

e dopo che ti è tornato un res valido da super a fare il write con vals = self.env.next_by_code('job.orders')
Carlo Vettore
Presidente Odoo Italia
Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo....
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Ringraziano per il messaggio: mcalderara

[9.0] @api.constrains e sequence number 2 Anni 6 Mesi fa #25038

  • gigidn
  • Avatar di gigidn
  • Offline
  • Platinum Boarder
  • Messaggi: 1925
  • Ringraziamenti ricevuti 446
  • Karma: 22
Ummm ma perche' in questo caso non lavorare a livello di create e write? questo è il caso in cui si deve intervenire li
@KTec
www.ktec.it
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

[9.0] @api.constrains e sequence number 2 Anni 6 Mesi fa #25040

  • pablo
  • Avatar di pablo
  • Offline
  • Junior Boarder
  • Messaggi: 36
  • Karma: 0
iw3hxn ha scritto:
Ciao Pablo, prova a cambiare l'ordine con cui fai le cose

ovvero prima chiamare super con vals = '/'

e dopo che ti è tornato un res valido da super a fare il write con vals = self.env.next_by_code('job.orders')
così funziona sicuramente, però non mi piaceva fare una create e subito dopo una write :)
gigidn ha scritto:
Ummm ma perche' in questo caso non lavorare a livello di create e write? questo è il caso in cui si deve intervenire li

sisi infatti il contatore si stacca nella def create, se ti riferisci al controllo prima della validazione, @api.constrains credo sia stato fatto apposta per scindere (al livello teorico) le due logiche: nella create faccio le scritture, nei metodi 'constrains' i controlli.

Comunque ho risolto, dando un'occhiata al sorgente i odoo:
nella definizione del contattore va esplicitato il campo 'implementation' con valore 'no_gap', altrimenti di default viene settato 'standard' con il comportamento che ho scritto nel primo post.
<openerp>
	<data>
		<record id="seq_ord_id" model="ir.sequence">
			<field name="name">Seq Name</field>
			<field name="code">co.de</field>
			<field name="implementation">no_gap</field>
			<field name="prefix">ORD</field>
			<field name="padding">3</field>
		</record>
	</data>
</openerp>
Ultima modifica: 2 Anni 6 Mesi fa da pablo.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

[9.0] @api.constrains e sequence number 2 Anni 6 Mesi fa #25046

  • OpenCode
  • Avatar di OpenCode
  • Offline
  • Gold Boarder
  • Vi Veri Veniversum Vivus Vici
  • Messaggi: 179
  • Ringraziamenti ricevuti 32
  • Karma: 4
pablo ha scritto:
iw3hxn ha scritto:
Ciao Pablo, prova a cambiare l'ordine con cui fai le cose

ovvero prima chiamare super con vals = '/'

e dopo che ti è tornato un res valido da super a fare il write con vals = self.env.next_by_code('job.orders')
così funziona sicuramente, però non mi piaceva fare una create e subito dopo una write :)

Se la soluzione non ti piace allora il controllo devi spostarlo all'interno della create prima della reale chiamata. Se il tuo controllo va a buon fine scrivi altrimenti asserti l'errore.

Rimane il fatto che la soluzione più giusta è quella precedentemente indicata perché l'assegnazione del numero deve essere fatta a posteriori al netto di tutti i controlli del caso.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

[9.0] @api.constrains e sequence number 2 Anni 6 Mesi fa #25049

  • pablo
  • Avatar di pablo
  • Offline
  • Junior Boarder
  • Messaggi: 36
  • Karma: 0
OpenCode ha scritto:
pablo ha scritto:
così funziona sicuramente, però non mi piaceva fare una create e subito dopo una write :)

Se la soluzione non ti piace allora il controllo devi spostarlo all'interno della create prima della reale chiamata. Se il tuo controllo va a buon fine scrivi altrimenti asserti l'errore.

Rimane il fatto che la soluzione più giusta è quella precedentemente indicata perché l'assegnazione del numero deve essere fatta a posteriori al netto di tutti i controlli del caso.

sono d'accordo (con il fatto che i controlli si fanno prima delle scritture) ma preferisco seguire la documentazione e tenere il codice dei controlli "separato" dal quello della create/write. Quello che ho potuto vedere è che i metodi decorati con @api.constrains vengono chiamati nella create padre.
Se ho tempo do un'occhiata alla create standard e cerco qual'è la chiamata che esegue questi metodi, in modo da poterla utilizzare direttamente nella mia create prima di far staccare il numero del contatore.

Adesso comunque è puramente un problema di stile perché con implementation=no_gap il problema è già risolto.
Ultima modifica: 2 Anni 6 Mesi fa da pablo.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
  • Pagina:
  • 1
  • 2
Tempo creazione pagina: 0.147 secondi

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

Protected by R Antispam