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: [8.0] Aggiungere campi in sale.order.line

[8.0] Aggiungere campi in sale.order.line 2 Anni 1 Mese fa #26515

  • GiuseppeS
  • Avatar di GiuseppeS
  • Offline
  • Expert Boarder
  • Messaggi: 140
  • Ringraziamenti ricevuti 5
  • Karma: 0
Buonasera.
Vorrei aggiungere due campi in sale.order.line ma ho dei problemi con con il metodo create e write.

In pratica mi sono creato due campi product_bom_qt e product_uom_qty_to che cambio con il seguente codice alla modifica del campo product_bom_qty :
@api.onchange('product_bom_qty')
    def product_qty_change(self):
            if self.product_packaging:
            self.product_uom_qty_tot = self.product_packaging.qty
        else:
            self.product_uom_qty_tot = 1.0
        self.product_uom_qty = self.product_bom_qty * self.product_uom_qty_tot

fin qui tutto ok.

ma quando vado a salvare non mi cambiano i valori o meglio mi danno entrambi 0.
L'unica soluzione che ho trovato è nel seguente codice:
@api.model
    def create(self, values, context=None):
         pack_obj = self.env['product.packaging']
        qty = values.get('product_bom_qty', False)
        packaging = values.get('product_packaging', False)
        if packaging:
            pack_qty = pack_obj.browse(packaging).qty
        else:
            pack_qty = 1
        qty_tot = qty * pack_qty
        values['product_uom_qty'] = qty_tot
        values['product_uom_qty_tot'] = pack_qty
        res = super(sale_order_line, self).create(values)
        return res

come potete vedere non faccio altro che ripetere il primo codice e aggiornare values.
Sicuramente dovrò fare una cosa del genere anche con write per la modifica della linea d'ordine.
Come posso risolvere senza ripetere il codice?

Grazie.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

[8.0] Aggiungere campi in sale.order.line 2 Anni 1 Mese fa #26516

  • gigidn
  • Avatar di gigidn
  • Offline
  • Platinum Boarder
  • Messaggi: 1925
  • Ringraziamenti ricevuti 446
  • Karma: 22
@api.onchange agisce sulla UI ... ora non ne son sicuro ma se il campo non è renderizzato temo che l'on_change non abbia effetto.

Se il campo non è specifico per l'interfaccia usa @api.compute(... store=True) e @api.depends(....)
@KTec
www.ktec.it
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

[8.0] Aggiungere campi in sale.order.line 2 Anni 1 Mese fa #26518

  • GiuseppeS
  • Avatar di GiuseppeS
  • Offline
  • Expert Boarder
  • Messaggi: 140
  • Ringraziamenti ricevuti 5
  • Karma: 0
Grazie.
@api.compute non la conosco. La devo studiare.

Ma ho il sospetto che anche qualcosaltro non funzioni e forse dipende tutto da quello.
In pratica si potrebbe ereditare(_inherit) sulla definizione "product_id_change" che si trova appunto in sale.order.line.
Il problema sta, secondo me, nel fatto che dovrei ereditare anche "product_packaging_change" e "product_packaging_change" che entrambi si trovano in "sale_stock" e che ereditano anch'esse sale.order.line.
Non ho ben capito se per modificarle devo cambiare la UI oppure soprascriverle ereditando da sale.stock.
Perché se le eredito e sovrascrivo direttamente da sale.order.line non succede niente.
Esempio:
class sale_order_line(models.Model): # nel mio modulo
    _inherit = 'sale.order.line'

	def product_packaging_change(self, pricelist, product, qty=0, uom=False,
                                    partner_id=False, packaging=False, flag=False, context=None):

        print "***** self.product_packaging prima *****", self.product_packaging
        res = super(sale_order_line, self).product_packaging_change(cr, uid, ids, pricelist, product, qty=qty, uom=uom,
                                    partner_id=partner_id, packaging=packaging, flag=flag, context=context)

        print "***** self.product_packaging *****", packaging
        print "***** res *****", res
        if packaging:
            # self.product_uom_qty_tot = self.product_packaging.qty
            pass
        return res

    def product_id_change_with_wh(self, cr, uid, ids, pricelist, product, qty=0,
                uom=False, qty_uos=0, uos=False, name='', partner_id=False,
                lang=False, update_tax=True, date_order=False, packaging=False, fiscal_position=False, flag=False, warehouse_id=False, context=None):
            # context = context or {}
            print "***** product_id_change_with_wh *******"

Lo so fa schifo ma rende l'idea. In pratica non succede nulla è come se _inherit non sortisse alcun effetto.

Grazie.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

[8.0] Aggiungere campi in sale.order.line 2 Anni 1 Mese fa #26519

  • gigidn
  • Avatar di gigidn
  • Offline
  • Platinum Boarder
  • Messaggi: 1925
  • Ringraziamenti ricevuti 446
  • Karma: 22
Riavvolgiamo il nastro e ripartiamo da capo :)

@api.onchange ha lo scopo di reagire on-the-fly su cambiamenti della UI. Questo significa che se il tuo campo non viene mai aggiornato quel codice non verrà mai eseguito.

Se sovrascrivi un metodo di una classe ricordati di invocare super o rompi la catena delle estensioni.

Detto questo se il tuo scopo e mettere una casella nell'ordine di vendita nel quale l'utente specifica il numero di pacchi e questi vengono convertiti in UOM di prodotto è corretto implementare questa funzione con on_change su tale valore di UI.

Se il tuo requisito è altro non ho ben capito e bisognerebbe analizzarlo ma se il tutto non è legato all'interfaccia devi usare @api.compute e non on_change.
@KTec
www.ktec.it
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

[8.0] Aggiungere campi in sale.order.line 2 Anni 1 Mese fa #26520

  • Vinicius05
  • Avatar di Vinicius05
  • Offline
  • Gold Boarder
  • Messaggi: 194
  • Ringraziamenti ricevuti 58
  • Karma: 0
come scriveva gigidn on_change agisce sulla UI, io utilizzerei un api constraints
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

[8.0] Aggiungere campi in sale.order.line 2 Anni 1 Mese fa #26532

  • GiuseppeS
  • Avatar di GiuseppeS
  • Offline
  • Expert Boarder
  • Messaggi: 140
  • Ringraziamenti ricevuti 5
  • Karma: 0
Scusate non l'ho scritto, l'ho dato per scontato.
La UI già l'ho implementata quindi non mi rimane altro che gestirmi on_change.
Questo va bene cioè mi modifica giustamente i vari campi. Il problema è che quando vado a salvare questi assumono valori strani.
Allego una foto per capire .
Ci sono tre file
1) in modifica e avviene bene
2)in schermata principale senza salvare, e va bene. Ultimo rigo
3) dopo salva e non va bene.
Per farlo ho utilizzato un altro codice rispetto a quello di prima in create che mi richiama product_id_change di sale.line.order

ma il risultato non è quello sperato.

per ultimo il packaging si attiva tramite una opzione in configurazione che ora non ricordo.
Allegati:
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
  • Pagina:
  • 1
  • 2
Tempo creazione pagina: 0.144 secondi

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

Protected by R Antispam