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, 5 de agosto de 2020

Revision Bloqueos de Base de datos por medio de una Vista

Generación de una vista para Monitorear bloqueos de tablas en nuestra Base de Datos


El primer punto seria conectarnos a nuestra base de datos, exportando nuestros accesos o de la forma tradicional:


sudo su postgres

psql MI_BASE

Ejecutamos el sig. fragmento:


CREATE VIEW lock_monitor AS(
SELECT
  COALESCE(blockingl.relation::regclass::text,blockingl.locktype) as locked_item,
  now() - blockeda.query_start AS waiting_duration, blockeda.pid AS blocked_pid,
  blockeda.query as blocked_query, blockedl.mode as blocked_mode,
  blockinga.pid AS blocking_pid, blockinga.query as blocking_query,
  blockingl.mode as blocking_mode
FROM pg_catalog.pg_locks blockedl
JOIN pg_stat_activity blockeda ON blockedl.pid = blockeda.pid
JOIN pg_catalog.pg_locks blockingl ON(
  ( (blockingl.transactionid=blockedl.transactionid) OR
  (blockingl.relation=blockedl.relation AND blockingl.locktype=blockedl.locktype)
  ) AND blockedl.pid != blockingl.pid)
JOIN pg_stat_activity blockinga ON blockingl.pid = blockinga.pid
  AND blockinga.datid = blockeda.datid
WHERE NOT blockedl.granted
AND blockinga.datname = current_database()
);


Ahora para visualizar los bloqueos en tiempo real solo tendremos que ejecutar la vista:


SELECT * from lock_monitor;

Si en algún momento decidimos eliminar el proceso que esta bloqueando nuestra tabla, ya sea por que se ciclo en Odoo o nos esta provocando un retraso en la operación el comando seria el siguiente:



SELECT pg_terminate_backend();

Dentro de los parentesis tendremos que meter el PID (ID del proceso) que queremos matar o eliminar este nos los arroja la vita del monitor.


martes, 4 de agosto de 2020

Demonio - Servicio para Odoo13 Ubuntu 17.x Ubuntu 18.x Ubuntu 20.x

Servicio Systemctl en Ubuntu para nuestra instalación de Odoo
Fácil y Rápido


Creamos el servicio en la ruta: /usr/lib/systemd/system

Usamos el comando nano /usr/lib/systemd/system/odoo-server.service y pegamos la instrucción en mi caso mi Odoo esta en el directorio /odoo13


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[Unit]

Description=Servicio Arranque Odoo13

After=network.target

[Service]

Type=simple

Restart=always

RestartSec=1

User=odoo

ExecStart=/usr/bin/python3 /odoo13/odoo-bin -c /odoo13/odoo-server.conf



[Install]

WantedBy=multi-user.target

Reiniciamos los para ctualziar los nuevos servicios disponibles:

systemctl daemon-reload

Iniciamos como prueba nuestro servicio:

systemctl start odoo-server

Habilitamos con el servicio para iniciar con el Sistema Operativo:

systemctl enable odoo-server


NOTAS:
El directorio de Python es obligatorio, se tiene que escribir la ruta completa del binario de python ya sea que este en la ruta por defecto o que lo hayamos compilado manualmente.

martes, 14 de julio de 2020

Obtener registros Hijos de un registro Padre en Odoo

Como utilizar child of para buscar registros hijos en Odoo



Algo muy frecuente y que estoy seguro que te as preguntado es como poder obtener las categorías hijas de un registro, por ejemplo en los modelos:

  • Ubicaciones
  • Categorias
  • Partners

Existen columnas dentro de los lineamientos de Odoo que nos permiten tener un control en un esquema de arbol:
  • Parent Left
  • Parent Right
  • Parent ID

Con estos campos podemos saber de donde la estructura de la que se compone nuestro registro y por medio de ellas buscar sus hijos:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
## Iniciamos nuestra lista final ###
all_record_ids = []
#### La variable que usare como ejemplo es record, que es una instancia de un registro de X tabla que usa el esquema de hijos ###
#### Iniciamos nuestro dominio, en este ejemplo usare una variable para no tener todo en una sola linea ####
child_dom = [('parent_left', '>', record.parent_left), ('parent_left', '<', record.parent_right)] 
#### Buscamos los registros que cumplen mi condicion ####
child_records = self.search(child_dom)
#### Agregamos a mi lista final, el registro principal (record) y agregamos los hijos ####
all_record_ids.append(record.id)
all_record_ids=all_record_ids+child_records.ids


Yo por ejemplo, necesitaba saber las categorías hijas de un registro en donde mi variable era category:

1
2
3
product_category = self.env['product.category']
child_dom = [('parent_left', '>', category.parent_left), ('parent_left', '<', category.parent_right)] 
child_categs = product_category.search(child_dom)

jueves, 9 de julio de 2020

Descomprimir lista de archivos ZIP Bash

#1: Descomprimir utilizando un comodin (instrucción corta)

La sintaxis es la siguiente:
unzip '*.zip'
Un ejemplo facil:
$ cd /disk2/images/
$ unzip '*.zip'
$ ls -l
Nota*.zip se encuentra dentro de comillas simples.

#2: Descomprimir utilizando un bucle (instrucción larga)

La Sintaxis es la siguiente:
 for z in *.zip; do unzip $z; done
Gracias.

miércoles, 8 de julio de 2020

Numero a Letra Correspondiente (Excel) - Función Python

Función para transformar un indice a su letra correspondiente
(Similar a las columnas en Excel)



El siguiente método me resulto muy útil al momento de realizar un reporte en Excel con columnas dinámicas, por medio de un indice que podia incrementar el no. de columnas a insertar, con ello logre tener un reporte muy dinamico, mi problema era conocer que letra le correspondía al indice, ya que desconocía el no. de columnas finales.

Mi problema lo solucione con el siguiente metodo:


1
2
3
4
5
6
7
8
def indice_to_column_string(n):
    string = ""
    while n > 0:
        n, remainder = divmod(n - 1, 26)
        string = chr(65 + remainder) + string
    return string

print(indice_to_column_string(28))


La variable que recibe mi metodo es el indice del cual quisiera saber la columna correspondiente.


IPV6 Linux check - Visualizar nuestra IP V6 Linux

Show IPv6 - Mostra IPv6 Linux

 

Existen varias formas, por ejemplo el siguiente comando:


1
ip addr show dev eth0 | sed -e's/^.*inet6 \([^ ]*\)\/.*$/\1/;t;d'

Otro comando que nos arroja la IPv6:

1
/sbin/ifconfig | grep inet6

El caso de tener error al utilizar ifconfig, debemos instalar las aplicaciones de net-tools:


1
sudo apt-get install net-tools

RSA KEY (PRIVATE KEY) TO PPK KEY


Llave RSA a PPK

How to use puttygen

On Arch Linux its simple…
pacman -S putty

On RHEL/Centos:
yum install putty

Fedora:
dnf install putty

Debian/Ubuntu try…
apt-get install putty-tools

Then cd to path of key(s):
puttygen keyname -o keyname.ppk
Make sure you’ve replaced the “keyname” with your private key filename.

Reference:
https://www.ssh.com/ssh/putty/ – Putty official page.
https://www.ssh.com/ssh/keygen/ – ssh-keygen tool.
https://www.ssh.com/ssh/putty/linux/puttygen – Command line.
https://www.ssh.com/ssh/putty/windows/puttygen – PuTTYgen Windows.

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.