179 lines
4.9 KiB
Markdown
179 lines
4.9 KiB
Markdown
# Encuestas
|
|
|
|
Aplicación desarrollada en Python (Flask) para la gestión de Encuestas on-line.
|
|
|
|
Esta preparada para ejecutarse en Contenedores
|
|
|
|
Estructura base de la aplicación:
|
|
|
|
```
|
|
.
|
|
├── app.py
|
|
└─── encuestas
|
|
├── fichero-01.encuesta
|
|
└── otro_fichero.encuesta
|
|
```
|
|
|
|
## Directorio de Encuestas
|
|
|
|
Cuando está en ejecución, la aplicacion `app.py` busca en el directorio `data` todos los ficheros con extensión `.encuesta`
|
|
|
|
En la ejecución montamos el directorio **`encuestas`** como volumen **`data`** en el contenedor.
|
|
Esto nos permite ir modificando o creando nuevas encuestas sin necesidad de reiniciar la aplicación.
|
|
|
|
## Visualización de Encuestas
|
|
|
|
Si no hay ningun fichero `.encuestas` se muestra una página similar a esta:
|
|
|
|

|
|
|
|
Si encuentra ficheros, se revisa el valor del campo `activa` que puede ser `true` o `false`
|
|
Este valor determina si la encuesta se encuentra Activa o ha Finalizado, y segun estos valores las muestra en una zona u otra:
|
|
|
|

|
|
|
|
### Encuestas Finalizadas
|
|
|
|
Unicamente se pueden ver los resultados de la votación, pero no se puede votar en ella.
|
|
|
|

|
|
|
|
### Encuestas Activas
|
|
|
|
* Se puede participar en la encuesta y votar:
|
|
|
|

|
|
|
|
* Se puede simplemente ver los resultados sin votar:
|
|
|
|

|
|
|
|
---
|
|
|
|
# Imagen y Contenedor de Encuestas
|
|
|
|
|
|
## Construir la imagen
|
|
|
|
El `Dockerfile` para crear la imagen es muy sencillo:
|
|
|
|
```
|
|
FROM python:3.11-slim
|
|
WORKDIR /app
|
|
RUN pip install --no-cache-dir flask
|
|
EXPOSE 8080
|
|
CMD ["python", "app.py"]
|
|
```
|
|
|
|
La contrucción de la imagen `encuestas` es muy sencilla:
|
|
|
|
```
|
|
docker build -t encuestas .
|
|
|
|
```
|
|
|
|
## Ejecutar el contenedor
|
|
|
|
Para que la aplicación funcione correctamente al iniciar el contenedor vamos a realizar el montaje de 2 recursos:
|
|
|
|
* Fichero con el código de la aplicacion: `app.py` lo vamos a montar en el contenedor en el directorio `/app/`
|
|
* Directorio de Encuestas: `./encuestas/` lo vamos a montar en el contenedor como si el directorio `/data/`
|
|
|
|
La manera de iniciarlo desde la terminal sería:
|
|
|
|
```
|
|
# Detener y borrar cualquier contenedor de encuestas previo
|
|
docker rm -f encuestas 2> /dev/null
|
|
|
|
|
|
# Iniciar contenedor encuestas
|
|
docker run -d \
|
|
--name encuestas \
|
|
--restart always \
|
|
-p 8080:8080 \
|
|
-v ${PWD}/app.py:/app/app.py \
|
|
-v ${PWD}/encuestas:/data \
|
|
encuestas
|
|
|
|
```
|
|
|
|
Una vez se haya iniciado el conetendor, puedes ver la aplicación web desde la URL desde donde se ejecuta o si es en modo local conectandote a: http://localhost:8080
|
|
|
|
Si necesitas que se inicie en otro puerto cambia en la ejecución de *docker run* la línea `-p 8080:8080` por el puerto que desees: `-p MI_PUERTO:8080`
|
|
|
|
---
|
|
|
|
# Formato de los ficheros de Encuestas
|
|
|
|
Se considera un fichero de encuestas todos los ficheros que terminen en `.encuesta` y estén dentro del directorio `encuestas` (que se montará en `/data/`)
|
|
|
|
El formato que se utiliza es el de un fichero *INI* (muy sencillo de procesar) en que cada *Sección* (identificada por corchetes) tiene varios *campos de datos* identificados por pares `clave = valor`
|
|
|
|
Se permite el uso de comentarios mediante `#` o `;`
|
|
|
|
Además como luego se va a procesar y "pintar" en HTML se permite el uso de etiquetas HTML, tales como:
|
|
|
|
* Negrita: `<b> </b>`
|
|
* Cursiva: `<em> </em>` ó `<i> </i>`
|
|
* Colores:
|
|
- Rojo: `<span style="color: red;"> ... </span>`
|
|
- Verde: `<span style="color: green;"> ... </span>`
|
|
- Azul: `<span style="color: blue;"> ... </span>`
|
|
|
|
Por cada *Opción* (identificada por su NUMERO) de respuesta tiene que existir en la sección `Votos` el mismo NUMERO en el que guardar los votos.
|
|
|
|
|
|
El formato básico es:
|
|
|
|
```
|
|
[encuesta]
|
|
titulo = Titulo de la Encuesta
|
|
pregunta = Texto de la pregunta para saber qué opción prefiere
|
|
# activa = true|false
|
|
activa = true
|
|
|
|
[opciones]
|
|
# n = texto de la opcion
|
|
1 = Texto de la opcion 1
|
|
2 = Texto de la opcion 2
|
|
3 = Texto de la opcion 3
|
|
4 = Texto de la opcion 4
|
|
|
|
[votos]
|
|
# Inicializar con valor 0
|
|
1 = 0
|
|
2 = 0
|
|
3 = 0
|
|
4 = 0
|
|
```
|
|
|
|
## Orden y Nombres de las Encuestas
|
|
|
|
La aplicación lee de forma alfabética los ficheros `.encuesta` y utiliza ese orden para mostrar las encuestas, tanto las activas como las finalizadas.
|
|
|
|
El nombre de los ficheros no tiene ninguna limitación, puedes escribirlos como desees siempre y cuando finalicen en `.encuesta`
|
|
|
|
Se recomienda:
|
|
|
|
* Uso de un Prefijo: El uso de un prefijo numérico para el renombrado de los ficheros permite forzar el orden a la hora de mostrarse vía Web.
|
|
* Letra ó Código para el Estado: Si tienes muchas encuestas, puedes incluir al nombre de fichero una letra o un identificador para saber si una encuesta está Activa (`A`) o ha Finalizado (`F`).
|
|
|
|
Por ejemplo:
|
|
|
|
```
|
|
.
|
|
├── app.py
|
|
└─── encuestas
|
|
├── 001-A_Que_Distro_Linux_usas.encuesta
|
|
├── 002-A_Editor_Nano-Joe-Vi-eMacs.encuesta
|
|
├── 001-F_Distro_Linux_para_PRO.encuesta
|
|
└── 099-A_Que_IDE-Framework_usas.encuesta
|
|
```
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|