Odoo 8 - PyCon Nove · . Q & A. Davide Corio [email protected] ...

21
Le nuove API. Odoo 8.0 abstract per pycon6 [email protected] /

Transcript of Odoo 8 - PyCon Nove · . Q & A. Davide Corio [email protected] ...

Page 1: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Le nuove API.

Odoo 8.0

abstract per [email protected] /

Page 2: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Nuove API, perchè?● più object oriented● stile più “pythonico”● hooks● risparmio di codice

Page 3: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Principali novità● uso dei decoratori● recordsets● environment● nuovi fields● nuovo metodo per defaults● muovo metodo per onchange

Page 4: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

EnvironmentMetodo più semplice ed ordinato per accedere ad informazioni comuni e soprattutto per incapsulare cr, uid, ids, context e recordsets.

Page 5: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Environmentesempio di migrazione da v7 a v8

# v7def mio_metodo(self, cr, uid, ids, context=None):

[...]

# v8def mio_metodo(self):

[...]

Page 6: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Environmentaccedere all’environment

def mio_metodo(self):self.env

# oppure# oggetto.env

Page 7: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Environment

# accedere all’utenteipdb> self.env.userres.users(1,)

# accedere a records tramite XML idipdb> self.env.ref('base.main_company')res.company(1,)

# invalidare cacheipdb> self.env.invalidate_all()

# ricalcolare campi calcolatiipdb> self.env.recomputeTrue

Page 8: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Environmentaltri 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

Page 9: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Decoratori● @api.model

from openerp import models, api

class MioModello(models.Model):[...]

@api.modeldef create(self, values):

# self è un recordset

def create(self, cr, uid, values, context=None):# self non è un recordset

Page 10: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Decoratori● @api.multi

from openerp import models, api

class MioModello(models.Model):[...]

@api.multidef write(self, values):

# self è un recordset

def write(self, cr, uid, ids, values, context=None):# self non è un recordset

Page 11: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Decoratori● @api.one

from openerp import models, api

class MioModello(models.Model):[...]

@[email protected](‘account.invoice’)def mio_metodo(self):

[...]return invoice

# ritorna un recordset di N fatture

Page 12: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

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 = [...]

Page 13: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Decoratori● @api.depends

from openerp import models, api

class MioModello(models.Model):[...]iniziali = fields.Char(compute='_calcola_iniziali')

@[email protected]('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()

Page 14: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Decoratori● @api.constrains

from openerp import models, api[...]

class MioModello(models.Model):[...]

@[email protected]('campo1', 'campo2')def mio_metodo(self):

if self.campo1 == self.campo2: raise ValidationError("Messaggio di errore")

Page 15: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Recordset● istanza della classe del modello

ipdb> selfaccount.invoice(9,)ipdb> invoices = self.search([])ipdb> invoicesaccount.invoice(1, 6, 5, 4, 3, 2, 9, 7, 8)ipdb> invoices[6].numberu'SAJ/2015/0001'ipdb> invoices.__class__<class 'openerp.api.account.invoice'>ipdb>

Page 16: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

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’)

Page 17: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Nuovi fields● addio _columns e _defaults (!!)

from openerp import fields

# default staticotesto_con_default = fields.Char(‘Testo’, default=’testo predefinito’)

# funzione per calcolo defaulttesto_con_default = fields.Char(‘Test’, default=_una_funzione)

def _una_funzione(self):return ‘testo predefinito’

Page 18: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Nuovi fields● relazioni più semplici● campi calcolati più semplici

from openerp import fields

# campo relatedcampo_relazionato = fields.Char(‘Testo’, related=’altro_campo_di_testo’)

# campo calcolatocampo_calcolato = fields.Char(‘Testo’, compute=’_una_funzione’, store=True)

def _una_funzione(self):return ‘testo predefinito’

Page 19: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Documentazione● https://www.odoo.com/documentation/8.0/reference.html● http://odoo-new-api-guide-line.readthedocs.org/en/latest/index.html

Page 20: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Q & A

Page 21: Odoo 8 - PyCon Nove · . Q & A. Davide Corio davide.corio@abstract.it ...

Davide [email protected]