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:


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

Description
Aplicación Flask sencilla para la realización de Encuestas
Readme 329 KiB
Languages
Python 94.6%
Shell 4.3%
Dockerfile 1.1%