sábado, 28 de diciembre de 2024

Python (XIX) . Creación de un miniframework (I) Definición de los menús

1. Configuración de los menús

 Para definir los menús utilizaremos un fichero yaml, donde cada menú es un objeto o diccionario cuya clave es el número de menu.

Si la clave tiene una sola cifra se entiende que es un menú principal (que no tiene padre), per ejemplo 1,2,3...

Si acabamos con los números podemos utilizar letras.

Es conveniente situarlos en orden, prinmero el menú y despúes sus hijos.

Supongamos que tenemos 3 menús principales (1,2,3) , y el número 1 tiene 2 hijos (11 y 12) y que el hijo (11) tiene 3 hijos más (111,112, y 113). Tendremos este orden

1,11,111,112,113,12,2,

Si al menú 2 le damos dos hijos (21, 22) y al 3 le damos 3 hijos (31,32,33) quedaría:

1,11,111,112,113,12,2,21,22,3,31,32,33 

Las propedades que podemos dar a cada menú son:

description: La descripción que aprarecerá

tooltip: mensaje que aparece al situar el rató sobre el menú,

icon: icono de font awesome

En principio, obligatoriament se necesita la clave que indica la posición del menú por ejemplo "111" y la "description". Los demás parámetros son opcionales, pero recomendables.

Veamos un ejemplo del fichero menus.yaml. Este fichero se guardará en la carpeta "static/conf" del proyecto

############################################################:
# menus.yml
############################################################:
1    : {description: 'Secretaria', tooltip: 'Secretaria guai!' , icon: 'fa-solid fa-skull-crossbones'}
11   : { description: "Llibre d'actes de plens"   }
111  : { description: "1. LOCAL: Firmar Actes per l'Alcaldia" }
112  : { description: "2. LOCAL: Firmar Actes per la Secretaria" }
113  : { description: "3. Generar l'index en PDF i part del llibre ENI XML" }
114  : { description: "4. LOCAL: firmar l'índex en PDF per Secretaria"    }
115  : { description: "5. Afegir l'índex al PDF per Secretaria"  }
116  : { description: "6. LOCAL: Firmar l'index del llibre ENI XML per Secretaria"  }
2    : { description: 'Sedipualba'  }
21   : { description: 'A. Expedients'}
211  : { description: 'A1. Copiar interessats entre expedients'}
212  : { description: 'A2. Copiar les resolucions d''un any a un expedient'}
3    : { description: 'Personal'                    }
31   : { description: 'Control Presència'}
32   : { description: 'Menu 32'     }
321  : { description: 'Menu 321' , icon: 'fa-solid fa-skull-crossbones'}
322  : { description: 'Menu 322'   }
323  : { description: 'Menu 323'   }
4    : { description: 'Informàtica' ,  tooltip: 'Informàtica guai del Paraguai!' , icon: 'fa-solid fa-skull-crossbones'}
41   : { description: 'Taula Municipio'   }

Esto nos dará una imagen como esta

2. La clase menu.py


En la clase menú, a parte de tener la clave ("id"), "description", "tooltip" e "icon", tenemos la propieada "action", que es la acción del menú y se definirá en fichero a parte.

A partir del fichero "menu.yml" podemos obtener quien es el padre de nuestro menú (basta con quitarle la última letra de nuestro menú) que es la propiedad "parentId" y la lista de hijos "childrenIds" que corresponden a todos aquellos menús que tienen una letra más de longitud en su "id" y que sus claves comientan con la clave del padre. Por ejemplo "3" es padre de "31" y los hijos de "31" són "311" y "312"

De esta clase hemos destacado sus atributos que hemos visto antes. Cabe destacar el constuctor "__init__" ,los "setters" y las funciones encargadas de leer las propiedades de los menús que están guardadas en:

  • menus_???.yml: Nomalmente los emnús de una aplicación se pueden ver bien en un solo fichero "menus.yml", pero podemos partirlo en varios ficheros como "menus_01.yml", "menus_011.yml". La condicion es que comience por "menus "y a continuación  un guión bajo "_" y varios dígitos y terminar en ".yml"
  • menu_icons.yml: Para cada tipo de acción asigna un icono por omisión.
  • actions_???.yml: Aquí se definen las acciones. Si que es conveniente separarlo en varios ficheros pues las acciones tienen un montón de parámetros, por tanto con el fin de evitar errores se opta por tener un fichero por cada acción y como mucho 3 acciones, pero no es conveniente.
Veamos el fichero menu_icons.yml que para cada tipo de acción (tabién se guardará en la carpeta "static/conf" del proyecto

############################################################:
# menu_icons.yml
############################################################:

default: 'fa-solid fa-folder'
table: 'fa-solid fa-table-cells'
python: 'fa-brands fa-python'
report: 'fa-solid fa-rectangle-list'
action: 'fa-solid fa-gears'
bash: 'fa-solid fa-bolt'
none: 'fa-solid fa-hand-middle-finger'

Los tipos de acciones son:
default: por omisión
table: para hace un CRUD de una tabla
python: un programa python
report: Un listado
action: Una accion general (???)
bash: un porgrama bash
none: Nada (????)






No hay comentarios :

Publicar un comentario