sábado, 28 de diciembre de 2024

Python (XX) . Creación de un miniframework (II) Definición de las acciones tipo "info", "python" y "bash" (I)

 1. Acciones tipo "info"

Estas acciones son las más simples pues son solo informativas y no hacen nada. 

Veamos un ejemplo que representa la acción del menú "112". Puede tener por nombre "actions_112.yml" y se guardará en la carpeta "static/conf" del proyecto

# 1. Firmar Actes per Alcaldia"
112: 
  type: info
  help: > 
    Alcaldia firmarà després que Secretaria.
    PROCEDIMENT:
    1. Executar Xolido (XolidoSign)
    2. Seleccione els fitxers PDF de la carpeta a firmar (Z:\TEMP\ACTES_PLE_2022\Secretaria)
    3. En firmar-Opciones-Configuración seleccionar:
      3.1 Seleccionar el certificat.
      3.2 Formato de la firma: Perfil -XL (3ªOpció)
      3.3 Selec el tipus de firma:
      3.4 Preferencia de la firma: Marcar totes les opcions 
      3.5 Política de firma: Marcar: 
        3.5.1: Aprobación.
        3.5.2: OID: 2.16.724.1.3.1.1.2.1.9
        3.5.3: URI: https://sede.060.gob.es/politica_de_firma_anexo_1.pdf
        3.5.4: Algoritmo de resumen: SHA-1
        3.5.5: Valor de resumen: G7roucf600+f03r/o0bAOQ6WAs0=
      3.6 Opciones avanzadas: SHA-512 (resto no marcar)
      3.7 Servidores de sello de tiempo: ACCV
      3.8 Información de PDF: 
        3.8.1: Introduir motivo: Alcaldia RD 2568/1986 (ROF)
        3.8.2: Introduir ubicación: Tavernes de Valldigna
      3.9 Indicar una carpeta eixida diferent a la entrada (Z:\TEMP\ACTES_PLE_2022\Alcaldia)
      3.10 Modo de salida : Modo identificado 
    4. Firmar amb Xolido 

      

veamos los parámetros:

  • La clave del menú "112"
  • type : En este caso es tipo "info"
  • help: es el texto informativo de ayuda que te indica lo que hay que hacer

Y sale esta pantalla


2. Acciones tipo "python"

Estas acciones ejecutan un programa en python dentro de este mismo proyecto, por eso nos vale el entorno virtual que tenemos.

Veamos un ejemplo que representa la acción del menú "112". Puede tener por nombre "actions_112.yml" y se guardará en la carpeta "static/conf" del proyecto

211: 
    type: python 
    module: basicutils/xmalbaopc.py 
    function: albaCopyInteressats(expCodiOrigen=expCodiOrigen, expCodiDestinacio=expCodiDestinacio, grid_interessats=grid_interessats)
    help: Per a copiar interessats des de l'expedient origen al de destinació  

    #OJO: el pattern hem de canviar ?->\? si no trenca la http despres en el programa hemde  desfer el canvi \?->?       
    params: [
      [expCodiOrigen,string,10,"Codi expedient Sedipualba Origen:","",[]],
      [expCodiDestinacio,string,10,"Codi expedient Sedipualba Destinació:","",[]],
      [descExpOrigen,string,100,"Descripció expedient Origen:","",[]],
      [descExpDestinacio,string,100,"Descripció expedient Destinació:","",[]],
      [grid_interessats,grid,100,"Interessats:","",[]],
    ]
    ox: > 
      Origen i destinació dels interessats [expCodiOrigen, descExpOrigen;expCodiDestinacio, descExpDestinacio];
      Detall dels interessats [grid_interessats];
   
    events:  
      expCodiOrigen:   
        hx_trigger: change # other evens are possible separated by commas
        hx_include: "#expCodiDestinacio"
        hx_target: "#descExpOrigen"
        hx_edu_target: ["#descExpOrigen","#descExpDestinacio","#grid_interessats"] # More field targets
        module: basicutils/xmalbaopc.py
        function: albaExpSelecExpsAndInteressats(expCodiOrigen=expCodiOrigen, expCodiDestinacio=expCodiDestinacio)
       
      expCodiDestinacio:   
        hx_trigger: change
        hx_include: "#expCodiOrigen"
        hx_target: "#descExpDestinacio"
        hx_edu_target: ["#descExpOrigen","#descExpDestinacio","#grid_interessats"]
        module: basicutils/xmalbaopc.py
        function: albaExpSelecExpsAndInteressats(expCodiOrigen=expCodiOrigen, expCodiDestinacio=expCodiDestinacio)
         
     
    other: [
      #[fase,1],
    ]
    session:  
      save: [expCodiOrigen, expCodiDestinacio]
      #read: [expCodiOrigen, expCodiDestinacio]
    
    

Veamos  los parámetros:

  • La clave del menú "211"
  • type : En este caso es tipo "python"
  • module: el nombre del módulo a ejecutar 
  • function: nombre de la función del módulo con los parámetros ajecutar
  • help: es el texto informativo de ayuda que te indica lo que hay que hacer
  • params: es una lista de campos que apareceran en la pantalla que se pueden editar. Para cada campo tenemos otra lista donde las posiciones indican:
  1. "id" y "name" del campo en html
  2. tipo de campo (str: string, int: entero ..., grid: una tabla)
  3. Longiutd en caracteres (por ejemplo 60)
  4. Etiqueta del campo en el formulario 
  5. Valor por omisión
  6. Conjunto de valores que puede tener en caso de ser un elemto tipo "select" o combo
  • ox: Disposición de los campos según el modelo de pantalla de OpenXava. (Agradezco a Javier Paniza de Gestion400 ). En principio con:
    nombre panel [campo1, campo2;campo3] inidcamos con corchetes que tenemos un panel de nombre "nombre panel" qyue tiene 3 campos, los cos primeros en una misma línea (separado por coma ",") y el tercero en una línea nueva (separado por punto y coma ",")
    nombre tab1 {campo4}, nombre tab2{campo5;campo6}  indicamos que tenemos dos tabs o pestañas, el primero con un campo y el segundo con dos campos, cada uno en una lìnea (separacion por punto y coma ";")
  • events: Definimos los eventos, para ello tenemos que decirle el campo que ha provocdeo el evento, en este caso tenemos 2 campos que lanzan eventos ( expCodiOrigen y  expCodiDestinacio) y hay que pasarle los atributos de htmx (hx-trigger para el evento a lanzar, hx-include para los parámetros a pasar al request a parte del campo que lanza el evento, hx-target que es el elemento que recibe el resultado la request)
    También tenemos que indicarle los elementos que se veran afectados sus valores al recibir la request hx_edu_target.
    También hay que indicar el módulo "module" y la función "function"del módulo junto con sus parámetros que se ejecutará en el request
  • other: Es una lista de campos con valor fijo que normalemente se meteran ocultamente en el form y así poderlos pasar al request. Tendra de estructyra n[nombre_campo, valor], para cada campo
  • session: es para guardar y leer datos datos en la sesión. Normalmente se utiliza cuando una acción recoge valores que se urilizan en una opción. Por ejmplo si qeremos copiar un campo de un registro a otro, se ejecutaría una acción para recoger el campo y guardarlo en la sesión y luego se ejecutaría otra acción que recogería el valor del campo de la sesión y lo copiaría al nuevo registro.


Veamos la pantalla que nos genera

En este caso al darle valor al campo de "codi expedient Sedipualba Origen" rellena el campo de descripción de expediente de origen y llena la abla con los interesados del primer expedeiente, Cuando se de el expediente de estino se llenara el campo de descripción y en la tabla solo apareceran los interesados del expediene origen que no estan en el expediente de destino y con el botón aceotar de traspasan los interesados al expdiente de destino

3. Acciones tipo "bash". Se desaconseja su uso

En este caso todo es igual que las acciones tipo python excepto que  podemos llamamar a módulos de otro proyecto y por tanto tenenemos que cargar su entorno virtual.

Esta opción "batch" la desaconsejo, pues complica las ejecución, La única ventaja que tiene es que podemos separar el proyecto en módulos independientes, per hay que cargar el entorno virtual de cada proyecto de llamada

Veamos el fichero parte del fichero  "actions_01.yml" de la carpeta "static/script":

# 3. Generar l'index en PDF i part del llibre ENI XML
113  : 
  type: bash
  program: llibreries
  folder: ../02.llibreries
  venv: venv02
  module: eni/xmexpeni.py
  function: expedientENI

  help: >
    Han d'estar firmades les actes per part d'Alcaldia i Secretaria.
    Es generaran els documents ENI i s'ompli la taula d'índexs en el DOCX

  #OJO: el pattern hem de canviar ?->\? si no trenca la http
  #     despres en el programa hem de  desfer el canvi \?->?       
  params: [
    [anyPle,int,4,"Any:","$$YEAR-1$$",[]],
    [expCodi,string,10,"Codi expedient Sedipualba:","1814787N",[]],
    [prefPle,string,10,"Prefix ple:","INDEX_ACTES_PLE",[]],
    [docsFolderPath, folder, 60, "Carpeta de Documents:", '/mnt/NASDADES_DOCS/TEMP/ACTES_PLE_2022/Definitiu/', [] ],
    [windowsDocsFolderPath, folder, 60, "Carpeta de Documents Windows:", 'Z:\\TEMP\\ACTES_PLE_2022\\Definitiu\\', [] ],
    [pattern, string, 60, "Pattern de les actes:", '^Ple.*\.pdf$', [] ],
    [sufixFirmaSecretari, str, 60, "Sufix firma Secretari:", '_firmado_por_CESAR_HERRERO_POMBO_-_DNI_35299409K.pdf', [] ],
  ]
  ox: > 
      Paràmetres Generals [anyPle, expCodi];
      Localització Documents [docsFolderPath;windowsDocsFolderPath];
      Altres [ prefPle; pattern; sufixFirmaSecretari]
    
  other: [
    [fase,1],
    [templatesPath,templates/ENI/],
    [organo,L01462384],
    [tDocu,TD02],
    [plantillaXML,ENIExpTemplate.xml],
    [docxIndex,indexTemplate.docx],
  ]
    


  • "type" es ahora "bash" en vez de "python".
  • "type" es ahora "bash" en vez de "python".
  • "program" es la shell a ejecutar añadiéndole la terminación ".sh" y estará en la carpeta "static/scripts". En este caso utilizamos el shell "llibreries.sh" que se mostrará más adelante.
  • "venv": nombre de la carpeta donde está el entorno virtual a ejecutar
  • "folder": La carpeta general del proyecto
  • "module": Es la carpeta donde está el módulo python
  • "function": Es la función a ejecutar
Los otros campos coinciden con el de la acción tipo "bash", por tanto se puede consultar en el apartado anterior estos parámetros: help, params, ox, events (y sus componentes), other y session

En ese caso la pantalla resultante no difiere para nada de la de una tipo "python"

Veamos la complejidad que aporta el shell script "llibreries.sh" de la carpeta "static/scrips"

#!/bin/bash

#--------------------------
# 0. Exemple de crida
# ./static/scripts/llibreries.sh \
#  "folder=../02.llibreries" "venv=venv02" \
#  "module=eni.xmexpeni" "function=expedientENI" \
#  "docsFolderPath=docs/actes2022/" \
#  "templatesPath=templates/ENI/" \
#  "filter=*ord*aprov*sio*_signed.pdf" \
#  "anyPle=2022" \
#  "expCodi=1814787N" \
#  "organo=L01462384" \
#  "tDocu=TD02" \
#  "prefPle=INDEX_ACTES_PLE" \
#  "plantillaXML=ENIExpTemplate.xml" \
#  "docxIndex=indexTemplate.docx"
#
#
# O també podriem executar en background
# Run the Python script in the background
#  nohup python myscript.py > /dev/null 2>&1 &
#
#---------------------------

remove_quotes() {
    local arg="$1"
	# Remove leading double quote if present
    arg="${arg#\"}"
	# Remove leading double quote if present
    arg="${arg%\"}"
    echo "$arg"
}

#------------------------------------
# 1. Recogemos los parametros
#------------------------------------

# Inicialize variables
folder_value=""
venv_value=""
module_value=""
other_params=""

# Función para mostrar uso del script
usage() {
  echo "Uso: $0 'folder=RUTA'  'venv=carpeta entorno virtual' 'module=carpeta.modulo.py'  ... otros_parametros=VALOR ..."
  echo "Ejemplo:"
  echo "  $0 folder=/mi/carpeta env=producción venv=venv02 module=eni.xmexpeni config=ejemplo version=1.0"
  exit 1
}

# Verificar si se proporcionaron argumentos
if [ $# -lt 3 ]; then
  usage
fi

# Procesar cada argumento
for argIni in "$@"; do
  # Remover comillas
  arg=$(remove_quotes "$argIni")
  
  # Verificar si el argumento contiene un '='
  if [[ "$arg" == *=* ]]; then
    # Dividir el argumento en clave y valor
    key="${arg%%=*}"
    value="${arg#*=}"
	#echo "$key    AAAA   $value  AAAAA  $arg"
	
    case "$key" in
      folder)
        folder_value="$value"
        ;;
      venv)
        venv_value="$value"
        ;;
	  module) 
        module_value="$arg"
		;;
      *)
        # Concatenar otros parámetros
        other_params+=" \"$arg\""
        ;;
    esac
	#echo "$key    BBBBB   $value"
  else
    echo "Argumento inválido: $arg"
    usage
  fi
done

#echo "FOLDER=  $folder_value"
#echo "VENV= $venv_value"
#echo "MODULE= $module_value"

# Verificar que 'folder' y 'env' hayan sido proporcionados
if [[ -z "$folder_value" || -z "$venv_value" || -z "$module_value" ]]; then
  echo "Error: Se requieren al menos un argumento 'folder' 'venv'y 'module'."
  usage
fi


#--------------------------------------
# 2. Nos cambiamos a la carpeta del modulo
#-------------------------------------
pwd
cd "$folder_value"
pwd

#--------------------------------------
# 3. Activamos el entorno virtual
#-------------------------------------
source "$venv_value"/bin/activate


# Crear la cadena concatenada
final_string1="python xmexec.py \"${module_value}\" ${other_params}"
echo "--------------------------------------"
echo "FINAL STRING=$final_string1"
echo "--------------------------------------"
python xmexec.py \"${module_value}\" ${other_params}







No hay comentarios :

Publicar un comentario