Cómo crear vistas en Odoo con YAML

La documentación de Odoo 8.0 explica cómo crear ficheros de datos XML y CSV, pero se olvida de explicar los YAML, tal como hacía la antigua documentación de Odoo 6.0.

En cualquier caso, no he encontrado en ninguna parte cómo crear vistas usando YAML (técnicamente, combinándolo con XML), así que aquí va un ejemplo que enseguida entenderá todo aquel que esté acostumbrado a crear vistas en XML.

Esto sería el XML, extraído del fichero openacademy/views/openacademy.xml del tutorial:

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <!-- Full id location:
             action="openacademy.course_list_action"
             It is not required when it is the same module -->

        <!-- session form view -->
        <record model="ir.ui.view" id="session_form_view">
            <field name="name">session.form</field>
            <field name="model">openacademy.session</field>
            <field name="arch" type="xml">
                <form string="Session Form">
                    <sheet>
                        <group>
                            <field name="name"/>
                            <field name="start_date"/>
                            <field name="duration"/>
                            <field name="seats"/>
                        </group>
                    </sheet>
                </form>
            </field>
        </record>

        <record model="ir.actions.act_window" id="session_list_action">
            <field name="name">Sessions</field>
            <field name="res_model">openacademy.session</field>
            <field name="view_type">form</field>
            <field name="view_mode">tree,form</field>
        </record>

        <menuitem id="session_menu" name="Sessions"
                  parent="openacademy_menu"
                  action="session_list_action"/>
    </data>
</openerp>

Y esto es exactamente lo mismo en YAML (lo guardaríamos como openacademy/views/openacademy.yml):

# Full id location:
# action="openacademy.course_list_action"
# It is not required when it is the same module

# Session form view
- !record {model: ir.ui.view, id: session_form_view}
    name: session.form
    model: openacademy.session
    arch: |
        <form string="Session Form">
            <sheet>
                <group>
                    <field name="name"/>
                    <field name="start_date"/>
                    <field name="duration"/>
                    <field name="seats"/>
                </group>
            </sheet>
        </form>
    
- !record {model: ir.actions.act_window, id: session_list_action}
    name: Sessions
    res_model: openacademy.session
    view_type: form
    view_mode: tree,form

- !menuitem {id: session_menu, 
             name: Sessions
             parent: openacademy_menu
             action: session_list_action}

Como ves, al crear la vista al final hay que acabar usando XML, pero desde luego el resto del documento se beneficia bastante de la sintaxis YAML.

La pega es que será complicado que encuentres un editor de texto que te resalte la sintaxis de XML y YAML en el mismo documento. Quizá convenga usar XML para las vistas y YAML para lo demás.

Por cierto, los elementos tipo !record son constructores personalizados de Odoo (es decir, no es YAML estándar). Consulta el fichero yaml_tag.py para ver todos los que hay.

La lentitud de la encriptación en Android

Problema

Mi tableta estaba encriptada e iba soporíferamente lenta.

Me extrañaba porque tengo un móvil con un hardware casi idéntico que va muy fluido, así que instalé en ambos Geekbench 3, que analiza el rendimiento del procesador y la RAM. En ambos terminales la puntuación fue casi idéntica (bueno, la velocidad de RAM en el móvil era el doble, pero es normal porque tiene el doble de RAM).

Diagnóstico

Caí en la cuenta de que la tableta estaba encriptada y el móvil no, así que instalé A1 SD Bench en ambos y pude comprobar que, donde el móvil daba una velocidad de lectura/escritura de 7MiB/s y 17MiB/s respectivamente, la tableta daba 7MiB/s y 6MiB/s.

Solución

Decidí desencriptar la tableta (hay que resetearla para ello) y ver si era ahí donde estaba el cuello de botella, y parece que sí, porque ahora me da 33MiB/s y 12MiB/s, es decir el 200% al escribir y el 550% al leer.

Conclusión: si piensas encriptar tu Android, evalúa su velocidad antes y después, y piensa si te vale la pena.

Cómo evitar que journald use demasiado espacio en disco duro

Para conocer cuánto espacio están ocupando los registros en tu sistema:

$ journalctl --disk-usage

Si te parece demasiado lo que te dice, reduzcámoslo por ejemplo a 250MB. Para ello, añade o modifica esta línea en /etc/systemd/journald.conf:

SystemMaxUse=250M

Ahora reiniciaremos el servicio para que limpie los logs antiguos:

# systemctl restart systemd-journald.service

Cómo conectar remotamente a mi escritorio GNOME 3

Problema

Antiguamente podíamos configurar conexiones a nuestro escritorio Linux a través del protocolo FreeNX o su descendiente directo X2Go, pero poco a poco va haciéndose más imposible, ya que los escritorios completos modernos (GNOME 3, KDE, Cinnamon) utilizan ciertas extensiones de X11 (GLX, si no me equivoco) que no son compatibles con esos protocolos. En cualquiera de los casos, al ser ambos protocolos basados directamente en X11, y teniendo en cuenta que en breve X11 va a empezar a desaparecer en favor de Wayland y Mir, deduzco que NX y derivados también tenderán a desaparecer, ya que ni son ni serán compatibles.

Solución propuesta

Visto lo anterior, recurriremos al protocolo VNC, que es bastante más pobre que los otros mencionados, ya que es inseguro, no soporta autenticación por clave pública, no permite iniciar sesión (tan solo se conecta a una sesión que ya esté abierta) y ofrece peor compresión.

¿Por qué recurrimos a él entonces? Parece que es el que soporta oficialmente GNOME 3 y el más fácil de configurar, y dentro de lo que cabe se puede hacer más seguro pasándolo por un túnel SSH.

Cómo configurarlo

Servidor VNC

Para empezar, vamos a Configuración > Compartir > Compartición de la pantalla, y la activamos:

Activar el servidor VNC en el puerto 9000
Activar el servidor VNC en el puerto 9000

 

Como podéis observar en la foto, nos da la opción de usar una contraseña o no:

  • Si estableces una contraseña, podrás conectar siempre que quieras si te la sabes.
  • Si no pones contraseña, al solicitar conexión aparecerá en el escritorio un cartel avisando al usuario local de que alguien quiere conectarse remotamente a su escritorio, y dándole la opción a aceptar o rechazar dicha conexión.

Como en nuestro caso se supone que no habrá nadie sentado en la máquina cuando queramos conectarnos desde fuera, optaremos por poner una contraseña.

Esto pone a escuchar el servicio VNC en el puerto 9000, pero este puerto no lo publicaremos en el router.

Servidor SSH

A continuación activaremos el inicio de sesión remoto, que es como llaman al servidor SSH:

Activar el servidor SSH en el puerto 22
Activar el servidor SSH en el puerto 22

Esto pone a escuchar el servidor SSH en el puerto 22.

A continuación, tendrás que ponerle una IP fija a tu ordenador y configurar tu router para que redirija un puerto público (puede ser el 22 o cualquier otro) al puerto 22 de tu ordenador.

Puesto que cada red y cada router es diferente, asumiré que sabes cómo realizar estos pasos o cómo usar un buscador de Internet. Si no dispones de una IP pública fija, tal vez te interese también buscar información sobre DNS dinámico. Quizá te interese también saber cómo bloquear los ataques por SSH, que sin duda empezarás a recibir.

Para este ejemplo, supondremos que redireccionamos el puerto 22000 del router al puerto 22 del ordenador, y que hemos habilitado el inicio de sesión por clave pública.

Cliente Remmina

Hecho todo esto, ya tenemos el equipo servidor listo para recibir conexiones remotas (siempre que se deje la sesión local abierta, recuerda). Ahora hay que ir al otro ordenador desde el que te conectarás (el que hará de cliente) y configurarlo. Usaremos Remmina; si prefieres otro, configúralo igual y ya está.

Primero hay que instalarlo. En Fedora 21 es:

# dnf install remmina-plugins-vnc

Creamos una nueva conexión como la siguiente:

Configurar la conexión VNC. La contraseña es la que hemos puesto antes al compartir el escritorio.
Configurar la conexión VNC. La contraseña es la que hemos puesto antes al compartir el escritorio.
Configurar el túnel SSH para la conexión VNC. Hay que usar el puerto que hayas abierto en tu router (si es el 22, basta con marcar la opción "Mismo servidor en el puerto 22"). Si no has puesto autenticación con clave pública, marca la opción "Contraseña".
Configurar el túnel SSH para la conexión VNC. Hay que usar el puerto que hayas abierto en tu router (si es el 22, basta con marcar la opción “Mismo servidor en el puerto 22″). Si no has puesto autenticación con clave pública, marca la opción “Contraseña”.

Pulsa Conectar y listo.

Conclusión

Es lamentable que sigamos dependiendo de VNC para estos menesteres. Espero que, con la llegada de Wayland y los avances del equipo de FreeRDP, pronto veamos una opción por defecto para compartir por RDP, que parece que hoy en día es la única alternativa digna, pero en Linux está bastante atrasada.

Corregir error “Could not get content for X defined in bundle ‘X'” en Odoo 8.0

Problema

Hoy tras actualizar mi Odoo, me he encontrado estos errores al entrar:

Could not get content for /website/static/src/css/bootswatch/spacelab.min.css defined in bundle 'website.assets_frontend'.
Could not get content for /website/static/src/css/bootswatch/spacelab.fix.css defined in bundle 'website.assets_frontend'.
Could not get content for /website/static/src/css/website.css defined in bundle 'website.assets_frontend'.
Could not get content for /website_mail/static/src/css/website_mail.css defined in bundle 'website.assets_frontend'.
Could not get content for /website_blog/static/src/css/website_blog.css defined in bundle 'website.assets_frontend'.

Un error un tanto extraño.

Diagnóstico

Revisando los registros, encontré este error:

ERROR ? werkzeug: Error on request:
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/werkzeug/serving.py", line 177, in run_wsgi
    execute(self.server.app)
  File "/usr/lib/python2.7/site-packages/werkzeug/serving.py", line 165, in execute
    application_iter = app(environ, start_response)
  File "/usr/lib/python2.7/site-packages/openerp/service/server.py", line 281, in app
    return self.app(e, s)
  File "/usr/lib/python2.7/site-packages/openerp/service/wsgi_server.py", line 216, in application
    return application_unproxied(environ, start_response)
  File "/usr/lib/python2.7/site-packages/openerp/service/wsgi_server.py", line 202, in application_unproxied
    result = handler(environ, start_response)
  File "/usr/lib/python2.7/site-packages/openerp/http.py", line 1274, in __call__
    self.load_addons()
  File "/usr/lib/python2.7/site-packages/openerp/http.py", line 1293, in load_addons
    m = __import__('openerp.addons.' + module)
  File "/usr/lib/python2.7/site-packages/openerp/modules/module.py", line 79, in load_module
    mod = imp.load_module('openerp.addons.' + module_part, f, path, descr)
  File "/opt/odoo/extra-addons/l10n-spain/account_balance_reporting_xls/__init__.py", line 8, in <module>
    from . import report
  File "/opt/odoo/extra-addons/l10n-spain/account_balance_reporting_xls/report/__init__.py", line 7, in <module>
    from . import reporting_xls
  File "/opt/odoo/extra-addons/l10n-spain/account_balance_reporting_xls/report/reporting_xls.py", line 5, in <module>
    import xlwt
ImportError: No module named xlwt

Al parecer, tras actualizar los módulos comunitarios del paquete l10n-spain, se introdujo una nueva dependencia (xlwt) que no ha quedado satisfecha. Como ese módulo no se ha cargado, el proceso se ha interrumpido y no ha llegado a cargar el módulo website, que es en el que se encuentran los CSS que me daban error al principio.

Solución

# yum install python-xlwt

Evidentemente, dependiendo de cuál sea el fallo en tu Odoo, deberás instalar un paquete u otro. Sigue mis pasos y llegarás en seguida al problema.

Por ejemplo, en mi caso, además de esto tuve que añadir el repositorio comunitario reporting-engine.

Ver emojis en Linux

Los emojis son la evolución de los emoticonos. Mientras que tradicionalmente los emoticonos eran combinaciones de caracteres básicos, como :-) o ¬_¬', los emojis son cada cual un carácter Unicode (la codificación de caracteres internacional estándar) concreto.

Los móviles iOS y Android los muestran por defecto, cada cual en su estilo particular, pero si alguien con un móvil de esos nos manda un e-mail, probablemente no veamos esos iconos correctamente en nuestro ordenador Linux.

Para poder verlos bien, simplemente instala la fuente Symbola. La puedes descargar directamente y copiarla en ~/.fonts/, o instalar el paquete correspondiente.

Debian y derivados:

# apt-get install ttf-ancient-fonts

Fedora y derivados:

# dnf install gdouros-symbola-fonts

La forma más fácil de rootear un teléfono Android (Framaroot)

Curiosamente, tras leer la explicación teórica de cómo funciona el rooteo en Android me di cuenta de que la mayoría de métodos que se usan son exploits para versiones antiguas de Android, y que nunca se parchean porque los operadores no actualizan los sistemas operativos de sus clientes.

De este modo, si da la casualidad de que tu móvil es vulnerable a uno de los exploits conocidos, con la aplicación Framaroot puedes rootearlo con un click.

Simplemente descarga e instala desde tu móvil la última versión de Framaroot, escoge Install SuperSU, y pulsa sobre un exploit de tu elección. Un cartel saldrá diciendo si ha funcionado. Si ha funcionado, reinicia y listo; si no, prueba con otro exploit.

Cómo encender un teléfono Android con el botón de encender roto

Bastante típico: se te ha estropeado el botón de encender el teléfono y te has quedado sin teléfono.

Solución: Con la batería puesta, enchúfale el cargador exactamente 3 segundos, y entonces desenchúfalo. Si ves que aparece el dibujo de la batería cargándose es que has tardado demasiado, pero vuelve a probar.

Ahora, intenta que no se te vuelva a apagar. Para ello, si ves que tiene baja batería, ponlo en modo avión, desactívale el GPS y deja la pantalla apagada hasta que lo vuelvas a cargar. En este estado, el teléfono puede durar varios días sin que se le gaste la batería.

Dar permiso a un grupo de usuarios de AD para reiniciar el servicio de cola de impresión en Windows

Problema

Resulta que Windows tiene un problema con HP (o HP con Windows, qué mas da) y su controlador Universal Print Driver, que provoca que prácticamente cualquier programa se bloquee al imprimir esperando indefinidamente a que termine el proceso de impresión (splwow64.exe).

Parche

Tras perder una ingente cantidad de horas tratando de comprender y resolver el problema, di con un workaround, que es ejecutar este ficherito. Llamémoslo reiniciar_impresoras.bat:

sc stop spooler
taskkill /f /im splwow64.exe
sc start spooler

Básicamente, lo que hace es parar el proceso Cola de impresión (spooler), matar todos los subprocesos splwow64.exe colgados que queden y volver a levantar el servicio.

Vamos, lo que todo el mundo conoce como apagar y volver a encender, pero solo del proceso colgado.

Nuevo problema

Tienes que ser el Administrador para que esto funcione. Claro, en un entorno con más de 20 usuarios, no puedo dar esos permisos a cualquiera.

Dando permisos por servicio a los usuarios

Lo primero que vamos a hacer es respaldar los permisos actuales del servicio, para poder restaurarlos en caso de romperlo todo involuntariamente (cosa bastante fácil con estos asuntos). Para ello, ejecuta como administrador este comando y guarda bien todo el texto que te devuelva:

sc sdshow spooler

En mi caso devuelve:

D:(A;;CCLCSWLOCRRC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWRPWPDTLOCR‌​RC;;;SY)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

Como todo el entorno está montado con un Active Directory (llamémoslo MiDominio), crea un grupo de usuarios al que le daremos luego permiso para reiniciar ese servicio. Lo llamaremos ReiniciarImpresoras.

Descárgate la utilidad SetACL (versión Administrators).

Ahora, siguiendo las instrucciones y la documentación, estableceremos el permiso para que los usuarios del grupo ReinicarImpresoras puedan reiniciar el servicio de Cola de impresión. Supongamos que la máquina en la que estamos trabajando se llama MiMaquina. Ejecuta lo siguiente como administrador:

SetACL.exe -on \\MiMaquina\spooler -ot srv -actn ace -ace "n:MiDominio\ReiniciarImpresoras;p:start_stop"

Ahora tus usuarios podrán ejecutar el script reiniciar_impresoras.bat cada vez que se les bloqueen.