SlideShare a Scribd company logo
1 of 21
Download to read offline
Le nuove API.
Odoo 8.0
abstract per pycon6davide.corio@abstract.it /
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

More Related Content

Similar to Odoo 8.0. Le nuove API.

Django & Google App Engine: a value composition
Django & Google App Engine: a value compositionDjango & Google App Engine: a value composition
Django & Google App Engine: a value compositionOpen Makers Italy
 
Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingSimple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingFrancesca1980
 
Drupal Day 2012 - DRUPAL 8: I CAMBIAMENTI CHE CI ASPETTANO
Drupal Day 2012 - DRUPAL 8:  I CAMBIAMENTI CHE CI ASPETTANODrupal Day 2012 - DRUPAL 8:  I CAMBIAMENTI CHE CI ASPETTANO
Drupal Day 2012 - DRUPAL 8: I CAMBIAMENTI CHE CI ASPETTANODrupalDay
 
Eclipse emf
Eclipse emfEclipse emf
Eclipse emfAdvenias
 
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019Matteo Enna
 
Effective Code Transformations in C++
Effective Code Transformations in C++Effective Code Transformations in C++
Effective Code Transformations in C++Marco Arena
 
Presentazione django reminiscence
Presentazione django reminiscencePresentazione django reminiscence
Presentazione django reminiscenceAndrea Gottardi
 
Sviluppare app native per iOS
Sviluppare app native per iOSSviluppare app native per iOS
Sviluppare app native per iOSGaspare Novara
 
Sviluppare apps native per iOS - Lo Stretto Digitale
Sviluppare apps native per iOS - Lo Stretto DigitaleSviluppare apps native per iOS - Lo Stretto Digitale
Sviluppare apps native per iOS - Lo Stretto Digitalelostrettodigitale
 
Javascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerJavascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerMatteo Magni
 
Django: utilizzo avanzato e nuove funzionalità
Django: utilizzo avanzato e nuove funzionalitàDjango: utilizzo avanzato e nuove funzionalità
Django: utilizzo avanzato e nuove funzionalitàskam
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.jsMichele Capra
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Luca Lusso
 
Programmazione e gestione della sicurezza: Verbale elettronico
Programmazione e gestione della sicurezza: Verbale elettronicoProgrammazione e gestione della sicurezza: Verbale elettronico
Programmazione e gestione della sicurezza: Verbale elettronicoDavide Ciambelli
 
Enterprise Applications - Angular Day 2018
Enterprise Applications - Angular Day 2018Enterprise Applications - Angular Day 2018
Enterprise Applications - Angular Day 2018Paolo Galfione
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptSinergia Totale
 

Similar to Odoo 8.0. Le nuove API. (20)

Django
DjangoDjango
Django
 
Django & Google App Engine: a value composition
Django & Google App Engine: a value compositionDjango & Google App Engine: a value composition
Django & Google App Engine: a value composition
 
Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingSimple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computing
 
Drupal Day 2012 - DRUPAL 8: I CAMBIAMENTI CHE CI ASPETTANO
Drupal Day 2012 - DRUPAL 8:  I CAMBIAMENTI CHE CI ASPETTANODrupal Day 2012 - DRUPAL 8:  I CAMBIAMENTI CHE CI ASPETTANO
Drupal Day 2012 - DRUPAL 8: I CAMBIAMENTI CHE CI ASPETTANO
 
Eclipse emf
Eclipse emfEclipse emf
Eclipse emf
 
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
 
Effective Code Transformations in C++
Effective Code Transformations in C++Effective Code Transformations in C++
Effective Code Transformations in C++
 
Presentazione django reminiscence
Presentazione django reminiscencePresentazione django reminiscence
Presentazione django reminiscence
 
Sviluppare app native per iOS
Sviluppare app native per iOSSviluppare app native per iOS
Sviluppare app native per iOS
 
Sviluppare apps native per iOS - Lo Stretto Digitale
Sviluppare apps native per iOS - Lo Stretto DigitaleSviluppare apps native per iOS - Lo Stretto Digitale
Sviluppare apps native per iOS - Lo Stretto Digitale
 
Laravel Framework PHP
Laravel Framework PHPLaravel Framework PHP
Laravel Framework PHP
 
Javascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerJavascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesigner
 
Django: utilizzo avanzato e nuove funzionalità
Django: utilizzo avanzato e nuove funzionalitàDjango: utilizzo avanzato e nuove funzionalità
Django: utilizzo avanzato e nuove funzionalità
 
Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8
 
Programmazione e gestione della sicurezza: Verbale elettronico
Programmazione e gestione della sicurezza: Verbale elettronicoProgrammazione e gestione della sicurezza: Verbale elettronico
Programmazione e gestione della sicurezza: Verbale elettronico
 
Enterprise Applications - Angular Day 2018
Enterprise Applications - Angular Day 2018Enterprise Applications - Angular Day 2018
Enterprise Applications - Angular Day 2018
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScript
 
Repository pattern
Repository patternRepository pattern
Repository pattern
 

Odoo 8.0. Le nuove API.

  • 1. Le nuove API. Odoo 8.0 abstract per pycon6davide.corio@abstract.it /
  • 2. Nuove API, perchè? ● più object oriented ● stile più “pythonico” ● hooks ● risparmio di codice
  • 3. Principali novità ● uso dei decoratori ● recordsets ● environment ● nuovi fields ● nuovo metodo per defaults ● muovo metodo per onchange
  • 4. Environment Metodo più semplice ed ordinato per accedere ad informazioni comuni e soprattutto per incapsulare cr, uid, ids, context e recordsets.
  • 5. Environment esempio di migrazione da v7 a v8 # v7 def mio_metodo(self, cr, uid, ids, context=None): [...] # v8 def mio_metodo(self): [...]
  • 7. 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
  • 8. 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
  • 9. 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
  • 10. 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
  • 11. 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
  • 12. 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 = [...]
  • 13. 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()
  • 14. 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")
  • 15. 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>
  • 16. 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’)
  • 17. 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’
  • 18. 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’
  • 20. Q & A