Descripción del Sistema - Giratina-Votacion/decide GitHub Wiki
¿Qué es Decide?
Decide es una plataforma virtual donde podemos gestionar múltiples votaciones. Podemos crear votaciones, registrarlas en un censo concreto, habilitarla y cerrarla en cualquier momento. El sistema consta de varios módulos independientes, conectados mediante APIs, que permiten que el sistema funcione como una sola aplicación haciendo llamadas a las diferentes APIs. Esto presenta diferentes ventajas:
- No hay dependencia de ningún lenguaje concreto
- Se puede abordar la carga de trabajo en varias máquinas
En concreto, el sistema está compuesto por los siguientes módulos:
- Base (Funcionalidades comúnes)
- Autenticación (Permite la autenticación de los votantes, con usuario/contraseña)
- Censo (Permite guardar quién puede votar, y quién ha votado)
- Votación (Módulo encargado de crear y administrar las votaciones)
- Cabina (Donde entrará la persona a votar)
- Mixnet (Módulo encargado de la parte criptográfica y de seguridad del sistema)
- Almacenamiento (Encargado de gestionar los detalles de almacenamiento)
- Postprocesado (Módulo que realiza el postprocesado del voto, y genera el resultado de la votación)
- Visualización (Encargado de la parte donde se visualizan los datos).
El sistema se desarrolla en Django 2.0, un framework web de python. Se puede acceder a la documentación completa de Django aquí.
Cómo funciona Decide
Decide puede utilizarse desde dos puntos de vista: El de administrador y el de usuario. El administrador puede hacer cualquier cosa dentro del sistema: Crear votaciones, administrarlas, añadir censos, preguntas... En cambio, el usuario, sólo puede entrar dentro de la votación y votar.
Punto de vista del administrador
Ésta es la interfaz que ve el administrador, una vez accede a http://giratina-votacion.herokuapp.com/admin, e inicia sesión usando su usuario y su contraseña:

En esta interfaz, vemos varias opciones, que procedemos a comentar a continuación.
Punto de vista del administrador: creando una votación
Para crear una votación, debemos acceder al apartado Votings, que listará todas nuestras votaciones creadas.

En esta ventana, debemos acceder a "Añadir voting", en la esquina superior derecha. Una vez accedamos, veremos un formulario como el siguiente:

En este formulario, vemos los siguientes puntos:
- Name: El nombre que recibirá la votación.
- Desc: Una descripción de lo que se está votando.
- Question: La pregunta que votarán los usuarios.
- Auths: Autorizaciones de la votación (Por defecto, la URL del sistema).
Para rellenar los atributos question y auths, deberemos, además, rellenar sus sendos formularios:
El formulario de la pregunta es bastante simple en comparación al de la votación, aunque hay unos cuantos apartados que rellenar:

- Desc: Descripción de la pregunta.
- Question options: compuestas por:
- Number: El número de la opción.
- Option: La opción a votar (Ejemplo: Sí, No, opción 1, opción 2...)
- Checkboxes: Los checkboxes sirven para añadir preguntas frecuentes directamente. Ejemplo: El checkbox "Yes", añadirá una opción de pregunta con texto Yes, sin necesidad de rellenar la pregunta. Lo mismo pasa con el checkbox de "No". Por último, el checkbox de "Eliminar" borrará la opción de pregunta al guardarla, en caso de que se esté editando.
En cuanto al formulario de las auth, presenta muy pocos elementos, pero es importante rellenarlos correctamente:

Los elementos son los siguientes:
- Name: Nombre que recibirá la auth.
- URL: URL de la auth.
Una vez completados todos los campos, podremos pasar a crear la votación satisfactoriamente.
(NOTA: También es posible crear auths y questions mediante la opción que aparece en el menú principal de administrador, y seleccionarlas luego en la creación de la votación).
Punto de vista del administrador: creando usuarios
El administrador puede crear las cuentas de usuario que luego votarán en la votación creada en el paso anterior. Para esto, basta con elegir la opción "Usuarios" dentro del menú principal de administrador, lo que nos llevará a la siguiente ventana:

En esta ventana, podemos ver los usuarios actuales que hay registrados en el sistema, administrarlos, y filtrarlos por los diferentes valores que vemos a la derecha. Para crear un usuario, basta con pulsar el botón "Añadir usuario". Al seleccionar la opción, volveremos a un formulario:

En este formulario encontramos los siguientes elementos:
- Nombre de usuario: El nombre que deberá introducir el usuario para iniciar sesión.
- Contraseña: La contraseña que deberá introducir el usuario para iniciar sesión.
- Confirmar contraseña: Como es habitual, si los campos Contraseña y Confirmar contraseña no coinciden, no se podrá registrar al usuario.
Una vez introducidos los cambios, podemos crear el nuevo usuario pulsando el botón de guardar.
Punto de vista del administrador: Añadiendo censos
Los censos son muy importantes en Decide: Son ellos los que permiten saber quién puede votar en qué votación. Para esto, basta con elegir la opción "Censuss" dentro del menú principal de administrador, lo que nos llevará a la siguiente ventana:

En esta ventana veremos los censos creados en el sistema. Un censo está compuesto por los siguientes elementos:
- Voting ID: El ID de la votación a la que permitirá acceder este censo.
- Voter ID: El ID del usuario de Decide al que se le permitirá el acceso a la votación.
NOTA: Estos dos parámetros pueden ser conocidos observando la URL de la votación y del censo, respectivamente (En concreto, el ID es el número que aparece en la URL)
Para crear un censo, basta con acceder al formulario para crearlo pulsando el botón "Añadir census", en la esquina superior derecha.

El formulario para añadir un censo es muy intuitivo, y no se va a explicar qué es cada elemento, pues ya se ha hecho anteriormente. Una vez hayamos rellenado el censo, podemos guardarlo con los botones de la esquina inferior derecha.
Ya casi tenemos todo listo para poder hacer que los usuarios puedan votar en nuestro sistema. Ahora, vamos a ver cómo administrar las votaciones.
Punto de vista del administrador: Administrar votaciones
En la pestaña de administrador de las votaciones, encontramos varios elementos para realizar acciones, marcadas con círculos en rojo en la siguiente imagen:

Los checkbox de la derecha nos permiten elegir qué votaciones vamos a administrar, y el menú de selección, la opción que vamos a elegir. Echemos un vistazo a las opciones disponibles:
- Start: Comienza la votación. Permite a los usuarios votar utilizando el módulo de cabina.
- Stop: Para la votación. Los usuarios ya no podrán votar en la misma.
- Tally: Acción que realizará el recuento de votos de la votación, y dejará todo listo para visualizar los resultados.
- Eliminar: Elimina las votaciones seleccionadas.
El caso de uso por defecto para una votación en Decide sería el siguiente:
- Se crea una votación, los usuarios necesarios, y se añaden los censos
- Se inicia la votación mediante "Start".
- Una vez haya pasado el plazo, se para la votación utilizando "Stop".
- Se realiza el recuento de los votos con el comando "Tally"
- Se visualizan los resultados.
Vamos a pasar ahora a ver cómo sería el caso de uso del usuario, es decir, cómo sería votar en la aplicación.
Punto de vista del usuario: Votar en una votación
En primer lugar, debemos acceder al módulo de cabina, y a la votación correspondiente (Ejemplo de URL: https://giratina-votacion.herokuapp.com/booth/1/). Una vez dentro, encontraremos un menú para introducir nuestro usuario y contraseña:

Cuando introduzcamos nuestras credenciales y se compruebe que tenemos permiso para votar, seremos redirigidos a la interfaz de voto:

Finalmente, elegimos la opción que veamos correcta y pulsamos en "Vote" para enviar nuestro voto.
Cambios en Decide introducidos por nuestro grupo
Entre los cambios en el sistema que hemos introducido, encontramos:
- Los checkbox de la creación de opciones de pregunta de "Yes", "No", ... Este cambio ha sido motivado para permitir a los administradores introducir respuestas que suelen ser muy utilizadas en votaciones, como las anteriormente mencionadas.
- Traducciones: Se ha traducido la interfaz del sistema al español y al alemán, además del inglés que tenemos por defecto.
- Página principal: Se ha creado una bonita página principal, para evitar la página por defecto de error 404 de Django:

Además de estos cambios, se han realizado otros cambios que no están directamente relacionados con el funcionamiento de la aplicación, sino con el despliegue y la automatización del mismo:
- Script de despliegue automático de Decide en local utilizando un entorno virtual
- Script de despliegue automático de Decide en local utilizando Docker
Estos scripts pueden verse con mayor extensión dentro del apartado "Gestión de construcción e Integración Contínua" y "Gestión de liberaciones, despliegue y entregas".