Los Errores de Odoo
¿Qué significa cada mensaje de error de Odoo?
Odoo, mi buen amigo, esta campaña volveremo' a estar contigo. Si algo tiene Odoo con lo que todos los desarrolladores nos hemos tropezado más de una vez es con algún mensaje críptico de error. Esto pasa desde siempre y seguirá pasando, ya que Odoo no es ni será perfecto. Sin duda Odoo se encuentra entre los ERP más completos y flexibles de la actualidad, lo que trae errores desde su instalación hasta la implementación de un nuevo módulo. Esta entrada pretende ser una lista de errores comunes en distintos carteles (pop-up) o logs de Odoo, con su "traducción" y alguna posible línea de solución. Posiblemente la iremos editando con el paso del tiempo.
psycopg2.OperationalError: could not connect to server: No such file or directory
Uno de los errores clásicos, se suele presentar con la siguiente estructura:
psycopg2.OperationalError: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"? - - -
Es un error de la base de datos de PostgreSQL, como indica el psycopg2, y este en particular nos dice que el servicio de postgreSQL se encuentra apagado. Como muy grave puede ser un problema de permisos. En este caso yo probaría reiniciando el servidor de PostgreSQL, o comprobando el status del mismo.
Dependencia externa no resuelta
En ocaciones al instalar un nuevo módulo (generalmente de terceros) nos puede saltar un cartel a la mitad de la instalación con un mensaje de estructura similar al siguiente:
Imposible instalar el módulo "xx_xx" porqué hay una dependencia externa no resuelta: No module named xxx.
Esto ocurre porque falta una dependencia externa (casi siempre de Python) que no está instalada o no está bien instalada. La solución varía mucho, necesitamos identificar el módulo "xxx" y buscar que dependencias necesita y como se instala (normalmente con pip install es suficiente).
Su Sesión Expiró
Esto suele salir como cartel pop-up pero en la terminal vemos algo así:
_auth_method_userSessionExpiredException: Session expired
Esto suele pasar cuando intentamos conectarnos en una misma computadora con el mismo navegador. Odoo automáticamente cierra una sesión y nos sale ese cartel. Así que de necesitarlo mejor emplear otro navegador. También puede ocurrir con las cuentas de Odoo, al loguearse con la misma desde distintas terminales.
ValueError("Expected singleton: %s" % self)
Error muy frecuente al programar. Va acompañado de un modelo y un campo o solo un campo. Ocurre cuando Odoo está esperando recibir un solo dato y recibe muchos, es decir, una variable tipo lista (como un array). La solución es sencilla, si es una búsqueda en la base podemos agregar un limit=1, si es un proceso podemos seleccionar siempre el primer valor, lo ideal es hacer alguna restricción para comprobar que la variable sea una variable de un solo dato y no una lista.
psycopg2.ProgrammingError: no existe la relación
Otro error bastante común, tiene un formato de este tipo:
psycopg2.ProgrammingError: no existe la relación «_unknown»
LINE 1: ... FROM xx_xx, "_unknown"
Donde xx_xx es el nombre de un campo. Ocurre cuando creamos un campo en un nuevo módulo ya instalado, reiniciamos el servidor pero no actualizamos el módulo de parte de Odoo. Se soluciona normalmente con una simple actualización del módulo. Si el campo se está agregando a res.partner o a res.users, va a ser necesario reiniciar el server a la par que se actualiza el módulo.
RuntimeError: maximum recursion depth exceeded
Error típico, muy común al querer sobreescribir las funciones de write y create de Odoo, aunque podría saltar en otros momentos. Lo que nos dice es que estamos ejecutando una acción de forma recursiva, por ejemplo, estamos llamando dentro de cierto modelo una función write, pero dicho modelo ya tiene una función write, así que va a volver a llamarla, y así hasta el infinito. Lógicamente, Odoo no nos permite seguir.
La solución es variable, pero lo ideal es buscar una forma de cortar el proceso de write o create mediante una condición. Lo normal es que dicha condición sea comprobar si se modificó cierto dato. Acá un posible ejemplo:
@api.multi
def write(self, values):
res = super(MyModel, self).write(valuess)
if 'mi_campo' in values:
self.action_del_modelo()
odoo.exceptions.CacheMiss
De los errores más extraños de Odoo, se manifiesta como un popup y un mensaje en el log (en raras ocaciones como un mensaje en el log solamente) y ocurre al instalar o actualizar un módulo. Se ve con el siguiente formato:
odoo.exceptions.CacheMiss: ('xxx.yyy(10,).field', None)
Siendo xxx.yyy el nombre del modelo, el 10 es un número (puede ser cualquiera) hace referencia al número de ID del registro, y field hace referencia al nombre del campo. Ocurre cuando se limpia el caché de la base de datos y el valor de un campo, almacenado en caché, por consecuencia es eliminado. No hay una solución exacta, hay que tener mucha experiencia en PostgreSQL o puede optarse por borrar el registro (en caso de que solo sea uno o unos pocos).
psycopg2.errors.UniqueViolation
Este error es insólito, ya escribimos sobre el tema, tiene un formato de este estilo:
psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "xx_xx_constrain"
DETAIL: Key (name, company_id)=(Company, 1) already exists.
En este caso xx_xx_constrain es una condición para impedir crear un campo si ya existe que tienen algunos módulos. Suele pasar cuando hay un error en el servidor a medio instalar un módulo con determinadas características. La solución es un poco extensa, y el error es muy poco frecuente, pueden encontrarla en esta entrada.
Acerca de:
Ignacio Buioli
Licenciado en Artes Multimediales. Ha desarrollado numerosos proyectos de Multimedia así como también escrito artículos y traducido textos del mencionado tema. En Moldeo Interactive es Socio y Programador; encargándose, además, de gran parte de las redes y los cursos online.