¿Que voy a encontrarme?
API REST que conecta empresas con conductores para facilitar el transporte de mercancías. Permite a las empresas publicar rutas y a los conductores encontrar oportunidades de transporte.
✅ Registro y autenticación de usuarios (empresas y conductores).
✅ Publicación y gestión de rutas de transporte.
✅ Asignación de rutas a conductores.
✅ Documentación interactiva con Swagger.
- Backend: Django REST Framework (DRF) + Python
- Base de Datos: PostgreSQL
- Frontend: HTML + CSS + Bootstrap
- Entorno Virtual:
.envpara configuración segura
git clone https://github.com/Bootcamp-IA-P4/Track-Truck.git
cd Track-Truck
python3 -m venv .venv
python -m venv .venv
source .venv/bin/activate
.venv\Scripts\activate
uv pip install -r requirements.txt
Crea el archivo .env en la raíz y configura las siguiente variables:
SECRET_KEY="tu_clave_secreta"
DEBUG=True
DATABASE_URL="postgres://usuario:contraseña@localhost:5432/nombre_db"
python manage.py runserver
Important
La API estará disponible en http://127.0.0.1:8000/
Note
Si quieres ver esto de forma más visual visita:
Swagger UI: http://localhost:8000/docs/
Redoc UI: http://localhost:8000/redoc/
Permite a los usuarios registrarse en la plataforma.
Endpoint: POST /users/signin/
Parámetros requeridos (Formulario o JSON)
{
"username": "usuario123",
"password1": "ContraseñaSegura123",
"password2": "ContraseñaSegura123",
"email": "usuario@example.com",
"user_type": "company" // Opciones: "company" o "driver"
}Note
Flujo de redirección:
-
Si el usuario se registra como empresa → Redirige a companies:create_company_form
-
Si el usuario se registra como conductor → Redirige a drivers:create_driver_form
Ejemplo de respuesta (200 OK) ✔️
{
"message": "Usuario registrado correctamente",
"redirect": "/companies/create/"
}
Ejemplo de posibles errores:
(400 Bad Request) si las contraseñas no coinciden o faltan datos. ❌
Important
(400 Bad Request) si se registra un usuario con el mismo email/username, un driver con el mismo truck plate, una empresa con el mismo nombre.
Estas validaciones son personalizadas
Permite a los usuarios iniciar sesión con sus credenciales.
Endpoint: POST /api/auth/login/
Parámetros requeridos (Formulario o JSON):
{
"email": "usuario123@user.com",
"password": "ContraseñaSegura123"
}Ejemplo de respuesta (200 OK). ✔️
{
"message": "Inicio de sesión exitoso",
"redirect": "/home"
}
Ejemplo de posibles errores ❌ :
401 Unauthorizedsi las credenciales son incorrectas.
400 Bad Requestsi faltan datos.
Cierra la sesión del usuario y lo redirige a la página de inicio de sesión.
Endpoint: GET /users/logout/
Ejemplo de respuesta (302 Redirect)
(Redirige a /users/login/)
Note
Se utilizan formularios personalizados:
-
CustomUserCreationForm para el registro.
-
CustomAuthenticationForm para el inicio de sesión.
Se usa auth_login y auth_logout de Django para manejar sesiones.
Se redirige a diferentes vistas según el tipo de usuario registrado.
Obtiene una lista de todas las empresas registradas.
Endpoint: GET /companies/
Ejemplo de respuesta (200 OK). ✔️
[
{
"id": 1,
"name": "Empresa XYZ",
"email": "contacto@xyz.com",
"phone": "+123456789",
"user_id": 101
},
{
"id": 2,
"name": "Empresa ABC",
"email": "info@abc.com",
"phone": "+987654321",
"user_id": 102
}
]Crea una nueva empresa en el sistema.
Endpoint: POST /companies/create/
Parámetros requeridos (JSON)
{
"user_id": 101,
"name": "Empresa XYZ",
"email": "contacto@xyz.com",
"phone": "+123456789"
}Ejemplo de respuesta (201 Created). ✔️
{
"id": 1,
"user_id": 101,
"name": "Empresa XYZ",
"email": "contacto@xyz.com",
"phone": "+123456789"
}Ejemplo de posibles errores (400 Bad Request) si falta el campo user_id. ❌
{
"error": "user_id is required"
}Obtiene los detalles de una empresa específica.
Endpoint: GET /companies/{id}/detail/
Ejemplo de respuesta (200 OK) ✔️
{
"id": 1,
"user_id": 101,
"name": "Empresa XYZ",
"email": "contacto@xyz.com",
"phone": "+123456789"
}Ejemplo de posibles errores (404 Not Found) si la empresa no existe. ❌
{
"detail": "Not found."
}Actualiza todos los datos de una empresa.
Endpoint: PUT /companies/{id}/update/
Parámetros requeridos (JSON)
{
"name": "Empresa Actualizada",
"email": "nuevo@email.com",
"phone": "+000000000",
"address": "Calle 123",
"user_id": 101
}Ejemplo de respuesta (200 OK) ✔️
{
"id": 1,
"user_id": 101,
"name": "Empresa Actualizada",
"email": "nuevo@email.com",
"phone": "+000000000",
"address": "Calle 123"
}Permite actualizar solo algunos campos de la empresa.
Endpoint: PATCH /companies/{id}/update/
Ejemplo de petición (JSON)
{
"phone": "+111111111"
}Ejemplo de respuesta (200 OK) ✔️
{
"id": 1,
"user_id": 101,
"name": "Empresa XYZ",
"email": "contacto@xyz.com",
"phone": "+111111111"
}Elimina una empresa del sistema.
Endpoint: DELETE /companies/{id}/delete/
Ejemplo de respuesta (204 No Content) ✔️
(No retorna contenido)
Posibles errores:
404 Not Found si la empresa no existe. ❌
- Crear una empresa desde formulario URL: create_companies_form/int:user_id/ Muestra un formulario para registrar una empresa.
- Si la empresa se crea correctamente, redirige a home.
- En caso de error, recarga la página con un mensaje de error.
-
Dashboard de una empresa URL: /companies/{id}/cp-dashboard/ Muestra los detalles de una empresa y una lista de sus envíos.
-
Actualizar empresa desde formulario URL: /companies/{id}/cp-update/ Formulario para actualizar los datos de una empresa.
- Si la actualización es exitosa, redirige al dashboard de la empresa.
- Si hay un error, muestra un mensaje en la página.
Note
-
Se utiliza logging para registrar eventos (creación, actualización, eliminación, etc.).
-
Se manejan fechas en formato YYYY-MM-DD HH:MM.
-
La API usa requests para realizar llamadas internas a otros servicios.
Obtiene una lista de todos los conductores registrados.
Endpoint: GET /drivers/
Ejemplo de respuesta (200 OK). ✔️
[
{
"id": 1,
"name": "Juan Pérez",
"truck_plate": "XYZ123",
"phone": "+123456789",
"user": 101
},
{
"id": 2,
"name": "Ana López",
"truck_plate": "ABC987",
"phone": "+987654321",
"user": 102
}
]Registra un nuevo conductor en el sistema.
Endpoint: POST /drivers/create/
Parámetros requeridos (JSON):
{
"user": 101,
"name": "Juan Pérez",
"truck_plate": "XYZ123",
"phone": "+123456789"
}Ejemplo de respuesta (201 Created)
{
"id": 1,
"user": 101,
"name": "Juan Pérez",
"truck_plate": "XYZ123",
"phone": "+123456789"
}Posibles errores ❌:
400 Bad Request si los datos son incorrectos.
Obtiene la información de un conductor específico.
Endpoint: GET /drivers/{id}/detail/
Ejemplo de respuesta (200 OK). ✔️
{
"id": 1,
"user": 101,
"name": "Juan Pérez",
"truck_plate": "XYZ123",
"phone": "+123456789"
}Posibles errores 404 Not Found si el conductor no existe. ❌
{
"detail": "Not found."
}Modifica todos los datos de un conductor.
Endpoint: PUT /drivers/{id}/update/
Parámetros requeridos (JSON):
{
"name": "Juan Pérez",
"truck_plate": "XYZ789",
"phone": "+000000000",
"user": 101
}Ejemplo de respuesta (200 OK) ✔️
{
"id": 1,
"user": 101,
"name": "Juan Pérez",
"truck_plate": "XYZ789",
"phone": "+000000000"
}Borra un conductor del sistema.
Endpoint: DELETE /drivers/{id}/delete/
Ejemplo de respuesta (204 No Content)
(No retorna contenido)
Posibles errores 404 Not Found si el conductor no existe. ❌
- Crear un conductor desde formulario URL: create_driver_form/int:user_id/ Muestra un formulario para registrar un conductor.
- Si el conductor se crea correctamente, redirige a home.
- En caso de error, recarga la página con un mensaje de error.
-
Dashboard de un conductor URL: /drivers/{id}/dr-dashboard/ Muestra los detalles de un conductor y una lista de sus envíos.
-
Actualizar conductor desde formulario URL: /drivers/{id}/dr-update/ Formulario para actualizar los datos de un conductor.
- Si la actualización es exitosa, redirige al dashboard del conductor.
- Si hay un error, muestra un mensaje en la página.
Note
-
Se utiliza requests para hacer llamadas a la API desde las vistas HTML.
-
Se manejan fechas en formato YYYY-MM-DD HH:MM.
-
La API devuelve errores detallados en caso de problemas con las solicitudes.
Crea un nuevo envío con los datos proporcionados.
Endpoint: POST /shipments-add/
Parámetros requeridos (JSON):
{
"company_id": 1,
"driver_id": null,
"origin": "Madrid",
"destination": "Barcelona",
"status": "pending"
}Ejemplo de respuesta (200 OK). ✔️
{
"id": 10,
"company_id": 1,
"driver_id": null,
"origin": "Madrid",
"destination": "Barcelona",
"status": "pending",
"created_at": "2024-06-01T12:00:00Z"
}Posibles errores:
400 Bad Request si los datos son inválidos o faltan parámetros requeridos. ❌
Devuelve una lista de todos los envíos.
Endpoint: GET /shipments/list/
Ejemplo de respuesta (200 OK). ✔️
[
{
"id": 1,
"company_id": 2,
"driver_id": 5,
"origin": "Sevilla",
"destination": "Valencia",
"status": "in_progress"
},
{
"id": 2,
"company_id": 3,
"driver_id": null,
"origin": "Madrid",
"destination": "Bilbao",
"status": "pending"
}
]Posibles errores: 400 Bad Request en caso de fallo inesperado en la consulta. ❌
Devuelve los envíos pertenecientes a una empresa específica.
Endpoint: GET /shipments/{id}/co-shipments/
Parámetros de la URL:
company_id: ID de la empresa.
Ejemplo de respuesta (200 OK). ✔️
[
{
"id": 5,
"company_id": 3,
"driver_id": 7,
"origin": "Barcelona",
"destination": "Madrid",
"status": "completed"
}
]Posibles errores: ❌
404 Not Foundsi la empresa no tiene envíos.400 Bad Requesten caso de error interno.
Devuelve los envíos asignados a un conductor.
Endpoint: GET /shipments/{id}/dr-shipments
Parámetros de la URL:
driver_id: ID del conductor.
Ejemplo de respuesta (200 OK). ✔️
[
{
"id": 6,
"company_id": 1,
"driver_id": 2,
"origin": "Zaragoza",
"destination": "Málaga",
"status": "in_progress"
}
]Posibles errores: ❌
404 Not Foundsi el conductor no tiene envíos asignados.400 Bad Requesten caso de error interno.
Actualiza la información de un envío existente.
Endpoint: PUT /shipments/update/
Parámetros requeridos (JSON):
{
"id": 10,
"status": "completed",
"finished_at": "2025-03-11T20:00:00Z"
}Ejemplo de respuesta (200 OK). ✔️
{
"id": 10,
"company_id": 1,
"driver_id": 2,
"status": "completed",
"created_at": "2025-03-10T12:00:00Z",
"finished_at": "2025-03-11T20:00:00Z",
"origin": "Ciudad A",
"destination": "Ciudad B"
}Posibles errores: 400 Bad Request si los datos son inválidos o falta el ID del envío. ❌
Devuelve los envíos que aún no tienen un conductor asignado.
Endpoint: GET /shipments/without-driver/
Ejemplo de respuesta (200 ok) ✔️
[
{
"id": 3,
"company_id": 4,
"driver_id": null,
"origin": "Valencia",
"destination": "Madrid",
"status": "pending"
}
]Permite a un conductor tomar un envío disponible.
Endpoint: POST /shipments/assign-driver/{shipment_id}/
Ejemplo de respuesta:
{
"message": "Driver assigned successfully"
}Actualiza los detalles de un envío.
Endpoint: PUT /shipments/update/
Ejemplo de solicitud:
{
"id": 3,
"status": "completed"
}Ejemplo de respuesta:
{
"id": 3,
"company_id": 4,
"driver_id": 2,
"origin": "Valencia",
"destination": "Madrid",
"status": "completed"
}Elimina un envío si aún no tiene un conductor asignado.
Endpoint: DELETE /shipments/delete/{id}/
Ejemplo de respuesta (200 OK)
{
"message": "Shipment deleted"
}Posibles errores: 400 Bad Request si ocurre un error durante la eliminación. ❌
Note
-
Los datos se manejan a través del serializador ShipmentSerializer.
-
Se implementan métodos HTTP estándar: POST (crear), GET (consultar), PUT (actualizar) y DELETE (eliminar).
¡Las contribuciones son bienvenidas! Para contribuir:
-
Haz un fork del repositorio.
-
Crea una nueva rama:
git checkout -b feature/nueva-funcionalidad
-
Realiza tus cambios y haz commit:
git commit -m "Añadir nueva funcionalidad"- Envía un pull request 🚀.







