Odoo shell

Da PNLUG.
Versione del 24 apr 2017 alle 14:43 di Loristissino (Discussione | contributi) (Aggiunto esempio di script)

Istruzioni python eseguite da shell

Può essere comodo, per diversi motivi, eseguire dei comandi python (in maniera interattiva o con degli script) in una shell, interagendo con tutto l'ambiente messo a disposizione da odoo.

Per avere a disposizione una shell in cui eseguire dei comandi, è sufficiente aggiungere il sottocomando odoo al comando di avvio. Ad esempio (con riferimento allo script di avvio preparato per gli incontri del LUG dedicati allo sviluppo):

#!/bin/sh

# questo script, odoo_cli.sh, avvia odoo con una shell interattiva
# utilizzando il database tutorial1 e gli addon indicati

ODOOHOME=~/odoo-dev
$ODOOHOME/OCB/odoo-bin shell -d tutorial1  --addons-path=$ODOOHOME/OCB/addons,$ODOOHOME/addons_ita,$ODOOHOME/addons,$ODOOHOME/custom_addons

Con l'esecuzione di questo script non verrà avviato, come di consueto, il server web interno di odoo, ma si aprirà invece una shell nella quale, in maniera interattiva, sarà possibile eseguire dei comandi.

Type "help", "copyright", "credits" or "license" for more information.
(Console)
>>> self
res.users(1,)
>>> self.name
u'Administrator'
>>> type(self)
<class 'odoo.api.res.users'>
>>> env
<odoo.api.Environment object at 0x7f363f222290>

Nella shell, self è un'istanza del Recordset Model res.users e -- in particolare -- quello con id=1, ossia Administrator.

Esecuzione di script

Per cose più complesse, naturalmente, è possibile preparare degli script da far eseguire alla shell, che quest'ultima leggerà dallo standard input. Ad esempio, supponendo di avere uno script test.py nella directory odooscripts, si potrà digitare il comando

./odoo_cli.sh < test.py

Esempi di script

Qui di seguito descriviamo qualche script per dare l'idea di che cosa si possa fare e come farlo. Faremo riferimento ad una classe, "TodoTask", descritta nel libro "Odoo 10 Development Essentials".

Cerca e mostra

Questo script recupera tutti i task con determinate caratteristiche e ne mostra le informazioni rilevanti sullo standard output:

# -*- coding: utf-8 -*-

'''
This script is meant to be executed inside the odoo shell,
not on its own
'''

def print_tasks(tasks):
    for task in tasks:
        print "\t".join([str(task.id), task.name, str(task.is_done) ])
        # prints relevant info of the tasks


TodoTask = self.env['todo.task']
# retrieves a Recordset Model for the TodoTask class

tasks = TodoTask.search([])
# retrieves all active tasks

print "Task attivi (non eliminati)"
print_tasks(tasks)
  
tasks = TodoTask.search([ ('is_done', '=', True) ])
# retrieves current tasks (ie, not marked as done)
# see https://www.odoo.com/documentation/saas-13/reference/orm.html#domains

print "Task correnti (ancora da completare)"
print_tasks(tasks)

tasks = TodoTask.search([ ('active', '=', False) ])
# retrieves deleted tasks (ie, marked as not active)

print "Task eliminati"
print_tasks(tasks)