Diferencia entre revisiones de «Administración de censos - 17 18 - G2»

De Wiki de EGC
Saltar a: navegación, buscar
(Estructura, ramas, commits y versiones)
 
(No se muestran 22 ediciones intermedias del mismo usuario)
Línea 7: Línea 7:
 
* Repositorio del proyecto actual: https://github.com/EGC-G2-Trabajo-1718/egc-censos
 
* Repositorio del proyecto actual: https://github.com/EGC-G2-Trabajo-1718/egc-censos
 
* Wiki del proyecto actual (wiki interna de github para uso interno del grupo): https://github.com/EGC-G2-Trabajo-1718/egc-censos/wiki
 
* Wiki del proyecto actual (wiki interna de github para uso interno del grupo): https://github.com/EGC-G2-Trabajo-1718/egc-censos/wiki
* ¿Dependencias con el grupo de autenticación / registro / administración de votaciones?
 
  
 +
=== Estructura, ramas, commits y versiones ===
 +
 +
El código del proyecto alojado en el repositorio estará estructurado en varias ramas, siguiendo una organización dividida entre los grupos de desarrollo (alumnos, en este caso).
 +
Con lo cual, se distinguen varias ramas:
 +
 +
* '''master''': alojará el código ya probado e integrado de las funcionalidades de cada versión. Será una versión para despliegue continuo.
 +
* '''development''': alojará el código ya probado e integrado de todas las funcionalidades de una versión final (generalmente un ''merge'' de las otras ramas, con ''settings'' cambiados, etc). Versión para despliegue local.
 +
* '''javi''': rama dedicada para las funcionalidades a desarrollar por el miembro de la misma.
 +
* '''miguel''': rama dedicada para las funcionalidades a desarrollar por el miembro de la misma.
 +
* '''maria''': rama dedicada para las funcionalidades a desarrollar por el miembro de la misma.
 +
* '''daniel''': rama dedicada para las funcionalidades a desarrollar por el miembro de la misma.
 +
* '''laura''': rama dedicada para las funcionalidades a desarrollar por el miembro de la misma.
 +
 +
Se realizará un '''commit''' cuando se tenga una funcionalidad concreta finalizada y comprobada. Por ejemplo: en la funcionalidad de creación de un censo, unos ejemplos de commit serían:
 +
# Mensaje: Estructura desarrollada en urls.py y views.py. (Editados urls.py y views.py en apps/api/censos)
 +
# Mensaje: Funcionalidad de creación de un censo agregada en views.py (Editado views.py en apps/api/censos)
 +
# Mensaje: Arreglado el bug:"Código bug/issue", editando def create_censo en views.py (Editado views.py en apps/api/censos)
 +
 +
 +
Dichos '''commits''' serán publicados (''push'') en la correspondiente rama del repositorio remoto cuando acabe el flujo de trabajo de dicha funcionalidad.
 +
 +
Una vez la funcionalidad esté acabada, probada y funcionando, ésta será agregada a la rama master mediante ''merge''.
 +
Previo al inicio del desarrollo de una nueva funcionalidad, se deberá agregar la rama ''master'' a la rama a desarrollar mediante ''merge'', puesto que ésta contendrá la versión más actual y funcional del proyecto.
  
 
== Tecnología usada ==
 
== Tecnología usada ==
Línea 17: Línea 39:
 
  '''Bibliotecas''':  
 
  '''Bibliotecas''':  
 
     '''Django REST framework (djangorestframework)''': versión 3
 
     '''Django REST framework (djangorestframework)''': versión 3
  '''Necesita Base de datos''': Sí (Ninguna empleada actualmente, a la espera de directrices)
+
  '''Necesita Base de datos''': Sí (MySQL)
  
 
Hemos decidido hacer uso del framework [https://docs.djangoproject.com/es/1.11/ Django] en su versión 1.11 y que trabaja con Python 3.6 por su facilidad de trabajo con JSON, que será el formato de datos en el que se proveerán las funcionalidades de la API. Haremos uso de la librería de funcionalidades [http://www.django-rest-framework.org/ djangorestframework] que nos provee utilidades para trabajar y crear una API.
 
Hemos decidido hacer uso del framework [https://docs.djangoproject.com/es/1.11/ Django] en su versión 1.11 y que trabaja con Python 3.6 por su facilidad de trabajo con JSON, que será el formato de datos en el que se proveerán las funcionalidades de la API. Haremos uso de la librería de funcionalidades [http://www.django-rest-framework.org/ djangorestframework] que nos provee utilidades para trabajar y crear una API.
Línea 23: Línea 45:
 
Como IDE desarrollaremos sobre PyCharm (en su versión Community), corriendo sobre Ubuntu 16.04 (o una máquina virtual en la máquina de cada desarrollador).
 
Como IDE desarrollaremos sobre PyCharm (en su versión Community), corriendo sobre Ubuntu 16.04 (o una máquina virtual en la máquina de cada desarrollador).
  
== Funcionalidades ==
+
== Estructura de datos ==
  
Por detallar. Actualmente, ver los [https://1984.lsi.us.es/wiki-egc/index.php?title=Administración_de_censos_-_17_18_-_G2#objetivo-del-subsistema objetivos]
+
Haremos uso del registro/tabla Censo:
 +
 
 +
    Censo:
 +
        - id: (int) identificador del censo [pk, autoincrementable]
 +
        - id_votacion: (int ?) identificador de la votación a la que se relaciona [fk, not null]
 +
        - rol: (string) nombre identificador del grupo/rol que puede votar en la votación [not blank, not null] *
 +
        - nombre: (string/varchar) nombre que se le quiere otorgar al censo en cuestión [blank, not null, default=""]
 +
        - fecha_ini: (datetime) fecha de inicio del censo [not null, default=fecha_actual]
 +
        - fecha_fin: (datetime) fecha de fin del censo [not null, default=votacion.fecha_fin]
 +
 
 +
*el atributo rol y sus valores vienen determinados por la estructura de Usuarios del grupo de Autenticación ([https://github.com/EGC-G2-Trabajo-1718/autenticacion/issues/7 Issue del asunto])
 +
Ésta es, a groso modo, la estructura/tabla que se va a usar en Administración de Censos. La dependencia fundamental es con la tabla Grupo (grupo de usuario, si existiese) y Votación (fecha de fin).
 +
Más adelante se detalla en la API su uso, para aclarar posibles dudas.
  
 
== API ==
 
== API ==
Las funcionalidades aquí descritas y especificadas no son finales. Debido a la diversidad de funcionalidades y necesidades de los otros grupos, éstas pueden variar a lo largo del desarrollo (sea debido al despliege, conflictos, etc).
+
'''URL Base:'''
 +
    https://censo.nvotesus.es/api
 +
 
 +
El resto de rutas serán consecutivas a la URL base especificada.
  
  
Línea 38: Línea 75:
  
 
'''URL:'''  
 
'''URL:'''  
     http://egc-censos1718.es/api/get/censo.json
+
     /get
  
 
'''Parámetros:'''
 
'''Parámetros:'''
Línea 44: Línea 81:
  
 
'''Ejemplo:'''
 
'''Ejemplo:'''
     GET http://egc-censos1718.es/api/create/censo.json?id=1
+
     GET https://censo.nvotesus.es/api/get?id=1
  
 
'''Formato JSON:'''
 
'''Formato JSON:'''
 
   {
 
   {
      "censo": {
 
 
       "id": "1",
 
       "id": "1",
 
       "id_votacion": "314",
 
       "id_votacion": "314",
       "id_grupo": "3",
+
       "rol": "ASISTENTE",
 
       "nombre": "Censo_de_prueba",
 
       "nombre": "Censo_de_prueba",
 
       "fecha_ini": "24/11/2017 16:00",
 
       "fecha_ini": "24/11/2017 16:00",
 
       "fecha_fin": "30/11/2017 23:59"
 
       "fecha_fin": "30/11/2017 23:59"
    }
 
 
   }
 
   }
  
Línea 66: Línea 101:
  
 
'''URL:'''  
 
'''URL:'''  
     http://egc-censos1718.es/api/filter/result.json
+
     /filter
  
 
'''Parámetros:'''
 
'''Parámetros:'''
 
     * id_votacion (opcional): Identificador de la votación de los censos a consultar.
 
     * id_votacion (opcional): Identificador de la votación de los censos a consultar.
     * id_grupo (opcional): Identificador del grupo de usuarios con acceso al censo.
+
     * rol (opcional): Nombre identificador del grupo/rol de usuarios con acceso al censo.
 
     * nombre (opcional): Nombre del censo.
 
     * nombre (opcional): Nombre del censo.
 
     * fecha_ini (opcional): dd/mm/yyyy hh:mm Fecha de inicio del censo a filtrar.
 
     * fecha_ini (opcional): dd/mm/yyyy hh:mm Fecha de inicio del censo a filtrar.
 
     * fecha_fin (opcional): dd/mm/yyyy hh:mm Fecha de fin del censo a filtrar
 
     * fecha_fin (opcional): dd/mm/yyyy hh:mm Fecha de fin del censo a filtrar
 
     Todos los parámetros deberán ir '''correctamente parseados en el formato URL''' (ya que así será traducido e interpretado)
 
     Todos los parámetros deberán ir '''correctamente parseados en el formato URL''' (ya que así será traducido e interpretado)
 +
    En el caso en que ningún parámetro sea establecido, /filter devolverá un listado de todos los censos existentes.
  
 
'''Ejemplo:'''
 
'''Ejemplo:'''
     GET http://egc-censos1718.es/api/filter/censos.json?id_votacion=314
+
     GET https://censo.nvotesus.es/api/filter?id_votacion=314
  
 
'''Formato JSON:'''
 
'''Formato JSON:'''
   {
+
   {  
    "censos": {
+
       {
       "censo1": {
 
 
         "id": "1",
 
         "id": "1",
 
         "id_votacion": "314",
 
         "id_votacion": "314",
         "id_grupo": "3",
+
         "rol": "ASISTENTE",
 
         "fecha_ini": "24/11/2017 16:00",
 
         "fecha_ini": "24/11/2017 16:00",
 
         "fecha_fin": "30/11/2017 23:59"
 
         "fecha_fin": "30/11/2017 23:59"
 
       },
 
       },
       "censo2": {
+
       {
 
         "id": "2",
 
         "id": "2",
 
         "id_votacion": "314",
 
         "id_votacion": "314",
         "id_grupo": "25",
+
         "rol": "PONENTE",
 
         "fecha_ini": "19/12/2017 16:00",
 
         "fecha_ini": "19/12/2017 16:00",
 
         "fecha_fin": "30/01/2018 23:59"
 
         "fecha_fin": "30/01/2018 23:59"
 
       }
 
       }
     }
+
  }
 +
 
 +
=== Consulta de acceso a voto ===
 +
 
 +
----
 +
 
 +
Se hace una petición GET con los parámetros siguientes y se devolverá un JSON con la siguiente información.
 +
Otra funcionalidad útil para los otros subsistemas que componen el sistema de votación, pues permitirá saber si ''X'' grupo de usuarios tiene un ACCESO A VOTO (activo) a ''Y'' votación. (Comprueba existencia y que la fecha actual esté comprendida entre el rango de ambas fecha). Básicamente, comprobará que exista un censo activo determinado por los parámetros de consulta.
 +
 
 +
'''URL:'''
 +
     /can_vote
 +
 
 +
'''Parámetros:'''
 +
    * id_votacion: Identificador de la votación de los censos a consultar.
 +
    * username: Nombre identificador único del usuario con acceso al censo. ([https://1984.lsi.us.es/wiki-egc/index.php/Autenticaci%C3%B3n_-_17_18_-_G2#APIs_y_datos_que_se_usar.C3.A1n_y_devolver.C3.A1n más detalles en la API de Autenticación])
 +
 
 +
'''Ejemplo:'''
 +
    GET  https://censo.nvotesus.es/api/can_vote?id_votacion=314&username=pedrogavira_us
 +
 
 +
'''Formato JSON:'''
 +
  {
 +
      "result": true
 
   }
 
   }
  
Línea 103: Línea 159:
 
----
 
----
  
Se hace una petición POST (a través del formulario descrito en su correspondiente vista) con los parámetros siguientes y se devolverá un JSON con la siguiente información.
+
Se hace una petición GET (a través del formulario -method=GET- descrito en su correspondiente vista) con los parámetros siguientes y se devolverá un JSON con la siguiente información.
  
 
'''URL:'''  
 
'''URL:'''  
     http://egc-censos1718.es/api/create/censo.json
+
     /create
  
 
'''Parámetros:'''
 
'''Parámetros:'''
 
     * id_votacion: Identificador usado para la votación a la que quiere enlazar el censo.
 
     * id_votacion: Identificador usado para la votación a la que quiere enlazar el censo.
     * id_grupo: Identificador del grupo de usuarios al que quiere otorgar acceso a voto.
+
     * rol: Nombre identificador del grupo de usuarios al que quiere otorgar acceso a voto.
 
     * nombre (opcional): Nombre a establecer para el censo a crear.
 
     * nombre (opcional): Nombre a establecer para el censo a crear.
 
     * fecha_ini (opcional): dd/mm/yyyy hh:mm Fecha en la que quiere iniciar la validez del censo (si no se establece, se tomará la fecha en el momento de creación).
 
     * fecha_ini (opcional): dd/mm/yyyy hh:mm Fecha en la que quiere iniciar la validez del censo (si no se establece, se tomará la fecha en el momento de creación).
     * fecha_fin (opcional): dd/mm/yyyy hh:mm Fecha en la que quiere finalizar la validez del censo (si no se establece, se tomará la ''fecha de finalización de la votación'' como límite).
+
     * fecha_fin (opcional): dd/mm/yyyy hh:mm Fecha en la que quiere finalizar la validez del censo (si no se establece, se tomará la ''fecha actual de creación con una semana más tarde'' como límite).
 
     Todos los parámetros deberán ir '''correctamente parseados en el formato URL''' (ya que así será traducido e interpretado)
 
     Todos los parámetros deberán ir '''correctamente parseados en el formato URL''' (ya que así será traducido e interpretado)
 +
 
'''Ejemplo:'''
 
'''Ejemplo:'''
     POST http://egc-censos1718.es/api/create/censo.json?id_votacion=314&id_grupo=3&nombre=Censo_de_prueba&fecha_ini=24%2F%0A11%2F%0A2017%2016%3A00
+
     GET https://censo.nvotesus.es/api/create?id_votacion=314&rol=ASISTENTE&nombre=Censo_de_prueba&fecha_ini=24%2F%0A11%2F%0A2017%2016%3A00
  
'''Formato JSON:'''
+
'''Formato JSON devuelto:'''
 
   {
 
   {
    "exito": true,
 
    "mensaje": "Creado con éxito",
 
    "censo": {
 
 
       "id": "1",
 
       "id": "1",
 
       "id_votacion": "314",
 
       "id_votacion": "314",
       "id_grupo": "3",
+
       "rol": "ASISTENTE",
 
       "nombre": "Censo_de_prueba",
 
       "nombre": "Censo_de_prueba",
 
       "fecha_ini": "24/11/2017 16:00",
 
       "fecha_ini": "24/11/2017 16:00",
       "fecha_fin": "30/11/2017 23:59"
+
       "fecha_fin": "01/12/2017 16:00"
    }
 
 
   }
 
   }
  
Línea 139: Línea 192:
  
 
'''URL:'''  
 
'''URL:'''  
     http://egc-censos1718.es/api/update/result.json
+
     /update
  
 
'''Parámetros:'''
 
'''Parámetros:'''
 
     * id: Identificador del censo a editar.
 
     * id: Identificador del censo a editar.
 
     * id_votacion (opcional): Identificador nuevo de la votación a la que quiere enlazar el censo.
 
     * id_votacion (opcional): Identificador nuevo de la votación a la que quiere enlazar el censo.
     * id_grupo (opcional): Identificador nuevo del grupo de usuarios al que quiere cambiar el acceso a voto.
+
     * rol (opcional): Nombre identificador nuevo del grupo/rol de usuarios al que quiere cambiar el acceso a voto.
 
     * nombre (opcional): Nombre nuevo para el censo.
 
     * nombre (opcional): Nombre nuevo para el censo.
 
     * fecha_ini (opcional): dd/mm/yyyy hh:mm Fecha nueva en la que quiere iniciar la validez del censo.
 
     * fecha_ini (opcional): dd/mm/yyyy hh:mm Fecha nueva en la que quiere iniciar la validez del censo.
Línea 152: Línea 205:
  
 
'''Ejemplo:'''
 
'''Ejemplo:'''
     POST http://egc-censos1718.es/api/update/result.json?id=1&nombre=Censo_de_prueba_editado
+
     GET https://censo.nvotesus.es/api/update?id=1&nombre=Censo_de_prueba_editado
  
'''Formato JSON:'''
+
'''Formato JSON devuelto:'''
 
   {
 
   {
    "exito": true,
 
    "mensaje": "Editado con éxito",
 
    "censo": {
 
 
       "id": "1",
 
       "id": "1",
 
       "id_votacion": "314",
 
       "id_votacion": "314",
       "id_grupo": "3",
+
       "rol": "ASISTENTE",
 
       "nombre": "Censo_de_prueba_editado",
 
       "nombre": "Censo_de_prueba_editado",
 
       "fecha_ini": "24/11/2017 16:00",
 
       "fecha_ini": "24/11/2017 16:00",
 
       "fecha_fin": "30/11/2017 23:59"
 
       "fecha_fin": "30/11/2017 23:59"
    }
 
 
   }
 
   }
  
Línea 175: Línea 224:
  
 
'''URL:'''  
 
'''URL:'''  
    http://egc-censos1718.es/api/delete/result.json
+
    /delete
  
 
'''Parámetros:'''
 
'''Parámetros:'''
Línea 181: Línea 230:
  
 
'''Ejemplo:'''
 
'''Ejemplo:'''
     GET http://egc-censos1718.es/api/create/censo.json?id=1
+
     GET https://censo.nvotesus.es/api/delete?id=1
 +
 
 
'''Formato JSON:'''
 
'''Formato JSON:'''
 
   {
 
   {
Línea 187: Línea 237:
 
     "mensaje": "Eliminado con éxito"
 
     "mensaje": "Eliminado con éxito"
 
   }
 
   }
 +
 +
== Vistas (.html) ==
 +
 +
=== Formulario de creación de censo ===
 +
<source lang="html">
 +
<html>
 +
 +
<head>
 +
<title>
 +
  Creación de censo
 +
</title>
 +
<link rel="stylesheet" type="text/css"  href="estilo.css" />
 +
</head>
 +
<body>
 +
<form action="/api/create" method="GET">
 +
<div>
 +
<label for="votaciones"> Votación:</label>
 +
<select id="votaciones" name="id_votacion" required>
 +
  <option value="">Seleccione una votación</option>
 +
  <option value="id1">Votación1</option>
 +
  <option value="id2">Votación2</option>
 +
  <option value="id3">Votación3</option>
 +
  <option value="id4">...</option>
 +
</select>
 +
 +
</div>
 +
<div>
 +
<label for="roles">Rol/Grupo:</label>
 +
<select id="roles" name="rol" required>
 +
  <option value="">Seleccione un rol/grupo</option>
 +
  <option value="ASISTENTE">ASISTENTE</option>
 +
  <option value="PONENTE">PONENTE</option>
 +
  <option value="AMBOS">AMBOS</option>
 +
  <option value="...">...</option>
 +
</select>
 +
</div>
 +
<div>
 +
<label for="nombre">Nombre:</label>
 +
<input type="text" id="nombre" name="nombre" required />
 +
</div>
 +
<div>
 +
<label for="fecha_ini"> Fecha Inicio:</label>
 +
<input type="datetime-local" id="fecha_ini" name="fecha_ini" placeholder="dd/mm/yyyy hh:mm" />
 +
</div>
 +
<div>
 +
<label for="fecha_fin"> Fecha Fin:</label>
 +
<input type="datetime-local" id="fecha_fin" name="fecha_fin" placeholder="dd/mm/yyyy hh:mm" />
 +
</div>
 +
 +
 +
<div id="div_submit">
 +
<input type="submit" value="Enviar"/>
 +
</div>
 +
 +
  </form>
 +
 +
</div> 
 +
 +
  </body>
 +
 +
</html>
 +
 +
</source>
 +
 +
=== Formulario de edición de censo ===
 +
<source lang="html">
 +
<html>
 +
 +
<head>
 +
<title>
 +
  Editar censo
 +
</title>
 +
<link rel="stylesheet" type="text/css"  href="estilo.css" />
 +
</head>
 +
<body>
 +
<form action="/api/update" method="GET">
 +
<div>
 +
<label for="votaciones"> Votación:</label>
 +
<select id="votaciones" name="id_votacion" required>
 +
  <option value="id_votacion_actual">Votación actual</option>
 +
  <option value="id1">Votación1</option>
 +
  <option value="id2">Votación2</option>
 +
  <option value="id3">Votación3</option>
 +
  <option value="id4">...</option>
 +
</select>
 +
 +
</div>
 +
<div>
 +
<label for="roles">Rol/Grupo:</label>
 +
<select id="roles" name="rol" required>
 +
  <option value="ASISTENTE">ASISTENTE</option>
 +
  <option value="PONENTE">PONENTE</option>
 +
  <option value="AMBOS">AMBOS</option>
 +
  <option value="...">...</option>
 +
                        </select>
 +
</div>
 +
<div>
 +
<label for="nombre">Nombre:</label>
 +
<input type="text" id="nombre" name="nombre" value="nombre_actual" required />
 +
</div>
 +
<div>
 +
<label for="fecha_ini"> Fecha Inicio:</label>
 +
<input type="datetime-local" id="fecha_ini" name="fecha_ini" value="fecha_ini_actual" placeholder="dd/mm/yyyy hh:mm" />
 +
</div>
 +
<div>
 +
<label for="fecha_fin"> Fecha Fin:</label>
 +
<input type="datetime-local" id="fecha_fin" name="fecha_fin"  value="fecha_fin_actual" placeholder="dd/mm/yyyy hh:mm" />
 +
</div>
 +
 +
 +
<div id="div_submit">
 +
<input type="submit" value="Enviar"/>
 +
</div>
 +
 +
  </form>
 +
 +
</div> 
 +
 +
  </body>
 +
 +
</html>
 +
 +
</source>
  
 
== Miembros y contacto ==
 
== Miembros y contacto ==
  
 
* Fco. Javier García, ''fjgparrales@gmail.com'' '''Coordinador'''
 
* Fco. Javier García, ''fjgparrales@gmail.com'' '''Coordinador'''
* Miguel Ternero Algarín
+
* Miguel Ternero Algarín, ''migueltern@gmail.com'' '''Gestor de Incidencias'''
 
* Daniel Lozano Portillo
 
* Daniel Lozano Portillo
 
* María Ruiz Gutiérrez
 
* María Ruiz Gutiérrez
 
* Laura Vera Recacha
 
* Laura Vera Recacha

Revisión actual del 16:08 15 ene 2018

Objetivo del subsistema

  • Gestionar lista de usuarios agrupados en quienes pueden votar o no en una determinada votación.
  • Crear nuevos censos cada vez que se genere una determinada votación.

Consideraciones

Estructura, ramas, commits y versiones

El código del proyecto alojado en el repositorio estará estructurado en varias ramas, siguiendo una organización dividida entre los grupos de desarrollo (alumnos, en este caso). Con lo cual, se distinguen varias ramas:

  • master: alojará el código ya probado e integrado de las funcionalidades de cada versión. Será una versión para despliegue continuo.
  • development: alojará el código ya probado e integrado de todas las funcionalidades de una versión final (generalmente un merge de las otras ramas, con settings cambiados, etc). Versión para despliegue local.
  • javi: rama dedicada para las funcionalidades a desarrollar por el miembro de la misma.
  • miguel: rama dedicada para las funcionalidades a desarrollar por el miembro de la misma.
  • maria: rama dedicada para las funcionalidades a desarrollar por el miembro de la misma.
  • daniel: rama dedicada para las funcionalidades a desarrollar por el miembro de la misma.
  • laura: rama dedicada para las funcionalidades a desarrollar por el miembro de la misma.

Se realizará un commit cuando se tenga una funcionalidad concreta finalizada y comprobada. Por ejemplo: en la funcionalidad de creación de un censo, unos ejemplos de commit serían:

  1. Mensaje: Estructura desarrollada en urls.py y views.py. (Editados urls.py y views.py en apps/api/censos)
  2. Mensaje: Funcionalidad de creación de un censo agregada en views.py (Editado views.py en apps/api/censos)
  3. Mensaje: Arreglado el bug:"Código bug/issue", editando def create_censo en views.py (Editado views.py en apps/api/censos)


Dichos commits serán publicados (push) en la correspondiente rama del repositorio remoto cuando acabe el flujo de trabajo de dicha funcionalidad.

Una vez la funcionalidad esté acabada, probada y funcionando, ésta será agregada a la rama master mediante merge. Previo al inicio del desarrollo de una nueva funcionalidad, se deberá agregar la rama master a la rama a desarrollar mediante merge, puesto que ésta contendrá la versión más actual y funcional del proyecto.

Tecnología usada

Subsistema: Administración de Censos
Lenguaje/Herramienta: Django 1.11 -> Python 3.6
Sistema de gestión de bibliotecas: pip
Bibliotecas: 
   Django REST framework (djangorestframework): versión 3
Necesita Base de datos: Sí (MySQL)

Hemos decidido hacer uso del framework Django en su versión 1.11 y que trabaja con Python 3.6 por su facilidad de trabajo con JSON, que será el formato de datos en el que se proveerán las funcionalidades de la API. Haremos uso de la librería de funcionalidades djangorestframework que nos provee utilidades para trabajar y crear una API.

Como IDE desarrollaremos sobre PyCharm (en su versión Community), corriendo sobre Ubuntu 16.04 (o una máquina virtual en la máquina de cada desarrollador).

Estructura de datos

Haremos uso del registro/tabla Censo:

   Censo:
       - id: (int) identificador del censo [pk, autoincrementable]
       - id_votacion: (int ?) identificador de la votación a la que se relaciona [fk, not null]
       - rol: (string) nombre identificador del grupo/rol que puede votar en la votación [not blank, not null] *
       - nombre: (string/varchar) nombre que se le quiere otorgar al censo en cuestión [blank, not null, default=""]
       - fecha_ini: (datetime) fecha de inicio del censo [not null, default=fecha_actual]
       - fecha_fin: (datetime) fecha de fin del censo [not null, default=votacion.fecha_fin]
  • el atributo rol y sus valores vienen determinados por la estructura de Usuarios del grupo de Autenticación (Issue del asunto)

Ésta es, a groso modo, la estructura/tabla que se va a usar en Administración de Censos. La dependencia fundamental es con la tabla Grupo (grupo de usuario, si existiese) y Votación (fecha de fin). Más adelante se detalla en la API su uso, para aclarar posibles dudas.

API

URL Base:

    https://censo.nvotesus.es/api

El resto de rutas serán consecutivas a la URL base especificada.


Obtención de un censo


Se hace una petición GET con los parámetros siguientes y se devolverá un JSON con la siguiente información.

URL:

   /get

Parámetros:

   * id: Identificador del censo a obtener.

Ejemplo:

   GET  https://censo.nvotesus.es/api/get?id=1

Formato JSON:

 {
     "id": "1",
     "id_votacion": "314",
     "rol": "ASISTENTE",
     "nombre": "Censo_de_prueba",
     "fecha_ini": "24/11/2017 16:00",
     "fecha_fin": "30/11/2017 23:59"
 }

Consulta de censos


Se hace una petición GET con los parámetros siguientes y se devolverá un JSON con la siguiente información. Funcionalidad más útil para los otros subsistemas que componen el sistema de votación, pues permitirá obtener resultados a partir de parámetros (si un usuario perteneciente a un grupo puede votar en x votación, qué grupos pueden votar en x votación, etc)

URL:

   /filter

Parámetros:

   * id_votacion (opcional): Identificador de la votación de los censos a consultar.
   * rol (opcional): Nombre identificador del grupo/rol de usuarios con acceso al censo.
   * nombre (opcional): Nombre del censo.
   * fecha_ini (opcional): dd/mm/yyyy hh:mm Fecha de inicio del censo a filtrar.
   * fecha_fin (opcional): dd/mm/yyyy hh:mm Fecha de fin del censo a filtrar
   Todos los parámetros deberán ir correctamente parseados en el formato URL (ya que así será traducido e interpretado)
   En el caso en que ningún parámetro sea establecido, /filter devolverá un listado de todos los censos existentes.

Ejemplo:

   GET  https://censo.nvotesus.es/api/filter?id_votacion=314

Formato JSON:

 {    
     {
       "id": "1",
       "id_votacion": "314",
       "rol": "ASISTENTE",
       "fecha_ini": "24/11/2017 16:00",
       "fecha_fin": "30/11/2017 23:59"
     },
     {
       "id": "2",
       "id_votacion": "314",
       "rol": "PONENTE",
       "fecha_ini": "19/12/2017 16:00",
       "fecha_fin": "30/01/2018 23:59"
     }
 }

Consulta de acceso a voto


Se hace una petición GET con los parámetros siguientes y se devolverá un JSON con la siguiente información. Otra funcionalidad útil para los otros subsistemas que componen el sistema de votación, pues permitirá saber si X grupo de usuarios tiene un ACCESO A VOTO (activo) a Y votación. (Comprueba existencia y que la fecha actual esté comprendida entre el rango de ambas fecha). Básicamente, comprobará que exista un censo activo determinado por los parámetros de consulta.

URL:

   /can_vote

Parámetros:

   * id_votacion: Identificador de la votación de los censos a consultar.
   * username: Nombre identificador único del usuario con acceso al censo. (más detalles en la API de Autenticación)

Ejemplo:

   GET  https://censo.nvotesus.es/api/can_vote?id_votacion=314&username=pedrogavira_us

Formato JSON:

 {
     "result": true
 }

Creación de un censo


Se hace una petición GET (a través del formulario -method=GET- descrito en su correspondiente vista) con los parámetros siguientes y se devolverá un JSON con la siguiente información.

URL:

   /create

Parámetros:

   * id_votacion: Identificador usado para la votación a la que quiere enlazar el censo.
   * rol: Nombre identificador del grupo de usuarios al que quiere otorgar acceso a voto.
   * nombre (opcional): Nombre a establecer para el censo a crear.
   * fecha_ini (opcional): dd/mm/yyyy hh:mm Fecha en la que quiere iniciar la validez del censo (si no se establece, se tomará la fecha en el momento de creación).
   * fecha_fin (opcional): dd/mm/yyyy hh:mm Fecha en la que quiere finalizar la validez del censo (si no se establece, se tomará la fecha actual de creación con una semana más tarde como límite).
   Todos los parámetros deberán ir correctamente parseados en el formato URL (ya que así será traducido e interpretado)

Ejemplo:

   GET https://censo.nvotesus.es/api/create?id_votacion=314&rol=ASISTENTE&nombre=Censo_de_prueba&fecha_ini=24%2F%0A11%2F%0A2017%2016%3A00

Formato JSON devuelto:

 {
     "id": "1",
     "id_votacion": "314",
     "rol": "ASISTENTE",
     "nombre": "Censo_de_prueba",
     "fecha_ini": "24/11/2017 16:00",
     "fecha_fin": "01/12/2017 16:00"
 }

Edición de un censo


Se hace una petición POST (a través del formulario descrito en su correspondiente vista) con los parámetros siguientes y se devolverá un JSON con la siguiente información.

URL:

   /update

Parámetros:

   * id: Identificador del censo a editar.
   * id_votacion (opcional): Identificador nuevo de la votación a la que quiere enlazar el censo.
   * rol (opcional): Nombre identificador nuevo del grupo/rol de usuarios al que quiere cambiar el acceso a voto.
   * nombre (opcional): Nombre nuevo para el censo.
   * fecha_ini (opcional): dd/mm/yyyy hh:mm Fecha nueva en la que quiere iniciar la validez del censo.
   * fecha_fin (opcional): dd/mm/yyyy hh:mm Fecha nueva en la que quiere finalizar la validez del censo.
   Todos los parámetros deberán ir correctamente parseados en el formato URL (ya que así será traducido e interpretado)
   Si no se establece algún parámetro, dicho atributo no será editado.

Ejemplo:

   GET https://censo.nvotesus.es/api/update?id=1&nombre=Censo_de_prueba_editado

Formato JSON devuelto:

 {
     "id": "1",
     "id_votacion": "314",
     "rol": "ASISTENTE",
     "nombre": "Censo_de_prueba_editado",
     "fecha_ini": "24/11/2017 16:00",
     "fecha_fin": "30/11/2017 23:59"
 }

Eliminación de un censo


Se hace una petición GET (a través del formulario descrito en su correspondiente vista) con los parámetros siguientes y se devolverá un JSON con la siguiente información.

URL:

    /delete

Parámetros:

   * id: Identificador del censo a eliminar.

Ejemplo:

   GET  https://censo.nvotesus.es/api/delete?id=1

Formato JSON:

 {
   "exito": true,
   "mensaje": "Eliminado con éxito"
 }

Vistas (.html)

Formulario de creación de censo

	<html>

	<head>
		<title>
		  Creación de censo
		</title>
		<link rel="stylesheet" type="text/css"  href="estilo.css" />
	</head>
	<body>
	<form action="/api/create" method="GET">
		<div>
			<label for="votaciones"> Votación:</label>
			<select id="votaciones" name="id_votacion" required>
				  <option value="">Seleccione una votación</option>
				  <option value="id1">Votación1</option>
				  <option value="id2">Votación2</option>
				  <option value="id3">Votación3</option>
				  <option value="id4">...</option>
			</select>

		</div> 
		<div>
			<label for="roles">Rol/Grupo:</label>
			<select id="roles" name="rol" required>
			  <option value="">Seleccione un rol/grupo</option>
			  <option value="ASISTENTE">ASISTENTE</option>
			  <option value="PONENTE">PONENTE</option>
			  <option value="AMBOS">AMBOS</option>
			  <option value="...">...</option>
			</select>
		</div>
		<div>
			<label for="nombre">Nombre:</label>
			<input type="text" id="nombre" name="nombre" required />
		</div>
		<div>
			<label for="fecha_ini"> Fecha Inicio:</label>
			<input type="datetime-local" id="fecha_ini" name="fecha_ini" placeholder="dd/mm/yyyy hh:mm" />
		</div>
		<div>
			<label for="fecha_fin"> Fecha Fin:</label>
			<input type="datetime-local" id="fecha_fin" name="fecha_fin" placeholder="dd/mm/yyyy hh:mm" />
		</div>


		<div id="div_submit">
			<input type="submit" value="Enviar"/>
		</div>

		  </form>

		</div>  
		
	  </body>

	</html>

Formulario de edición de censo

	<html>

	<head>
		<title>
		  Editar censo
		</title>
		<link rel="stylesheet" type="text/css"  href="estilo.css" />
	</head>
	<body>
	<form action="/api/update" method="GET">
		<div>
			<label for="votaciones"> Votación:</label>
			<select id="votaciones" name="id_votacion" required>
				  <option value="id_votacion_actual">Votación actual</option>
				  <option value="id1">Votación1</option>
				  <option value="id2">Votación2</option>
				  <option value="id3">Votación3</option>
				  <option value="id4">...</option>
			</select>

		</div> 
		<div>
			<label for="roles">Rol/Grupo:</label>
			<select id="roles" name="rol" required>
			  <option value="ASISTENTE">ASISTENTE</option>
			  <option value="PONENTE">PONENTE</option>
			  <option value="AMBOS">AMBOS</option>
			  <option value="...">...</option>
                        </select>
		</div>
		<div>
			<label for="nombre">Nombre:</label>
			<input type="text" id="nombre" name="nombre" value="nombre_actual" required />
		</div>
		<div>
			<label for="fecha_ini"> Fecha Inicio:</label>
			<input type="datetime-local" id="fecha_ini" name="fecha_ini" value="fecha_ini_actual" placeholder="dd/mm/yyyy hh:mm" />
		</div>
		<div>
			<label for="fecha_fin"> Fecha Fin:</label>
			<input type="datetime-local" id="fecha_fin" name="fecha_fin"  value="fecha_fin_actual" placeholder="dd/mm/yyyy hh:mm" />
		</div>


		<div id="div_submit">
			<input type="submit" value="Enviar"/>
		</div>

		  </form>

		</div>  
		
	  </body>

	</html>

Miembros y contacto

  • Fco. Javier García, fjgparrales@gmail.com Coordinador
  • Miguel Ternero Algarín, migueltern@gmail.com Gestor de Incidencias
  • Daniel Lozano Portillo
  • María Ruiz Gutiérrez
  • Laura Vera Recacha