Odoo 8.0 Le nuove API. davide.corio@abstract.it / abstract per pycon6
Nuove API, perchè? più object oriented stile più pythonico hooks risparmio di codice
Principali novità uso dei decoratori recordsets environment nuovi fields nuovo metodo per defaults muovo metodo per onchange
Environment Metodo più semplice ed ordinato per accedere ad informazioni comuni e soprattutto per incapsulare cr, uid, ids, context e recordsets.
Environment esempio di migrazione da v7 a v8 # v7 def mio_metodo(self, cr, uid, ids, context=none): # v8 def mio_metodo(self):
Environment accedere all environment def mio_metodo(self): self.env # oppure # oggetto.env
Environment # accedere all utente ipdb> self.env.user res.users(1,) # accedere a records tramite XML id ipdb> self.env.ref('base.main_company') res.company(1,) # invalidare cache ipdb> self.env.invalidate_all() # ricalcolare campi calcolati ipdb> self.env.recompute True
Environment altri metodi utili (eg: sudo()) https://github.com/odoo/odoo/blob/8.0/openerp/api.py https://www.odoo.com/documentation/8.0/reference/orm.html http://odoo-new-api-guide-line.readthedocs.org/en/latest/environment.html
Decoratori @api.model from openerp import models, api class MioModello(models.Model): @api.model def create(self, values): # self è un recordset def create(self, cr, uid, values, context=none): # self non è un recordset
Decoratori @api.multi from openerp import models, api class MioModello(models.Model): @api.multi def write(self, values): # self è un recordset def write(self, cr, uid, ids, values, context=none): # self non è un recordset
Decoratori @api.one from openerp import models, api class MioModello(models.Model): @api.multi @api.returns( account.invoice ) def mio_metodo(self): return invoice # ritorna un recordset di N fatture
Decoratori @api.onchange from openerp import models, api class MioModello(models.Model): # invoca mio_metodo se cambiano nome e cognome @api.onchange('nome', 'cognome') def mio_metodo(self): self.iniziali =
Decoratori @api.depends from openerp import models, api class MioModello(models.Model): iniziali = fields.char(compute='_calcola_iniziali') @api.one @api.depends('partner_id.name', 'partner_id.surname ) def _calcola_iniziali(self): iniziali = self.partner_id.name[0] + self.partner_id.surname[0] self.iniziali = iniziali.upper()
Decoratori @api.constrains from openerp import models, api class MioModello(models.Model): @api.one @api.constrains('campo1', 'campo2') def mio_metodo(self): if self.campo1 == self.campo2: raise ValidationError("Messaggio di errore")
Recordset istanza della classe del modello ipdb> self account.invoice(9,) ipdb> invoices = self.search([]) ipdb> invoices account.invoice(1, 6, 5, 4, 3, 2, 9, 7, 8) ipdb> invoices[6].number u'saj/2015/0001' ipdb> invoices. class <class 'openerp.api.account.invoice'> ipdb>
Nuovi fields addio _columns e _defaults (!!) from openerp import fields numero_intero = fields.integer( Numero Intero ) numero_decimale = fields.float( Numero Decimale ) testo = fields.char( Testo ) testo_lungo = fields.text( Testo Lungo ) cliente = fields.many2one( res.partner, string= Cliente ) clienti = fields.many2many( res.partner, string= Clienti ) righe_di_qualcosa = fields.one2many( modello.riga, parent_id, string= Righe )
Nuovi fields addio _columns e _defaults (!!) from openerp import fields # default statico testo_con_default = fields.char( Testo, default= testo predefinito ) # funzione per calcolo default testo_con_default = fields.char( Test, default=_una_funzione) def _una_funzione(self): return testo predefinito
Nuovi fields relazioni più semplici campi calcolati più semplici from openerp import fields # campo related campo_relazionato = fields.char( Testo, related= altro_campo_di_testo ) # campo calcolato campo_calcolato = fields.char( Testo, compute= _una_funzione, store=true) def _una_funzione(self): return testo predefinito
Documentazione https://www.odoo.com/documentation/8.0/reference.html http://odoo-new-api-guide-line.readthedocs.org/en/latest/index.html
Q&A
Davide Corio davide.corio@abstract.it