Programacion Interactiva

Descubre una Nueva y Poderosa Herramienta.

FrameWork de Nueva Generacion

Acceso a tu Informacion desde cualquier Dispositivo con Navegador.

Enfoque en el Backend

Frontend de forma facil con Odoo y XML.

Creacion de Verticales

Creacion de nuevas Verticales Conquistando nuevos Mercados.

Tu marca aqui mismo

Llega a miles de personas.

Publicidad

miƩrcoles, 8 de julio de 2020

Crear Parches con Github / Gitlab

GESTIƓN DE PARCHES CON GIT



1. Creación del parche.

AdemÔs quizÔs no necesitamos hacer un merge completo sino aplicar un commit en especifico, si tenemos derecho de escritura en ambos branches podríamos hacer uso del git cherry-pick como se muestra a continuación.
?
1
2
git checkout master
git cherry-pick b0429c202bafde0bae7439d4ce70480b1b5604b3
En el ejemplo anterior se utiliza la llave SHA-1 que se le asigna a cada commit.
Sin embargo esto no soluciona el problema de que no tengamos derechos de escritura en el branch de destino. Para esto creamos un parche utilizando el comando format-patch como se puede apreciar en el siguiente comando:
?
1
2
3
git format-patch -1 e99b2cd8bafc5efc9d9b353d6fb5530e61a8c3ae
0001-Lmessages-theming.patch
En anterior comando tomara todo los cambios y generara un archivo cuyo nombre sera el comentario del commit.
Ahora bien si tenemos 99 commits y deseamos aplicar todo a master tenemos dos opciones.

1.1 Crear un patch por cada commit.

?
1
2
3
4
git format-patch master
0001-site_name-variable.patch
0002-wizard-and-preview.patch
Se aumentara el numero de consecutivo desde 0001 hasta llegar al ultimo en nuestro ejemplo a 0099-message-commit.patch

2.1 Crear un solo patch para todos los commits

?
1
git format-patch master --stdout > fix_master.patch
De esta forma en el archivo fix_master estarĆ­an todos los cambios.

2. Aplicar el parche.

Con el parche en nuestras manos y posicionados en el branch que deseamos aplicar el parche por ejemplo master debemos hacer algunas revisiones.
Primero verificar que archivos se van a modificar, para esto debemos obtener alguna estadísticas como se muestra a continuación.
?
1
2
3
4
5
6
git apply --stat fix_master.patch
 .../sites/default/themes/fancy/css/fancy.css       |   14 +++++++++
 .../sites/default/themes/fancy/js/main.js    |   31 ++++++++++++++++++++
 .../sites/default/themes/fancy/sass/fancy.sass     |   14 +++++++++
 .../sites/default/themes/fancy/templates/page.tpl.php     |    2 +
 4 files changed, 60 insertions(+), 1 deletion(-)
Si estamos seguros de que los cambios son los deseados debemos verificar que todos los cambios se aplicaran correctamente, esto porque quizƔs entre que se creo el parche y el estado actual las lineas de referencia en el archivo de destino utilizadas para aplicar el cambio hayan cambiado, esto lo hacemos con el siguiente comando.
?
1
2
git apply --check 0001-LM-messages-theming.patch
error: patch failed: .../sites/default/themes/fancy/template.php:4
Si la salida en vacía significa que se aplicara sin problemas y si es similar al ejemplo anterior nos indicara donde esta el problema, para lo cual tendremos dos opciones generar de nuevo el parche o ajustar el parche para remover las lineas erróneas.

Instalar Python-Pip Ubuntu 20.04/18.04

Instalación de Python PIP en Ubuntu 20.04


Solución al Error E: Unable to locate package python-pip



sudo apt-get install software-properties-common
sudo apt-add-repository universe
sudo apt-get update
sudo apt-get install python-pip

Instalación Alternativa

sudo add-apt-repository universesudo apt update sudo apt install python2
Usamos curl para descargar el get-pip.py script:
curl https://bootstrap.pypa.io/get-pip.py --output get-pip.py
Una ves descargado el script lo instalamos:
sudo python2 get-pip.py

jueves, 2 de julio de 2020

Tabla HTML a Imagen con Python

Codigo HTML volcado a una imagen con Python


https://pypi.org/project/imgkit/



EJEMPLO:


import imgkit

body = """
<html>
  <head>
    <meta name="imgkit-format" content="png"/>
    <meta name="imgkit-orientation" content="Landscape"/>
  </head>
  Hello World!
  </html>
"""

imgkit.from_string(body, 'out.png')


EJEMPLO CON UNA TABLA:




body_html="""
<style type="text/css">
.tg  {border-collapse:collapse;border-color:#aabcfe;border-spacing:0;}
.tg td{background-color:#e8edff;border-color:#aabcfe;border-style:solid;border-width:1px;color:#669;
  font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:15px 15px;word-break:normal;}
.tg th{background-color:#b9c9fe;border-color:#aabcfe;border-style:solid;border-width:1px;color:#039;
  font-family:Arial, sans-serif;font-size:14px;font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-0lax{text-align:left;vertical-align:top}
</style>
<table class="tg">
<tbody>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
  </tr>
</tbody>
</table>
"""


imgkit.from_string(body_html, '/tmp/tabla.png')


Para Ajustar el tamaƱo de la Imagen podemos enviar el parƔmetro options:


options = {'width': 350, 'disable-smart-width': ''}

imgkit.from_string(body_html, '/tmp/tabla.png', options=options)


La librerĆ­a depende de la utilidad WKHTMLTOPDF asi que asegurense de tenerla instalada antes de descargarla.


sudo apt-get install wkhtmltox




jueves, 25 de junio de 2020

AƱadir Firmas en Reportes Qweb Odoo

Firmas en Reporte Qweb


    Es muy comĆŗn que algunos documentos puedan ser requeridos con firmas de autorización o responsables o la firma de la recepción del cliente en un AlbarĆ”n, esto es muy sencillo a continuación voy a emplear un ejemplo hecho en el reporte de Licitaciones:



<template id="report_purchaserequisitions_signatures" inherit_id="purchase_requisition.report_purchaserequisitions">
        <xpath expr="//div[@class='oe_structure'][2]" position="after">
           <div style="position:absolute;top:850px; page-break-inside: avoid;">
                <table border="0" style="border-collapse:collapse;color:000000;width:100%" cellpadding="3" cellspacing="3">
                   <tr>
                        <td class="text-center">
                            <strong style="font-size:12px;">Responsable</strong>
                        </td>
                          <td class="text-center">
                              <strong style="font-size:12px;">Autorizó</strong>
                          </td>
                    </tr>
                    <tr>
                         <td><br/></td>
                         <td><br/></td>
                     </tr>
                    <tr>
                        <td class="text-center">________________________</td>
                        <td class="text-center">________________________</td>
                    </tr>
                    
                     <tr>
                        <td class="text-center">
                            <strong style="font-size:12px;"><span t-field="o.user_id.partner_id"/></strong>
                        </td>
                        <td class="text-center">
                            <strong style="font-size:12px;"><span t-field="o.user_approved_id.partner_id"/></strong>
                        </td>
                     </tr>
                </table>
                        
            </div>
        </xpath>
    </template>

En el ejemplo anterior de autorización lo mas importante es mencionar que el campo user_approve_id es un campo añadido por medio de herencia de clases y este valor se ingresa al confirmar una Licitación.

El estilo empleado:


style="position:absolute;top:850px; page-break-inside: avoid;"

Tiene como función que las firmas aparezcan al final del documento

jueves, 18 de junio de 2020

Install OpenJDK 11 Linux - Instalar OpenJDK 11 en Linux

Step 1 – Search OpenJDK Packages

OpenJDK packages are available under native apt repositories. You can simply use apt-cache search command to search the available java version for your Ubuntu system.
apt-cache search openjdk
As per above output, you can see openjdk-11-* and openjdk-8-* is available in the package manager.

Step 2 – Install JAVA (OpenJDK)

Use the below command to install OpenJDK on your Debian based systems using the package manager from the default repository. The below commands will install Java Development Kit (JDK) and Java Runtime Environment (JRE) both on your system. You can install JRE package only to setup Runtime Environment only.
OpenJDK 11
sudo apt-get install openjdk-11-jre openjdk-11-jdk
OpenJDK 8
sudo apt-get install openjdk-8-jre openjdk-8-jdk

viernes, 12 de junio de 2020

Campos solo lectura en grupos especificos

Como visualizar campos en solo lectura dependiendo de un grupo de usuarios



Lo primero es crear tu grupo:


    <record id="purchase_fields_readonly" model="res.groups"> 

        <field name="name">Compras - Campos en solo lectura</field>

    </record>

Posterior heredar tu vista  y poner dentro de la vista heredada los grupos que podrĆ”n visualizarla:


      <record model="ir.ui.view" id="purchase_fields_readonly">
        <field name="name">purchase.order</field>
        <field name="model">purchase.order</field>
        <field name="inherit_id" ref="purchase.purchase_order_form"/>
        <field name="groups_id" eval="[(6, 0, [ref('purchase_readonly_fields.purchase_fields_readonly') ])]" />                
        <field name="arch" type="xml">
            <xpath expr="//field[@name='order_line']/tree/field[@name='date_planned']" position="attributes">
                <attribute name="context">{'readonly_by_pass': True}</attribute>
                <attribute name="readonly">1</attribute>
                <attribute name="required">False</attribute>
            </xpath>
        </field>
      </record>

Del resto se encarga Odoo al renderizar las vistas por usuario y los permisos de acceso a determinadas vistas.

sƔbado, 6 de junio de 2020

Mineria del archivo log de Odoo

Comando para obtener información del archivo de registro (log)




Alguna ves te has visto en la necesitad de saber quien elimino ciertos registros de una tabla en el sistema Odoo, esto no lo podemos conocer en una base de datos de postgres o no sin tener los conocimientos avanzados que nos permitan realizar una consulta o una configuración dentro del gestor de base de datos ya que Odoo no guarda esa información dentro del sistema, una opción muy facil es utilizar nuestro archivo log, para ello podemos utilizar el siguiente comando:



find /var/log/odoo/odoo-server.log -exec grep 'deleted mail.message' '{}' +


Lo mas importante dentro del comando es el mensaje que queremos buscar dentro de nuestro archivo log, por ejemplo quien elimino los registros de la tabla de  mensajerĆ­a, esto al final arrojara tanta información de acuerdo al tamaƱo de nuestra base de datos, podemos minimizar los registros aƱadiendo mas filtros a la bĆŗsqueda como por ejemplo un periodo de x a y fechas: