Encuestas/README.md

184 lines
5.1 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:
![](imagenes/01-panel-vacio.png)
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:
![](imagenes/02-panel-activa-finalizada.png)
### Encuestas Finalizadas
Unicamente se pueden ver los resultados de la votación, pero no se puede votar en ella.
![](imagenes/05-votos-finalizada.png)
### Encuestas Activas
* Se puede participar en la encuesta y votar:
![](imagenes/03-votar.png)
* Se puede simplemente ver los resultados sin votar:
![](imagenes/04-votos-activo.png)
---
**Actualización de visualización**
> Se ha actualizado el código para incluir el título de la encuesta en la votación o visualización de los votos
---
# 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
```
---