Web Controller en Odoo

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda

En Odoo hi ha moltes maneres de comunicar-se amb el servidor:

  • Entrant en el backend
  • La pàgina web (frontend)
  • El TPV
  • Amb un API de XML-RPC per a aplicacions Java, Python o PHP.
  • Amb els controladors web per a consultes web o Ajax.

Si volem fer la web amb el CMS d'Odoo, cal aprendre a fer webs en Odoo. Però si el que volem és accedir a Odoo com un servidor Rest o similar des de una aplicació web diferent, hem de crear la interficie de servidor web amb Odoo i formular correctament les peticions Ajax.

En aquest manual la intenció és fer una aplicació web en Angular que consulte coses a Odoo.

Web Controllers

Quan fem un mòdul en scaffold, es crea el fitxer controllers/controllers.py, el qual està comentat, però que té un exemple molt útil de controlador.

Si analitzem les primeres línies:

class MyController(http.Controller):
    @http.route('/school/course/', auth='user', type='json')
    def course(self):
...

Veurem que és una classe que hereta de http.controller. A continuació hi ha un decorador que modifica la funció course() per a ser executada quan es demana la ruta especificada. Aquest decorador diu que necessita una autentificació d'usuari i que espera i retorna un json.

L'autentificació pot ser public, user o none.

En aquestes funcions es sol cridar a http.request.render amb una template per a fer html. Una altra opció és generar les dades directament en Python.

CORS en Odoo

Odoo no permet peticions Ajax que no vinguen del mateix origen que ell. Això ho podem canviar en cada route amb cors='*'

Si volem permetre CORS en tot odoo, el millor és instal·lar Ngingx, configurar-lo per a permetre CORS i fer que actue com a proxy d'Odoo.

Autenticació

En el directori d'addons d'Odoo, en el mòdul web/controller, trobem aquest codi:

    @http.route('/web/session/authenticate', type='json', auth="none")
    def authenticate(self, db, login, password, base_location=None):
        request.session.authenticate(db, login, password)
        return request.env['ir.http'].session_info()

Eixa és la ruta d'autentificació. Com es veu, accepta un json amb la base de dades, login, password...

Si vulguem fer una aplicació que connecte amb Odoo via web, deguem autenticar-nos. Anem a analitzar el que demana. Per a fer-ho utilitzarem el programa Postman

En aquest gif es veu el que hem de ficar en el Postman per a veure si funciona el API:

Postmanauthenticationodoo.gif

Podem copiar aquest codi per autenticar-nos en la ruta que necessitem. Cal importar:

from odoo.http import request

Observem que en la resposta va una Cookie que és la sessió. Si en el postman o en en navegador l'esborrem es perd la sessió.

Controllers amb JSON