Skip to content

Bootcamp-IA-P4/Track-Truck

Repository files navigation

Track-Truck 🚚

¿Que voy a encontrarme?
  1. ¿Qué es Track Truck?
  2. Tecnologías Utilizadas
  3. Instalación y Configuración
  4. Uso de la API
  5. Contribución

¿Qué es Track Truck?

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.

🌟 Características

✅ 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.


🛠️ Tecnologías Utilizadas

  • Backend: Django REST Framework (DRF) + Python
  • Base de Datos: PostgreSQL
  • Frontend: HTML + CSS + Bootstrap
  • Entorno Virtual: .env para configuración segura

🚀 Instalación y Configuración

1️⃣ Clonar el repositorio y entrar

git clone https://github.com/Bootcamp-IA-P4/Track-Truck.git
cd Track-Truck

2️⃣ Descarga el entorno virtual:

⚠️ linux/mac

python3 -m venv .venv

⚠️ windows

python -m venv .venv

3️⃣ Inicia el entorno virtual:

⚠️ linux/mac

source .venv/bin/activate

⚠️ windows

.venv\Scripts\activate

4️⃣ Descarga las siguientes dependencias:

uv pip install -r requirements.txt

5️⃣ Configura variables de entorno

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"

6️⃣ Accede a nuestra API:

python manage.py runserver

Important

La API estará disponible en http://127.0.0.1:8000/

📌 Uso de la API


Note

Si quieres ver esto de forma más visual visita:

Swagger UI: http://localhost:8000/docs/

docs

Redoc UI: http://localhost:8000/redoc/

redoc

🔹 Autenticación


Registro de usuario

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/"
}

singin

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

user_exits

Inicio de sesión

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"
}

login

Ejemplo de posibles errores ❌ :

401 Unauthorized si las credenciales son incorrectas.

400 Bad Request si faltan datos.


Cierre de sesión

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.


🔹 Gestión de Empresas


Obtener todas las empresas

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
    }
]

Crear una empresa

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"
}

Obtener detalles de una empresa

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."
}

Actualizar una empresa

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"
}

Actualización parcial de una empresa

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"
}

Eliminar una empresa

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. ❌


Vistas HTML (Interfaz Web)

  1. 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.
  1. Dashboard de una empresa URL: /companies/{id}/cp-dashboard/ Muestra los detalles de una empresa y una lista de sus envíos.

  2. Actualizar empresa desde formulario URL: /companies/{id}/cp-update/ Formulario para actualizar los datos de una empresa.

update_companies

  • 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.


🔹Gestión de Conductores


Obtener todos los conductores

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
    }
]

Crear un nuevo conductor

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.


Obtener detalles de un conductor

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."
}

Actualizar un conductor

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"
}

Eliminar un conductor

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. ❌


Vistas HTML (Interfaz Web)

  1. 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.
  1. Dashboard de un conductor URL: /drivers/{id}/dr-dashboard/ Muestra los detalles de un conductor y una lista de sus envíos.

  2. 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.

update-drivers

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.

🔹Gestión de Envíos


Crear un envío

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"
}

create-shipment

Posibles errores: 400 Bad Request si los datos son inválidos o faltan parámetros requeridos. ❌


Obtener la lista de envíos

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. ❌


Obtener envíos de una empresa

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 Found si la empresa no tiene envíos.
  • 400 Bad Request en caso de error interno.

Obtener envíos asignados a un conductor

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 Found si el conductor no tiene envíos asignados.
  • 400 Bad Request en caso de error interno.

Actualizar un envío

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. ❌


Obtener envíos sin conductor asignado

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"
    }
]

Asignar un conductor a un envío

Permite a un conductor tomar un envío disponible.

Endpoint: POST /shipments/assign-driver/{shipment_id}/

Ejemplo de respuesta:

{
    "message": "Driver assigned successfully"
}

Actualizar un envío

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"
}

shipments-driver


Eliminar un envío

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).


🤝 Contribución

¡Las contribuciones son bienvenidas! Para contribuir:

  1. Haz un fork del repositorio.

  2. Crea una nueva rama:

    git checkout -b feature/nueva-funcionalidad
  3. Realiza tus cambios y haz commit:

git commit -m "Añadir nueva funcionalidad"
  1. Envía un pull request 🚀.

🚀 ¡Gracias por usar Track-Truck! Si tienes preguntas, crea un issue en el repositorio o contáctanos.

About

Grupo 1- Api rest

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors