API FastAPI con Arquitectura Hexagonal para gestionar autenticación y validación de permisos en Odoo mediante JSONRPC.
Este proyecto implementa Arquitectura Hexagonal (Ports & Adapters) para mantener el código limpio, testeable y desacoplado:
src/
├── domain/ # 🎯 Capa de Dominio (Núcleo)
│ ├── entities/ # Entidades del negocio
│ ├── value_objects/ # Value Objects inmutables
│ ├── repositories/ # Interfaces (Ports)
│ └── exceptions/ # Excepciones del dominio
├── application/ # 💼 Capa de Aplicación
│ └── use_cases/ # Casos de uso del negocio
├── infrastructure/ # 🔧 Capa de Infraestructura (Adapters)
│ ├── odoo/ # Cliente JSONRPC de Odoo
│ ├── repositories/ # Implementaciones concretas
│ └── config/ # Configuración
└── presentation/ # 🌐 Capa de Presentación
├── api/ # Endpoints FastAPI
├── schemas/ # Schemas Pydantic
└── dependencies/ # Inyección de dependencias
- Domain: Lógica de negocio pura, sin dependencias externas
- Application: Casos de uso que orquestan la lógica de dominio
- Infrastructure: Implementaciones técnicas (Odoo JSONRPC, BD, etc.)
- Presentation: API REST con FastAPI
- ✅ Autenticación con Odoo mediante JSONRPC
- ✅ Verificación de permisos sobre modelos (CRUD)
- ✅ Consulta de grupos de seguridad del usuario
- ✅ Consulta de acceso a aplicaciones de Odoo
- ✅ Información completa del usuario
- ✅ Arquitectura limpia y testeable
- ✅ Documentación automática con Swagger/ReDoc
- ✅ Validación con Pydantic
- ✅ CORS configurable
cd /home/dannkol/Documentos/odoo/sales
python3 -m venv venv
source venv/bin/activate # En Linux/Mac
# venv\Scripts\activate # En Windows
pip install -r requirements.txt
Copiar el archivo de ejemplo y configurar:
cp .env.example .env
Editar .env
con tus credenciales de Odoo:
ODOO_URL=https://ave-odoo.coolify.meeldavlab.xyz
ODOO_DATABASE=odoo
ODOO_TIMEOUT=30
SECRET_KEY=your-super-secret-key
python main.py
O con uvicorn directamente:
uvicorn main:app --reload --host 0.0.0.0 --port 8000
La API estará disponible en:
- API: http://localhost:8000
- Documentación Swagger: http://localhost:8000/docs
- Documentación ReDoc: http://localhost:8000/redoc
Autenticar usuario en Odoo.
Request:
{
"database": "odoo",
"username": "dannkol@fake.com",
"password": "your_password"
}
Response:
{
"success": true,
"message": "Autenticación exitosa",
"uid": 8,
"username": "dannkol@fake.com",
"database": "odoo",
"server_info": {
"server_version": "18.0-20250918",
"server_serie": "18.0",
"protocol_version": 1
}
}
Nota: El uid
retornado debe usarse como Bearer token en las siguientes peticiones.
Obtener información del usuario actual.
Headers:
Authorization: Bearer {uid}
Response:
{
"uid": 8,
"name": "Daniel Manosalva",
"login": "dannkol@fake.com",
"email": "dannkol@fake.com",
"is_administrator": false,
"groups": [...],
"total_groups": 30
}
Verificar si el usuario tiene permiso para una operación específica.
Headers:
Authorization: Bearer {uid}
Request:
{
"model": "res.partner",
"operation": "read",
"raise_exception": false
}
Response:
{
"model": "res.partner",
"operation": "read",
"has_access": true,
"message": "Acceso concedido para operación 'read' en modelo 'res.partner'"
}
Obtener permisos sobre múltiples modelos.
Headers:
Authorization: Bearer {uid}
Query params (opcional):
models
: Lista de modelos a verificar
Response:
{
"uid": 8,
"permissions": {
"res.partner": {
"read": true,
"write": true,
"create": false,
"unlink": false
},
"sale.order": {
"read": true,
"write": true,
"create": true,
"unlink": false
}
},
"total_models": 11
}
Obtener acceso a las aplicaciones de Odoo.
Headers:
Authorization: Bearer {uid}
Response:
{
"uid": 8,
"administration": {
"Administration": true,
"Settings": true
},
"management": {
"Sales Manager": true,
"Purchase Manager": true
},
"user_access": {
"Sales": true,
"Purchase": true,
"Inventory": true
},
"no_access": ["Point of Sale", "Manufacturing"],
"summary": {
"total_applications": 20,
"with_access": 15,
"without_access": 5,
"access_percentage": 75.0
}
}
# Instalar dependencias de testing
pip install pytest pytest-asyncio pytest-cov
# Ejecutar tests
pytest
# Con cobertura
pytest --cov=src tests/
Por simplicidad, esta API usa el UID como Bearer token directamente. En producción, se recomienda:
- Implementar JWT tokens
- Agregar refresh tokens
- Gestionar expiración de sesiones
- Implementar rate limiting
- Colección de Postman: "Odoo JSONRPC over REST"
- Documentación Odoo: External API
- Script original:
test/odoo_access_rights_complete.py
- FastAPI: Framework web moderno y rápido
- Pydantic: Validación de datos
- Odoo JSONRPC: Comunicación con Odoo
- Arquitectura Hexagonal: Clean Architecture
res.partner
: Contactos/Partnersres.users
: Usuariosres.company
: Compañíassale.order
: Órdenes de ventapurchase.order
: Órdenes de compraaccount.move
: Facturas/Asientosstock.picking
: Transferencias de inventarioproduct.product
: Productosproject.project
: Proyectoshr.employee
: Empleados
- Fork el proyecto
- Crear una rama feature (
git checkout -b feature/AmazingFeature
) - Commit cambios (
git commit -m 'Add some AmazingFeature'
) - Push a la rama (
git push origin feature/AmazingFeature
) - Abrir un Pull Request
Este proyecto es de código abierto.
Desarrollado para gestionar permisos y accesos en Odoo de forma programática.
¿Preguntas? Consulta la documentación interactiva en /docs
después de iniciar el servidor.