miércoles, 14 de febrero de 2024

Python (I) Web Services Client (I) . Castilla. Python environment. Dependencias Odoo

0. Instalar última versión de python

Seguimos las instrucciones de HowToGeek 

#1. Actualizamos
sudo apt update

#2. Instalamos dependencias
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev

#3.Descargar la ultima version de Python de https://www.python.org/downloads/source/

#4. Ir a la crpeta donde se ha descargado por ejemplo Downloads 
cd ~Downloads

#5. Desempaquetar el fichero ".tgz"
tar zxvf Python-3.13.0.tgz

#6.Nos situamos en la carpeta generada
cd Python-3.13.0

#7. Compilamos el código
./configure --enable-optimizations

#8. Hacemos un build del Makefile generado. Este proceso es muuuuuy lento
sudo make install

#9. Verificamos que se ha instalado bien
python3 -V

1. Instalar la librería "request", y otras más en un entrono virtual

Si tenemos uina versión avanzada de Ubuntu, necesitamos instalar python en un entorno virtual.

Dicho entorno virtual se crea en una carpeta.

Cuando se instala python en dicha carpeta, crea 4 subcarpetas (bin, include, lib, lib64 y pyvenv.cfg)

Ahora para instalar el paquete request, hay que indicarle la ruta donde está instalado el python en dicho entorno virtual (dentro de la subcarpeta bin) , sinó no deja instalar.

OJO: Cuando se abra VStudio, hay que decirle que abra la carpeta donde se ha instalado el entorno virtual, de lo contrario no reconocerá las librerías instaladas. en mi caso es ~/MyOdoo/Control-Presencia

En una ventana de comandos ejecutar:

#0.Instalar dependencias necesarias
sudo apt install libpq-dev python3-dev

#1.Instalar Python3.11 en un entrono virtual
sudo apt install python3.11-venv

#2.Crear entrono virtual en ~/MyOdoo/Control-Presencia
#  OJO: Este directorio és el que tenemos que elegir en VS para que reconozca el 
#       el entorno donde se instralaran o se han instalado las librerias.
#       Para ello, una vez instaladas las librerias, se abrirá VStudio y se le dirá
#       File -> Open Folder y se indicara la carpeta ~/MyOdoo/Control-Presencia          

python3 -m venv ~/MyOdoo/Control-Presencia #3.Cambiamos de directorio.

cd ~/MyOdoo/Control-Presencia #4.Instalamos el paquete request indicando la ruta del ejecutable python en
#  el entorno virtual 
./bin/python -m pip install requests

#5.Instalamos la libreria para tratar XML
./bin/python -m pip install elementpath

#6.Instalamos la libreria para tratar YML
./bin/python -m pip install pyyaml

#7.Instalamos la libreria para conectase con Oracle
./bin/python -m pip install oracledb

#8.Instalamos la libreria para conectase con Postgres
./bin/python -m pip install psycopg2

#8.Instalamos la libreria para trabajar con arrays
./bin/python -m pip install numpy

#9.Instalamos la libreria para trabajar con pdf
./bin/python -m pip install -U pypdfium2

#10.Instalamos la libreria para trabajar con ocr
sudo apt install tesseract-ocr
./bin/python -m pip install pytesseract

./bin/python -m pip install opencv-contrib-python
./bin/python -m pip install imutils
./bin/python -m pip install matplotlib

sudo apt install libmagickwand-dev
./bin/python -m pip install Wand

./bin/python -m pip install deskew

./bin/python -m pip install easyocr

./bin/python -m pip install Filetype
./bin/python -m pip install pandas
./bin/python -m pip install openpyxl
./bin/python -m pip install xlrd
./bin/python -m pip install matplotlib

./bin/python -m pip install py7zr
./bin/python -m pip install python-magic

./bin/python -m pip install cmislib

./bin/python -m pip install tk
./bin/python -m pip install tkinter-tooltip

./bin/python -m pip install unidecode

./bin/python -m pip install nox

./bin/python -m pip install secure-smtplib

OJO: Para que funcione tkinter (tk) en Ubuntu hay que hacer

sudo apt-get install python3-tk

En Pycharm hacemos

- Ir a Python Packages 

- Dar el nombre del paquete e instalar (requests, elementpath, pyyaml, oracledb, psycopg2)



Si queremos instalar las dependencias de Odoo 16

#1.Cambiamos de directorio.
cd ~/MyOdoo/Control-Presencia

#2.Creamos un directorio para Odoo 16 y nos situamos en el
mkdir ~/MyOdoo/odoo-16.0
cd ~/MyOdoo/odoo-16.0

#3.Descargamos Odoo 16 dentro
mkdir ~/MyOdoo/odoo-16.0
git clone https://github.com/odoo/odoo.git -b 16.0 --depth=1

#4.Cambiamos de directorio del entorno
cd ~/MyOdoo/Control-Presencia

#4.Instalamos las dependencias que requiere Odoo
/bin/python -m pip install -r ~/MyOdoo/odoo-16.0/requirements.txt

#5.Instalamos las dependencia Odoo
/bin/python -m pip install -e ~/MyOdoo/odoo-16.0

#6.A veces falla si hacemos odoo --version. par tanto instalamos también
./bin/python -m pip install lxml_html_clean




2 Activar y desactivar un entorno virtual python


#1. Ya hemos visto como crear un entrono virtual
#  en ~/MyOdoo/Control-Presencia
#  OJO: Este directorio és el que tenemos que elegir en VS para que reconozca el 
#       el entorno donde se instralaran o se han instalado las librerias.
#       Para ello, una vez instaladas las librerias, se abrirá VStudio y se le dirá
#       File -> Open Folder y se indicara la carpeta ~/MyOdoo/Control-Presencia          

python3 -m venv ~/MyOdoo/Control-Presencia
#2. Mostrar la versión de python istalada
~/MyOdoo/Control-Presencia/bin/python -V

#3. Activar el entorno virtual
source ~/MyOdoo/Control-Presencia/bin/activate

#4. Ver donde se ha instalado el python
which python

#5. DESACTIVAR el entorno virtual
deactivate




3. Crear un programa sencillo y ejecutarlo

Ahora creamos este programita ejemplo de RealPython 


import requests
api_url = "https://jsonplaceholder.typicode.com/todos/1"
response = requests.get(api_url)
print(response.json())

Lo ejecutamos y nos dice Visual Studio 

Y le contestamos que instale

y nos contesta: 

{'userId': 1, 'id': 1, 'title': 'delectus aut autem', 'completed': False}

4. Crear un programa sencillo pero real

Llenemos este código


import requests
import xml.etree.ElementTree as ET

#Definimos la URL, el conteniodo y el tipo de consulta application/soap+xml
#1. URL
api_url="https://rrhh-xxxxxx.grupocastilla.es/epsilonnetws/WSEmpleado.asmx?wsdl"

#2. Contenido
xml="""<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<ConsultaGenericaBD_XML xmlns="http://www.grupocastilla.es/epsilonnetws">
<sToken>
&lt;TOKEN&gt;
&lt;AppName&gt;AYTOXXXX_APPS&lt;/AppName&gt;
&lt;AppToken&gt;XXXXXXXXXXXXXXX&lt;/AppToken&gt;
&lt;/TOKEN&gt;
</sToken>
<nombreTabla>PERSONAS</nombreTabla>
<condicion>APELLIDO2 LIKE '%PLA%'</condicion>
</ConsultaGenericaBD_XML>
</soap:Body>
</soap:Envelope>"""
#3. Tipo de petición
headers = {'Content-Type': 'application/soap+xml; charset=utf-8'}

#--EJECUTAMOS LA PETICIÓN
print (requests.post(api_url, data=xml, headers=headers).text)


Lo ejecutamos y nos dice 


<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ConsultaGenericaBD_XMLResponse xmlns="http://www.grupocastilla.es/epsilonnetws">
<ConsultaGenericaBD_XMLResult>
<TABLA xmlns="">
<REGISTRO>
<CAMPO NOMBRE="NIF">
<![CDATA[73XXXXXXX]]>
</CAMPO>
<CAMPO NOMBRE="ID_PF">
<![CDATA[0]]>
</CAMPO>
<CAMPO NOMBRE="APELLIDO1">
<![CDATA[XXXRIXXX]]>
</CAMPO>
<CAMPO NOMBRE="APELLIDO2">
<![CDATA[PLAXX]]>
</CAMPO>
<CAMPO NOMBRE="NOMBRE">
<![CDATA[XXXAXXX]]>
</CAMPO>
</REGISTRO>
<REGISTRO>
<CAMPO NOMBRE="NIF">
<![CDATA[XXXXXXXXX]]>
</CAMPO>
<CAMPO NOMBRE="ID_PF">
<![CDATA[0]]>
</CAMPO>
<CAMPO NOMBRE="APELLIDO1">
<![CDATA[MXXXXXX]]>
</CAMPO>
<CAMPO NOMBRE="APELLIDO2">
<![CDATA[PLAXXX]]>
</CAMPO>
<CAMPO NOMBRE="NOMBRE">
<![CDATA[JOSE]]>
</CAMPO>
</REGISTRO>
</TABLA>
</ConsultaGenericaBD_XMLResult>
</ConsultaGenericaBD_XMLResponse>
</soap:Body>
</soap:Envelope>




5. Crear un programa con un fichero de propiedades en YAML

Para simplificar trabajaremos en la misma carpeta

1. Veamos el fichero de configuración en formato YAML (c01_config.yml)


castilla:
api_url: https://rrhh-tavernes.grupocastilla.es/epsilonnetws/WSEmpleado.asmx?wsdl
headers :
Content-Type: application/soap+xml; charset=utf-8
token: >
&lt;TOKEN&gt;
&lt;AppName&gt;$APPNAME$&lt;/AppName&gt;
&lt;AppToken&gt;xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&lt;/AppToken&gt;
&lt;/TOKEN&gt;
appName: AYTOxxxx_APPS
nombreTabla: PERSONAS
xml: >
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<ConsultaGenericaBD_XML xmlns="http://www.grupocastilla.es/epsilonnetws">
<sToken>$TOKEN$</sToken>
<nombreTabla>$TABLA$</nombreTabla>
<condicion>$CONDICION$</condicion>
</ConsultaGenericaBD_XML>
</soap:Body>
</soap:Envelope>


2. Veamos una clase de utilidades para trabajar con XML (u03_XML.py)

import xml.etree.ElementTree as ET

'''
XML Utils
'''
class XMLUtils:
@staticmethod
def getElement(xmlString, tagString):
elem=ET.fromstring(xmlString)
tabla=elem.tag
level=0
while tabla!=tagString and level<10:
elem=elem[0]
tabla=elem.tag
level+=1
return elem

#Get an array of records as an array of dictionaries
@staticmethod
def getRecordsCastilla(firstElem):
records=[]
for secondElem in firstElem: # REGISTRO
#print('100 ',secondElem.tag, secondElem.attrib, secondElem.text)
dictio={}
for thirdElem in secondElem: # CAMPO
#print('200 ',thirdElem.tag, '--', thirdElem.attrib,'----', thirdElem.text)
att = thirdElem.attrib['NOMBRE']
value = thirdElem.text
dictio[att]=value
#print ('dictio=',dictio)
records.append(dictio)
return records


3. Veamos el programa principal (p03_request.py)

import sys
import requests
import yaml
import xml.etree.ElementTree as ET
from u03_XML import XMLUtils

#--------------------------------------
#1. Get properties from config file
#--------------------------------------
configFile = sys.path[0] + "/c01_config.yml"
print ('configFile:', configFile)
with open(configFile, 'r') as f:
configData = yaml.full_load(f)['castilla']
print('confiData:',configData)
#------------------------------------------------------------
#2. Define request
#------------------------------------------------------------
condicion="" # All !!!
xml=configData['xml'] \
.replace('$TOKEN$' , configData['token']) \
.replace('$APPNAME$' , configData['appName']) \
.replace('$TABLA$' , configData['nombreTabla'])\
.replace('$CONDICION$', condicion)
#------------------------------------------------------------
#3. Execute and print output to console
#------------------------------------------------------------
output=requests.post(configData['api_url'], data = xml, headers = configData['headers']).text

#------------------------------------------------------------
#3. Write output to file
#------------------------------------------------------------
fileName = sys.path[0] + "/../my-python-programs-output/p01-request-01.output.xml"
print ('fileName:',fileName)
fileOut=open(fileName,"w") # Rewrite
fileOut.write(output)
fileOut.close

#------------------------------------------------------------
#4. Extract XML info
#------------------------------------------------------------
tabla=XMLUtils.getElement(output,"TABLA")
records=XMLUtils.getRecordsCastilla(tabla)

#------------------------------------------------------------
#5. Print the records
#------------------------------------------------------------
i=0
for myrecord in records: # myrecord is a dictionary
i+=1
print(i,'--------------------------------------')
print ('myrecord=', myrecord)










No hay comentarios :

Publicar un comentario