El objetivo de esta API será resolver el problema de llevar los movimientos monetarios diarios de una o más personas. La API manejará los siguientes recursos:
Todos los pedidos son devueltos en formato JSON.
Para ver el apartado completo sobre los recursos mencionados haga click aquí.
Deberá contar con los siguientes paquetes instalados:
- Python 3.5
- Django 1.11
- Django Rest Framework 3.7.3
En el apartado Dependencias y Entorno Virtual puede obtener más detalles sobre como crear un ambiente de aislado para su instalación utilizando virtualenv.
A continuación se detallan los pasos para la instalación:
git clone https://github.com/MatiasLoiseau/api-rest.git
cd api-rest
chmod a+x runserver.sh
./runserver.sh
El entorno virtual ya cuenta con los paquetes necesarios para poder utilizar la API. Para activarlo ejecutar lo siguiente:
virtualenv /env
source env/bin/activate
En caso de que no sea posible su instalación o se indique que aún faltan dependencias. Puede proceder a generar su propio entorno virtual, siguiendo estos pasos:
virtualenv env
source env/bin/activate
pip3 install django
pip3 install djangorestframework
Las consultas de prueba sobre la API fueron realizadas con HTTPIE, se pueden encontrar ejemplos en el archivo SET PRUEBA
Para su instalación deberán realizarse los siguientes pasos:
# Distribuciones basadas en Debian:
apt-get install httpie
# Distribuciones basadas en RPM:
yum install httpie
# Arch Linux:
pacman -S httpie
En caso de necesitar más información puede referirse a la documentación de HTTPIE.
Se listarán los archivos principales del proyecto, con el fin de explicar su propósito:
- manage.py: Se crea automáticamente en cada proyecto de Django manage.py, contempla tareas administrativas.
- settings.py: Este archivo contiene todas las configuraciones para el proyecto, apps instaladas, paths de recursos utilizados, entre otros.
- urls.py: Contiene las rutas (URLs) que están disponibles en el proyecto.
Se listarán los archivos principales de los recursos, con el fin de explicar su propósito:
- serializer.py: Los serializers permiten que datos complejos, como los conjuntos de consultas y las instancias del modelo, se conviertan en tipos de datos nativos de Python que luego se pueden representar fácilmente en formatos como JSON.
- models.py: Contiene los campos y comportamientos esenciales de los recursos.
- views.py: Contiene la lógica que será utilizada para devolver los responses en función de los request realizados.
- tests.py: Contiene los tests correspondientes a cada recurso.
Se ha utilizado el ORM (Object-Relational Mapping) provisto por Django.
Por lo tanto, una vez creados los modelos de datos (archivo models.py), Django proporcionó automáticamente una abstracción que permitió crear, recuperar, actualizar y eliminar objetos.
La base de datos utilizada para guardar los datos generados fue sqlite, la cuál se incluye por default en la instalación de Django.
Este documento explica con más detalle como utilizar el ORM de Django.
Podrán pertenecer a más de un usuario, deben contener un nombre.
Integer. Valor autoincremental que se generará automáticamente.
String. Denominación de la cuenta.
- id
- nombre
http POST http://{$PATH}/controlgastos/cuentas/ nombre="nombre_de_cuenta"
Algunas de las posibles respuestas:
- 201: La cuenta ha sido generada correctamente
- 400: En caso de que el request este mal escrito, o que falte el campo de nombre
- 500: Error en el servidor
- id -> solo en caso de querer ver los detalles de una cuenta específica, en caso contrario no se deberá pasar ningún parámetro
Listar todas las cuentas
http GET http://{$PATH}/controlgastos/cuentas/
Ver los detalles de una cuenta
http GET http://{$PATH}/controlgastos/cuentas/{$id}
Listar todos los usuarios de una cuenta
http GET http://{$PATH}/controlgastos/cuentas/{$id (cuenta)}/usuarios/
Listar todas las categorías de una cuenta
http GET http://{$PATH}/controlgastos/cuentas/{$id (cuenta)}/categorias/
Algunas de las posibles respuestas:
- 200: En caso de que la consulta haya sido realizada con éxito
- 404: En caso de que no haya sido encontrado el objeto
- 500: Error en el servidor
Si la respuesta es exitosa se devolverá el recurso en formato JSON Ejemplo:
HTTP/1.1 200 OK
Content-Length: 39
Content-Type: application/json
Date: Sat, 06 Dec 2017 22:41:16 GMT
Server: WSGIServer/0.2 CPython/3.5.3
X-Frame-Options: SAMEORIGIN
[
{
"id": 1,
"nombre": "cuenta_ejemplo"
}
]
- id -> Primary Key de la Cuenta
- Atributos que se desee modificar. (Ver Atributos de la Cuenta)
http PUT http://{$PATH}/controlgastos/cuentas/{$id}/ nombre="nuevo_nombre_de_cuenta"
Algunas de las posibles respuestas:
- 200: En caso de que la consulta haya sido realizada con éxito
- 404: En caso de que no haya sido encontrado el objeto
- 500: Error en el servidor
En caso de que la respuesta sea exitosa, también será devuelto el recurso modificado en formato JSON Ejemplo:
HTTP/1.1 200 OK
Content-Length: 45
Content-Type: application/json
Date: Sat, 06 Dec 2017 23:01:18 GMT
Server: WSGIServer/0.2 CPython/3.5.3
X-Frame-Options: SAMEORIGIN
{
"id": 1,
"nombre": "nuevo_nombre_de_cuenta"
}
- id -> Primary Key de la Cuenta
http DELETE http://{$PATH}/controlgastos/cuentas/{$id}/
Algunas de las posibles respuestas:
- 200: En caso de que la consulta haya sido realizada con éxito
- 404: En caso de que no haya sido encontrado el objeto
- 500: Error en el servidor
Todos usuarios deben tener una cuenta asociada,los atributos correspondientes al recurso se listan a continuación.
Integer. Valor autoincremental que se generará automáticamente.
String. Nombre del usuario.
String. Contraseña del usuario.
String. E-mail del usuario.
Cuenta del usuario, clave foránea. Correspondiente a la pk (id) de una cuenta previamente generada.
- id
- user
- password
- cuenta
http POST http://localhost/controlgastos/usuarios/ user="user_ejemplo_1" email=usrejemplo@ejemplo.com cuenta=<id de cuenta> password="ejemplo"
Algunas de las posibles respuestas:
- 201: La cuenta ha sido generada correctamente
- 400: Puede ser Bad Request si: 1° Tipo de dato incorrecto, 2° Falta un campo, 3° No encuentra el ID de la cuenta
- 500: Error en el servidor
- id -> solo en caso de querer ver los detalles de un usuario específico, en caso contrario no se deberá pasar ningún parámetro
http GET http://{$PATH}/controlgastos/usuarios/{$id}
Algunas de las posibles respuestas:
- 200: En caso de que la consulta haya sido realizada con éxito
- 404: En caso de que no haya sido encontrado el objeto
- 500: Error en el servidor
Si la respuesta es exitosa se devolverá el recurso en formato JSON Ejemplo:
HTTP/1.1 201 Created
Content-Length: 101
Content-Type: application/json
Date: Sun, 10 Dec 2017 00:37:11 GMT
Server: WSGIServer/0.2 CPython/3.5.3
X-Frame-Options: SAMEORIGIN
{
"cuenta": 2,
"email": "ejemplo@ejemplo.com",
"id": 3,
"password": "ejemplo",
"user": "ejemplo_user"
}
- id -> Primary Key del Usuario
- Atributos que se desee modificar. (Ver Atributos del Usuario)
http PUT http://{$PATH}/controlgastos/usuarios/{$id}/ atributo="nuevo_valor"
Algunas de las posibles respuestas:
- 200: En caso de que la consulta haya sido realizada con éxito
- 404: En caso de que no haya sido encontrado el usuario que se desea modificar
- 500: Error en el servidor
En caso de que la respuesta sea exitosa, también será devuelto el recurso modificado en formato JSON Ejemplo:
HTTP/1.1 200 OK
Content-Length: 112
Content-Type: application/json
Date: Sun, 10 Dec 2017 00:43:59 GMT
Server: WSGIServer/0.2 CPython/3.5.3
X-Frame-Options: SAMEORIGIN
{
"cuenta": 2,
"email": "ejemplo@ejemplo.com",
"id": 3,
"password": "ejemplo",
"user": "ejemplo_user_modificado"
}
- id -> Primary Key del Usuario
http DELETE http://{$PATH}/controlgastos/usuarios/{$id}/
Algunas de las posibles respuestas:
- 200: En caso de que la consulta haya sido realizada con éxito
- 404: En caso de que no haya sido encontrado el objeto
- 500: Error en el servidor
Integer. Valor autoincremental que se generará automáticamente.
String. Denominación de la categoría.
Cuenta a la cual corresponde la categoría. Clave foránea (id) de una cuenta previamente generada.
- id
- nombre
- cuenta
http POST http://localhost:8000/controlgastos/categorias/ nombre=cat1 cuenta=2
Algunas de las posibles respuestas:
- 201: La cuenta ha sido generada correctamente
- 400: Puede ser Bad Request si: 1° Tipo de dato incorrecto, 2° Falta un campo, 3° No encuentra el ID de la cuenta
- 500: Error en el servidor
- id -> solo en caso de querer ver los detalles de una cuenta específica, en caso contrario no se deberá pasar ningún parámetro
http GET http://{$PATH}/controlgastos/categorias/{$id}
Algunas de las posibles respuestas:
- 200: En caso de que la consulta haya sido realizada con éxito
- 404: En caso de que no haya sido encontrado el objeto
- 500: Error en el servidor
Si la respuesta es exitosa se devolverá el recurso en formato JSON Ejemplo:
HTTP/1.1 200 OK
Content-Length: 40
Content-Type: application/json
Date: Sun, 10 Dec 2017 01:52:40 GMT
Server: WSGIServer/0.2 CPython/3.5.3
X-Frame-Options: SAMEORIGIN
{
"cuenta": 2,
"id": 1,
"nombre": "cat1"
}
- id -> Primary Key de la Categoria
- Atributos que se desee modificar. (Ver Atributos de la Categoria)
http PUT http://{$PATH}/controlgastos/cateogorias/{$id}/ nombre="nuevo_nombre_de_categoria"
Algunas de las posibles respuestas:
- 200: En caso de que la consulta haya sido realizada con éxito
- 404: En caso de que no haya sido encontrado el objeto
- 500: Error en el servidor
En caso de que la respuesta sea exitosa, también será devuelto el recurso modificado en formato JSON Ejemplo:
HTTP/1.1 200 OK
Content-Length: 51
Content-Type: application/json
Date: Sun, 10 Dec 2017 02:15:45 GMT
Server: WSGIServer/0.2 CPython/3.5.3
X-Frame-Options: SAMEORIGIN
{
"cuenta": 2,
"id": 1,
"nombre": "cate_modificada"
}
- id -> Primary Key de la Categoría
http DELETE http://{$PATH}/controlgastos/categorias/{$id}/
Algunas de las posibles respuestas:
- 200: En caso de que la consulta haya sido realizada con éxito
- 404: En caso de que no haya sido encontrado el objeto
- 500: Error en el servidor
Integer. Valor autoincremental que se generará automáticamente.
Date. Fecha en la cual se registró el movimiento.
Usuario que ha generado el movimiento.Correspondiente a la clave foránea (id) de un usuario previamente generado.
Float. Importe del movimiento generado.
Categoría del movimiento. Correspondiente a la clave foránea (id) de una categoría previamente generada.
(Campo opcional) Descripción del movimiento, el valor indicado por default es "operación de compra-venta".
- user
- monto
- categoría
- descripción (opcional)
http POST http://localhost/controlgastos/movimientos/ user="1" monto="10" categoria=1 descripcion="alquileres"
Algunas de las posibles respuestas:
- 201: La cuenta ha sido generada correctamente
- 400: Puede ser Bad Request si: 1° Tipo de dato incorrecto, 2° Falta un campo, 3° No encuentra el ID del usuario o categoria
- 500: Error en el servidor
- id -> solo en caso de querer ver los detalles de un movimiento específico, en caso contrario no se deberá pasar ningún parámetro
Listar todos los movimientos
http GET http://{$PATH}/controlgastos/movimientos/
Ver detalles de un movimiento
http GET http://{$PATH}/controlgastos/movimientos/{$id}
Algunas de las posibles respuestas:
- 200: En caso de que la consulta haya sido realizada con éxito
- 404: En caso de que no haya sido encontrado el objeto
- 500: Error en el servidor
Si la respuesta es exitosa se devolverá el recurso en formato JSON Ejemplo:
HTTP/1.1 200 OK
Content-Length: 130
Content-Type: application/json
Date: Sun, 10 Dec 2017 02:25:17 GMT
Server: WSGIServer/0.2 CPython/3.5.3
X-Frame-Options: SAMEORIGIN
[
{
"categoria": 1,
"descripcion": "operacion compra-venta",
"fecha": "2017-12-10T02:13:05.896",
"id": 1,
"monto": "10",
"user": 3
}
]
- id -> Primary Key del Movimiento
- Atributos que se desee modificar. (Ver Atributos del Movimiento)
http PUT http://{$PATH}/controlgastos/movimientos/{$id}/ atributo="nuevo_valor"
Algunas de las posibles respuestas:
- 200: En caso de que la consulta haya sido realizada con éxito
- 404: En caso de que no haya sido encontrado el usuario que se desea modificar
- 500: Error en el servidor
En caso de que la respuesta sea exitosa, también será devuelto el recurso modificado en formato JSON Ejemplo:
HTTP/1.1 200 OK
Content-Length: 133
Content-Type: application/json
Date: Sun, 10 Dec 2017 02:26:12 GMT
Server: WSGIServer/0.2 CPython/3.5.3
X-Frame-Options: SAMEORIGIN
{
"categoria": 1,
"descripcion": "operacion compra-venta",
"fecha": "2017-12-10T02:13:05.896",
"id": 1,
"monto": "1000000",
"user": 3
}
- id -> Primary Key del Movimiento
http DELETE http://{$PATH}/controlgastos/movimientos/{$id}/
Algunas de las posibles respuestas:
- 200: En caso de que la consulta haya sido realizada con éxito
- 404: En caso de que no haya sido encontrado el objeto
- 500: Error en el servidor
Han sido utilizados para completar automáticamente datos y que nos mismos no contengan errores que no permitan que el test continúe.
python3 manage.py dumpdata > path/to/app/fixtures/data.json
from django.core.management import call_command
call_command('loaddata', 'data.json', app_label='aplicacion')
Para correr los test los pasos son los siguientes: En caso de que se quiera correr algun cambio se podrá generar la migración.
python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py test
Para testear solo un recurso en particular:
python3 manage.py test <nombre recurso>.tests