managerodooapi


Namemanagerodooapi JSON
Version 0.2.0 PyPI version JSON
download
home_pageNone
SummaryUna librería completa para Odoo con capacidades avanzadas de exploración de relaciones y gestión de datos
upload_time2025-10-27 22:37:00
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
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"
}
        
Elapsed time: 0.48424s