| Name | managerodooapi JSON |
| Version |
0.2.0
JSON |
| download |
| home_page | None |
| Summary | Una librería completa para Odoo con capacidades avanzadas de exploración de relaciones y gestión de datos |
| upload_time | 2025-10-27 22:37:00 |
| maintainer | None |
| docs_url | None |
| author | None |
| requires_python | >=3.8 |
| license | MIT |
| keywords |
odoo
erp
xmlrpc
api
connector
business
|
| VCS |
 |
| bugtrack_url |
|
| requirements |
No requirements were recorded.
|
| Travis-CI |
No Travis.
|
| coveralls test coverage |
No coveralls.
|
# Manager Odoo API
Una librería de Python completa y fácil de usar para gestionar conexiones y operaciones con Odoo a través de XML-RPC.
## 🚀 Características Principales
- **Conexión sencilla**: Conecta a cualquier instancia de Odoo con credenciales simples
- **Operaciones CRUD completas**: Create, Read, Update, Delete en cualquier modelo
- **Soporte multi-compañía**: Trabaja con múltiples compañías en la misma instancia
- **Integración con pandas**: Crea registros masivos desde DataFrames
- **Upsert inteligente**: Crea o actualiza registros basado en IDs externos
- **Validación robusta**: Manejo de errores y validación de datos
- **Type hints**: Código completamente tipado para mejor desarrollo
## 📦 Instalación
```bash
pip install managerodooapi
```
## 🔧 Uso Básico
### Configuración inicial
```python
from managerodooapi import OdooConnector, Credentials
# Configurar credenciales
creds = Credentials(
url="http://localhost:8069",
db="mi_base_de_datos",
username="admin",
password="admin"
)
# Crear conector (se conecta automáticamente)
odoo = OdooConnector(creds)
```
### Operaciones básicas
```python
# Buscar registros
partner_ids = odoo.search('res.partner', [('is_company', '=', True)], limit=10)
# Leer registros
partners = odoo.read('res.partner', domain=[('is_company', '=', True)],
fields=['name', 'email', 'phone'])
# Crear registro
new_partner_id = odoo.create('res.partner', {
'name': 'Nuevo Cliente',
'email': 'cliente@ejemplo.com',
'is_company': True
})
# Actualizar registros
odoo.update('res.partner', [new_partner_id], {'phone': '+1234567890'})
# Eliminar registros
odoo.delete('res.partner', [new_partner_id])
```
### Operaciones avanzadas
```python
import pandas as pd
# Crear registros desde DataFrame
df = pd.DataFrame({
'name': ['Cliente 1', 'Cliente 2', 'Cliente 3'],
'email': ['c1@ejemplo.com', 'c2@ejemplo.com', 'c3@ejemplo.com']
})
field_map = {
'name': 'name',
'email': 'email'
}
result = odoo.create_from_df('res.partner', df, field_map,
static_values={'is_company': True})
print(f"Creados {result['total_created']} registros")
# Upsert (crear o actualizar)
partner_id, was_created = odoo.upsert_by_external_id(
'res.partner', 'ref', 'CLI001',
{'name': 'Cliente Actualizado', 'email': 'nuevo@ejemplo.com'}
)
```
### Soporte multi-compañía
```python
# Trabajar con una compañía específica
company_id = 1
# Buscar solo en esa compañía
partners = odoo.read('res.partner', company_id=company_id)
# Crear registro en esa compañía
new_id = odoo.create('res.partner', {'name': 'Partner'}, company_id=company_id)
```
### 🔗 Exploración de Relaciones *(Nuevo en v0.2.0)*
Una de las características más potentes de `managerodooapi` es su capacidad para explorar y navegar por las relaciones entre modelos de Odoo de manera intuitiva.
```python
# Obtener todas las relaciones de un modelo
relations = odoo.get_model_relations('res.partner')
print("Relaciones encontradas:")
for field, info in relations.items():
print(f"• {field}: {info['type']} → {info['relation']}")
# Explorar estructura completa con relaciones anidadas
structure = odoo.explore_model_structure('sale.order', max_depth=2)
print(f"Modelo: {structure['model']}")
print(f"Campos relacionales: {structure['field_count']}")
# Encontrar qué modelos referencian a otro modelo
reverse_relations = odoo.get_reverse_relations('res.partner')
print("Modelos que referencian a res.partner:")
for model, fields in reverse_relations.items():
print(f"• {model}: {', '.join(fields)}")
# Obtener registros relacionados eficientemente
customer_id = 123
orders = odoo.get_related_records(
'res.partner', customer_id, 'sale_order_ids',
fields=['name', 'date_order', 'amount_total'],
limit=10
)
# Analizar uso de campos relacionales
analysis = odoo.analyze_model_usage('res.partner', sample_size=100)
print(f"Uso promedio de relaciones: {analysis['usage_stats']['avg_relations_used']:.1f}%")
```
### Operaciones específicas de Odoo
```python
# Confirmar órdenes de venta
order_ids = [1, 2, 3]
odoo.confirm_sale_order(order_ids)
# Ejecutar cualquier método de Odoo
result = odoo.execute_kw(
odoo.creds.db, odoo.uid, odoo.creds.password,
'sale.order', 'action_confirm', [order_ids]
)
```
## 📚 Ejemplos Completos
### Gestión de Productos
```python
from managerodooapi import OdooConnector, Credentials
# Conectar
creds = Credentials("http://localhost:8069", "mi_db", "admin", "admin")
odoo = OdooConnector(creds)
# Crear categoría de producto
category_id = odoo.create('product.category', {'name': 'Electrónicos'})
# Crear productos
products_data = [
{
'name': 'Laptop Gaming',
'list_price': 1299.99,
'categ_id': category_id,
'type': 'product'
},
{
'name': 'Mouse Inalámbrico',
'list_price': 29.99,
'categ_id': category_id,
'type': 'product'
}
]
created_ids = odoo.create('product.product', products_data)
print(f"Productos creados: {created_ids}")
# Actualizar precios con descuento del 10%
for product_id in created_ids:
product_data = odoo.read('product.product',
domain=[('id', '=', product_id)],
fields=['list_price'])[0]
new_price = product_data['list_price'] * 0.9
odoo.update('product.product', [product_id], {'list_price': new_price})
```
### Importación masiva desde Excel
```python
import pandas as pd
# Leer archivo Excel
df = pd.read_excel('clientes.xlsx')
# Mapear columnas
field_map = {
'Nombre': 'name',
'Email': 'email',
'Teléfono': 'phone',
'Ciudad': 'city'
}
# Valores estáticos para todos los registros
static_values = {
'is_company': True,
'customer_rank': 1
}
# Importar en lotes
result = odoo.create_from_df('res.partner', df, field_map,
static_values=static_values, batch_size=100)
print(f"Procesados: {result['total_processed']}")
print(f"Creados: {result['total_created']}")
print(f"Errores: {len(result['errors'])}")
# Mostrar errores si los hay
for error in result['errors']:
print(f"Error: {error}")
```
## 🛠️ API Reference
### OdooConnector
La clase principal para todas las operaciones con Odoo.
#### Métodos principales:
- `search(model, domain, limit, company_id)`: Buscar IDs de registros
- `read(model, fields, domain, limit, company_id)`: Leer datos de registros
- `create(model, values, company_id)`: Crear uno o múltiples registros
- `update(model, ids, values, company_id)`: Actualizar registros existentes
- `delete(model, ids, company_id)`: Eliminar registros
- `create_from_df(model, df, field_map, ...)`: Crear registros desde DataFrame
- `upsert_by_external_id(...)`: Crear o actualizar por ID externo
- `execute_kw(...)`: Ejecutar cualquier método de Odoo
### Credentials
Clase para almacenar credenciales de conexión.
```python
@dataclass
class Credentials:
url: str # URL del servidor Odoo
db: str # Nombre de la base de datos
username: str # Usuario
password: str # Contraseña
```
## 🤝 Contribuir
Las contribuciones son bienvenidas. Por favor:
1. Fork el proyecto
2. Crea una rama para tu feature (`git checkout -b feature/AmazingFeature`)
3. Commit tus cambios (`git commit -m 'Add some AmazingFeature'`)
4. Push a la rama (`git push origin feature/AmazingFeature`)
5. Abre un Pull Request
## 📄 Licencia
Este proyecto está bajo la Licencia MIT. Ver el archivo `LICENSE` para más detalles.
## 🐛 Reportar Issues
Si encuentras algún bug o tienes una sugerencia, por favor crea un issue en GitHub.
## 📞 Soporte
Para soporte técnico o preguntas, puedes:
- Crear un issue en GitHub
- Revisar la documentación
- Consultar los ejemplos incluidos
---
**Desarrollado con ❤️ para la comunidad Odoo**
Raw data
{
"_id": null,
"home_page": null,
"name": "managerodooapi",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "odoo, erp, xmlrpc, api, connector, business",
"author": null,
"author_email": "Carlos Servin <tu.email@ejemplo.com>",
"download_url": "https://files.pythonhosted.org/packages/f2/48/8729388f38f7cfa4efbf8df895ce16b9b97d83daa12d53d2a13c34563c79/managerodooapi-0.2.0.tar.gz",
"platform": null,
"description": "# Manager Odoo API\r\n\r\nUna librer\u00eda de Python completa y f\u00e1cil de usar para gestionar conexiones y operaciones con Odoo a trav\u00e9s de XML-RPC.\r\n\r\n## \ud83d\ude80 Caracter\u00edsticas Principales\r\n\r\n- **Conexi\u00f3n sencilla**: Conecta a cualquier instancia de Odoo con credenciales simples\r\n- **Operaciones CRUD completas**: Create, Read, Update, Delete en cualquier modelo\r\n- **Soporte multi-compa\u00f1\u00eda**: Trabaja con m\u00faltiples compa\u00f1\u00edas en la misma instancia\r\n- **Integraci\u00f3n con pandas**: Crea registros masivos desde DataFrames\r\n- **Upsert inteligente**: Crea o actualiza registros basado en IDs externos\r\n- **Validaci\u00f3n robusta**: Manejo de errores y validaci\u00f3n de datos\r\n- **Type hints**: C\u00f3digo completamente tipado para mejor desarrollo\r\n\r\n## \ud83d\udce6 Instalaci\u00f3n\r\n\r\n```bash\r\npip install managerodooapi\r\n```\r\n\r\n## \ud83d\udd27 Uso B\u00e1sico\r\n\r\n### Configuraci\u00f3n inicial\r\n\r\n```python\r\nfrom managerodooapi import OdooConnector, Credentials\r\n\r\n# Configurar credenciales\r\ncreds = Credentials(\r\n url=\"http://localhost:8069\",\r\n db=\"mi_base_de_datos\",\r\n username=\"admin\",\r\n password=\"admin\"\r\n)\r\n\r\n# Crear conector (se conecta autom\u00e1ticamente)\r\nodoo = OdooConnector(creds)\r\n```\r\n\r\n### Operaciones b\u00e1sicas\r\n\r\n```python\r\n# Buscar registros\r\npartner_ids = odoo.search('res.partner', [('is_company', '=', True)], limit=10)\r\n\r\n# Leer registros\r\npartners = odoo.read('res.partner', domain=[('is_company', '=', True)], \r\n fields=['name', 'email', 'phone'])\r\n\r\n# Crear registro\r\nnew_partner_id = odoo.create('res.partner', {\r\n 'name': 'Nuevo Cliente',\r\n 'email': 'cliente@ejemplo.com',\r\n 'is_company': True\r\n})\r\n\r\n# Actualizar registros\r\nodoo.update('res.partner', [new_partner_id], {'phone': '+1234567890'})\r\n\r\n# Eliminar registros\r\nodoo.delete('res.partner', [new_partner_id])\r\n```\r\n\r\n### Operaciones avanzadas\r\n\r\n```python\r\nimport pandas as pd\r\n\r\n# Crear registros desde DataFrame\r\ndf = pd.DataFrame({\r\n 'name': ['Cliente 1', 'Cliente 2', 'Cliente 3'],\r\n 'email': ['c1@ejemplo.com', 'c2@ejemplo.com', 'c3@ejemplo.com']\r\n})\r\n\r\nfield_map = {\r\n 'name': 'name',\r\n 'email': 'email'\r\n}\r\n\r\nresult = odoo.create_from_df('res.partner', df, field_map, \r\n static_values={'is_company': True})\r\nprint(f\"Creados {result['total_created']} registros\")\r\n\r\n# Upsert (crear o actualizar)\r\npartner_id, was_created = odoo.upsert_by_external_id(\r\n 'res.partner', 'ref', 'CLI001',\r\n {'name': 'Cliente Actualizado', 'email': 'nuevo@ejemplo.com'}\r\n)\r\n```\r\n\r\n### Soporte multi-compa\u00f1\u00eda\r\n\r\n```python\r\n# Trabajar con una compa\u00f1\u00eda espec\u00edfica\r\ncompany_id = 1\r\n\r\n# Buscar solo en esa compa\u00f1\u00eda\r\npartners = odoo.read('res.partner', company_id=company_id)\r\n\r\n# Crear registro en esa compa\u00f1\u00eda\r\nnew_id = odoo.create('res.partner', {'name': 'Partner'}, company_id=company_id)\r\n```\r\n\r\n### \ud83d\udd17 Exploraci\u00f3n de Relaciones *(Nuevo en v0.2.0)*\r\n\r\nUna de las caracter\u00edsticas m\u00e1s potentes de `managerodooapi` es su capacidad para explorar y navegar por las relaciones entre modelos de Odoo de manera intuitiva.\r\n\r\n```python\r\n# Obtener todas las relaciones de un modelo\r\nrelations = odoo.get_model_relations('res.partner')\r\nprint(\"Relaciones encontradas:\")\r\nfor field, info in relations.items():\r\n print(f\"\u2022 {field}: {info['type']} \u2192 {info['relation']}\")\r\n\r\n# Explorar estructura completa con relaciones anidadas\r\nstructure = odoo.explore_model_structure('sale.order', max_depth=2)\r\nprint(f\"Modelo: {structure['model']}\")\r\nprint(f\"Campos relacionales: {structure['field_count']}\")\r\n\r\n# Encontrar qu\u00e9 modelos referencian a otro modelo\r\nreverse_relations = odoo.get_reverse_relations('res.partner')\r\nprint(\"Modelos que referencian a res.partner:\")\r\nfor model, fields in reverse_relations.items():\r\n print(f\"\u2022 {model}: {', '.join(fields)}\")\r\n\r\n# Obtener registros relacionados eficientemente\r\ncustomer_id = 123\r\norders = odoo.get_related_records(\r\n 'res.partner', customer_id, 'sale_order_ids',\r\n fields=['name', 'date_order', 'amount_total'],\r\n limit=10\r\n)\r\n\r\n# Analizar uso de campos relacionales\r\nanalysis = odoo.analyze_model_usage('res.partner', sample_size=100)\r\nprint(f\"Uso promedio de relaciones: {analysis['usage_stats']['avg_relations_used']:.1f}%\")\r\n```\r\n\r\n### Operaciones espec\u00edficas de Odoo\r\n\r\n```python\r\n# Confirmar \u00f3rdenes de venta\r\norder_ids = [1, 2, 3]\r\nodoo.confirm_sale_order(order_ids)\r\n\r\n# Ejecutar cualquier m\u00e9todo de Odoo\r\nresult = odoo.execute_kw(\r\n odoo.creds.db, odoo.uid, odoo.creds.password,\r\n 'sale.order', 'action_confirm', [order_ids]\r\n)\r\n```\r\n\r\n## \ud83d\udcda Ejemplos Completos\r\n\r\n### Gesti\u00f3n de Productos\r\n\r\n```python\r\nfrom managerodooapi import OdooConnector, Credentials\r\n\r\n# Conectar\r\ncreds = Credentials(\"http://localhost:8069\", \"mi_db\", \"admin\", \"admin\")\r\nodoo = OdooConnector(creds)\r\n\r\n# Crear categor\u00eda de producto\r\ncategory_id = odoo.create('product.category', {'name': 'Electr\u00f3nicos'})\r\n\r\n# Crear productos\r\nproducts_data = [\r\n {\r\n 'name': 'Laptop Gaming',\r\n 'list_price': 1299.99,\r\n 'categ_id': category_id,\r\n 'type': 'product'\r\n },\r\n {\r\n 'name': 'Mouse Inal\u00e1mbrico', \r\n 'list_price': 29.99,\r\n 'categ_id': category_id,\r\n 'type': 'product'\r\n }\r\n]\r\n\r\ncreated_ids = odoo.create('product.product', products_data)\r\nprint(f\"Productos creados: {created_ids}\")\r\n\r\n# Actualizar precios con descuento del 10%\r\nfor product_id in created_ids:\r\n product_data = odoo.read('product.product', \r\n domain=[('id', '=', product_id)], \r\n fields=['list_price'])[0]\r\n new_price = product_data['list_price'] * 0.9\r\n odoo.update('product.product', [product_id], {'list_price': new_price})\r\n```\r\n\r\n### Importaci\u00f3n masiva desde Excel\r\n\r\n```python\r\nimport pandas as pd\r\n\r\n# Leer archivo Excel\r\ndf = pd.read_excel('clientes.xlsx')\r\n\r\n# Mapear columnas\r\nfield_map = {\r\n 'Nombre': 'name',\r\n 'Email': 'email', \r\n 'Tel\u00e9fono': 'phone',\r\n 'Ciudad': 'city'\r\n}\r\n\r\n# Valores est\u00e1ticos para todos los registros\r\nstatic_values = {\r\n 'is_company': True,\r\n 'customer_rank': 1\r\n}\r\n\r\n# Importar en lotes\r\nresult = odoo.create_from_df('res.partner', df, field_map, \r\n static_values=static_values, batch_size=100)\r\n\r\nprint(f\"Procesados: {result['total_processed']}\")\r\nprint(f\"Creados: {result['total_created']}\")\r\nprint(f\"Errores: {len(result['errors'])}\")\r\n\r\n# Mostrar errores si los hay\r\nfor error in result['errors']:\r\n print(f\"Error: {error}\")\r\n```\r\n\r\n## \ud83d\udee0\ufe0f API Reference\r\n\r\n### OdooConnector\r\n\r\nLa clase principal para todas las operaciones con Odoo.\r\n\r\n#### M\u00e9todos principales:\r\n\r\n- `search(model, domain, limit, company_id)`: Buscar IDs de registros\r\n- `read(model, fields, domain, limit, company_id)`: Leer datos de registros \r\n- `create(model, values, company_id)`: Crear uno o m\u00faltiples registros\r\n- `update(model, ids, values, company_id)`: Actualizar registros existentes\r\n- `delete(model, ids, company_id)`: Eliminar registros\r\n- `create_from_df(model, df, field_map, ...)`: Crear registros desde DataFrame\r\n- `upsert_by_external_id(...)`: Crear o actualizar por ID externo\r\n- `execute_kw(...)`: Ejecutar cualquier m\u00e9todo de Odoo\r\n\r\n### Credentials\r\n\r\nClase para almacenar credenciales de conexi\u00f3n.\r\n\r\n```python\r\n@dataclass\r\nclass Credentials:\r\n url: str # URL del servidor Odoo\r\n db: str # Nombre de la base de datos\r\n username: str # Usuario\r\n password: str # Contrase\u00f1a\r\n```\r\n\r\n## \ud83e\udd1d Contribuir\r\n\r\nLas contribuciones son bienvenidas. Por favor:\r\n\r\n1. Fork el proyecto\r\n2. Crea una rama para tu feature (`git checkout -b feature/AmazingFeature`)\r\n3. Commit tus cambios (`git commit -m 'Add some AmazingFeature'`)\r\n4. Push a la rama (`git push origin feature/AmazingFeature`)\r\n5. Abre un Pull Request\r\n\r\n## \ud83d\udcc4 Licencia\r\n\r\nEste proyecto est\u00e1 bajo la Licencia MIT. Ver el archivo `LICENSE` para m\u00e1s detalles.\r\n\r\n## \ud83d\udc1b Reportar Issues\r\n\r\nSi encuentras alg\u00fan bug o tienes una sugerencia, por favor crea un issue en GitHub.\r\n\r\n## \ud83d\udcde Soporte\r\n\r\nPara soporte t\u00e9cnico o preguntas, puedes:\r\n- Crear un issue en GitHub\r\n- Revisar la documentaci\u00f3n\r\n- Consultar los ejemplos incluidos\r\n\r\n---\r\n\r\n**Desarrollado con \u2764\ufe0f para la comunidad Odoo**\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Una librer\u00eda completa para Odoo con capacidades avanzadas de exploraci\u00f3n de relaciones y gesti\u00f3n de datos",
"version": "0.2.0",
"project_urls": {
"Bug Reports": "https://github.com/tu-usuario/managerodooapi/issues",
"Documentation": "https://github.com/tu-usuario/managerodooapi/blob/main/README.md",
"Homepage": "https://github.com/tu-usuario/managerodooapi",
"Source": "https://github.com/tu-usuario/managerodooapi"
},
"split_keywords": [
"odoo",
" erp",
" xmlrpc",
" api",
" connector",
" business"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "fdb5e8294d3cb3047f9454b5dfafd089b3486d9074b7b72fdea81e6a72ece4cb",
"md5": "e252eb224ae5b97b607c245679aa30d1",
"sha256": "a294b95cb55c81ffbe5fba3909daf9ebd1b1b0d8443047b928bf42ce43d212c8"
},
"downloads": -1,
"filename": "managerodooapi-0.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "e252eb224ae5b97b607c245679aa30d1",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 11652,
"upload_time": "2025-10-27T22:36:59",
"upload_time_iso_8601": "2025-10-27T22:36:59.811329Z",
"url": "https://files.pythonhosted.org/packages/fd/b5/e8294d3cb3047f9454b5dfafd089b3486d9074b7b72fdea81e6a72ece4cb/managerodooapi-0.2.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f2488729388f38f7cfa4efbf8df895ce16b9b97d83daa12d53d2a13c34563c79",
"md5": "5e5e8664af803b60489b88f270522054",
"sha256": "d2978b10c713a6800c94d89b7ffe6045e6a371fc7a745ea219032971f84755dd"
},
"downloads": -1,
"filename": "managerodooapi-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "5e5e8664af803b60489b88f270522054",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 16368,
"upload_time": "2025-10-27T22:37:00",
"upload_time_iso_8601": "2025-10-27T22:37:00.768206Z",
"url": "https://files.pythonhosted.org/packages/f2/48/8729388f38f7cfa4efbf8df895ce16b9b97d83daa12d53d2a13c34563c79/managerodooapi-0.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-27 22:37:00",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "tu-usuario",
"github_project": "managerodooapi",
"github_not_found": true,
"lcname": "managerodooapi"
}