Table of Contents
Modelos Tryton del Sistema (ir.*)
Este documento describe los modelos del sistema Tryton que se utilizan en el proyecto y cómo se implementan.
Tabla de Contenidos
- ir.attachment - Archivos Adjuntos
- ir.note - Notas
- ir.ui.menu - Menús
- ir.ui.icon - Iconos
- ir.lang - Idiomas
- ir.model.access - Control de Acceso
- ir.action.keyword - Acciones
- ir.module - Módulos
- ir.email - Correos Electrónicos
ir.attachment - Archivos Adjuntos
Descripción
Modelo para gestionar archivos adjuntos asociados a cualquier recurso del sistema.
Uso en el Proyecto
Métodos Disponibles
1. searchAttachments(resourceKey, offset, limit)
- Propósito: Buscar archivos adjuntos de un recurso específico
- Parámetros:
resourceKey: String en formato"modelo,id"(ej:"gnuhealth.patient,2")offset: Número de registros a saltar (default: 0)limit: Número máximo de registros (default: 1000)
- Retorna: Array de IDs de archivos adjuntos
- Ejemplo:
const attachmentIds = await trytonService.searchAttachments("gnuhealth.patient,123");
2. readAttachments(ids)
- Propósito: Leer información de archivos adjuntos (sin los bytes del archivo)
- Parámetros:
ids: Array de IDs de archivos adjuntos
- Retorna: Array de objetos con información de los archivos
- Campos retornados:
name: Nombre del archivodescription: Descripcióntype: Tipo de archivolink: URL si es un enlace externolast_modification: Fecha de última modificaciónlast_user: Usuario que modificóresource: Recurso asociadosummary: Resumen_timestamp: Timestamp para control de concurrencia_write,_delete: Permisos
- Ejemplo:
const attachments = await trytonService.readAttachments([1, 2, 3]);
3. readAttachmentData(ids, { preview })
- Propósito: Leer los datos reales del archivo (bytes en base64)
- Parámetros:
ids: Array de IDspreview: Boolean para obtener versión optimizada (default: false)
- Retorna: Array con los datos del archivo
- Ejemplo:
const attachmentData = await trytonService.readAttachmentData([1], { preview: true });
4. createAttachment({ name, resource, dataBase64, description, type, link })
- Propósito: Crear un nuevo archivo adjunto
- Parámetros:
name: Nombre del archivoresource: String en formato"modelo,id"dataBase64: Datos del archivo en base64description: Descripción opcionaltype: Tipo de archivo (default: "data")link: URL si es enlace externo
- Retorna: Array con el ID del archivo creado
- Ejemplo:
const newAttachment = await trytonService.createAttachment({
name: "documento.pdf",
resource: "gnuhealth.patient,123",
dataBase64: "JVBERi0xLjQKJeLjz9MK...",
description: "Historial médico"
});
5. deleteAttachment(ids, timestampMap)
- Propósito: Eliminar archivos adjuntos
- Parámetros:
ids: ID único o array de IDstimestampMap: Objeto con timestamps para control de concurrencia
- Retorna: Resultado de la eliminación
- Ejemplo:
await trytonService.deleteAttachment([1, 2], { 1: "2024-01-01T00:00:00", 2: "2024-01-01T00:00:00" });
6. getAttachmentDefaults()
- Propósito: Obtener valores por defecto para crear archivos adjuntos
- Retorna: Objeto con valores por defecto
- Ejemplo:
const defaults = await trytonService.getAttachmentDefaults();
Flujo de Uso Típico
- Buscar archivos de un recurso:
const ids = await trytonService.searchAttachments("gnuhealth.patient,123");
- Leer información de los archivos:
const attachments = await trytonService.readAttachments(ids);
- Descargar un archivo específico:
const [fileData] = await trytonService.readAttachmentData([attachmentId]);
const blob = base64ToBlob(fileData.data);
- Subir un nuevo archivo:
const file = event.target.files[0];
const base64 = await fileToBase64(file);
await trytonService.createAttachment({
name: file.name,
resource: "gnuhealth.patient,123",
dataBase64: base64
});
ir.note - Notas
Descripción
Modelo para gestionar notas/comentarios asociados a recursos del sistema.
Uso en el Proyecto
Métodos Disponibles
1. searchNotes(resourceKey, offset, limit)
- Propósito: Buscar notas de un recurso específico
- Parámetros:
resourceKey: String en formato"modelo,id"offset: Número de registros a saltar (default: 0)limit: Número máximo de registros (default: 1000)
- Retorna: Array de IDs de notas
- Ejemplo:
const noteIds = await trytonService.searchNotes("gnuhealth.patient,123");
2. readNotes(ids)
- Propósito: Leer información de notas
- Parámetros:
ids: Array de IDs de notas
- Retorna: Array de objetos con información de las notas
- Campos retornados:
message_wrapped: Contenido de la notalast_modification: Fecha de última modificaciónlast_user: Usuario que modificóunread: Boolean indicando si está sin leerresource: Recurso asociado_timestamp: Timestamp para control de concurrencia_write,_delete: Permisos
- Ejemplo:
const notes = await trytonService.readNotes([1, 2, 3]);
3. createNote({ message, resource, unread })
- Propósito: Crear una nueva nota
- Parámetros:
message: Contenido de la notaresource: String en formato"modelo,id"unread: Boolean indicando si debe marcarse como no leída
- Retorna: Array con el ID de la nota creada
- Ejemplo:
const newNote = await trytonService.createNote({
message: "Paciente requiere seguimiento",
resource: "gnuhealth.patient,123",
unread: true
});
4. deleteNote(ids, timestampMap)
- Propósito: Eliminar notas
- Parámetros:
ids: ID único o array de IDstimestampMap: Objeto con timestamps para control de concurrencia
- Retorna: Resultado de la eliminación
- Ejemplo:
await trytonService.deleteNote([1], { 1: "2024-01-01T00:00:00" });
5. getNoteFieldsView()
- Propósito: Obtener la vista de campos del modelo de notas
- Retorna: Objeto con la definición de campos
- Ejemplo:
const fieldsView = await trytonService.getNoteFieldsView();
6. getNoteModels()
- Propósito: Obtener lista de modelos que pueden tener notas
- Retorna: Array de nombres de modelos
- Ejemplo:
const models = await trytonService.getNoteModels();
Flujo de Uso Típico
- Buscar notas de un recurso:
const noteIds = await trytonService.searchNotes("gnuhealth.patient,123");
const notes = await trytonService.readNotes(noteIds);
- Crear una nueva nota:
await trytonService.createNote({
message: "Nota importante",
resource: "gnuhealth.patient,123",
unread: false
});
- Marcar nota como leída:
// Actualizar la nota para cambiar unread a false
await trytonService.updateRecord("ir.note", noteId, { unread: false });
ir.ui.menu - Menús
Descripción
Modelo para gestionar la estructura de menús del sistema.
Uso en el Proyecto
Métodos Disponibles
1. getSidebarMenu()
- Propósito: Obtener la estructura completa del menú del sidebar
- Retorna: Objeto con:
preferences: Preferencias del usuariomenuItems: Array de elementos del menú principalicons: Lista de iconos disponiblesmodelAccess: Permisos de acceso a modelospysonMenu: Configuración PYSON del menú
- Estructura de menuItems:
{
id: 1,
name: "Nombre del menú",
icon: "📋",
iconName: "tryton-list",
iconUrl: "blob:...",
model: "gnuhealth.patient",
description: "Descripción",
sequence: 0,
childs: null, // null para lazy loading
childIds: [2, 3], // IDs de hijos
hasChildren: true,
childrenLoaded: false
}
- Ejemplo:
const menuData = await trytonService.getSidebarMenu();
2. getMenuItemById(menuId)
- Propósito: Obtener información de un menú específico por ID
- Parámetros:
menuId: ID del menú
- Retorna: Objeto con información del menú o null
- Ejemplo:
const menuItem = await trytonService.getMenuItemById(59);
3. loadMenuChildren(menuId)
- Propósito: Cargar los hijos de un menú bajo demanda (lazy loading)
- Parámetros:
menuId: ID del menú padre
- Retorna: Array de elementos hijos
- Ejemplo:
const children = await trytonService.loadMenuChildren(59);
4. getSubmenus(childIds, level, maxDepth)
- Propósito: Obtener submenús recursivamente (método interno)
- Parámetros:
childIds: Array de IDs de hijoslevel: Nivel actual de profundidadmaxDepth: Profundidad máxima (default: 5)
- Retorna: Array de submenús procesados
- Nota: Este método es usado internamente por
getSidebarMenu()
5. getMenuActionInfo(menuId, selectedActionIndex)
- Propósito: Obtener información de la acción asociada a un menú
- Parámetros:
menuId: ID del menúselectedActionIndex: Índice de la acción si hay múltiples (default: 0)
- Retorna: Objeto con información de la acción:
{
actionInfo: [...], // Array de acciones disponibles
toolbarInfo: {...}, // Información del toolbar
resModel: "gnuhealth.patient", // Modelo de la acción
actionName: "Pacientes",
hasMultipleOptions: false, // Si hay múltiples opciones
isWizard: false, // Si es un wizard
fieldsView: {...}, // Vista de campos
viewType: "tree", // Tipo de vista
viewId: 123, // ID de la vista
selectedOption: {...} // Opción seleccionada
}
- Ejemplo:
const actionInfo = await trytonService.getMenuActionInfo(59);
Flujo de Uso Típico
- Cargar menú principal:
const menuData = await trytonService.getSidebarMenu();
// Renderizar menuItems en el sidebar
- Cargar hijos bajo demanda:
// Cuando el usuario expande un menú
const children = await trytonService.loadMenuChildren(menuId);
// Actualizar el menú con los hijos cargados
- Obtener acción al hacer clic:
const actionInfo = await trytonService.getMenuActionInfo(menuId);
if (actionInfo.isWizard) {
// Manejar wizard
} else if (actionInfo.resModel) {
// Abrir tabla o formulario
}
ir.ui.icon - Iconos
Descripción
Modelo para gestionar iconos SVG del sistema.
Uso en el Proyecto
Métodos Disponibles
1. listIcons()
- Propósito: Obtener lista de todos los iconos disponibles
- Retorna: Array de arrays
[[id, nombre], ...] - Ejemplo:
const icons = await trytonService.listIcons();
// Resultado: [[1, 'tryton-list'], [2, 'tryton-star'], ...]
2. getIconData(iconIds)
- Propósito: Obtener datos SVG de iconos específicos
- Parámetros:
iconIds: Array de IDs de iconos
- Retorna: Array de objetos con
nameeicon(SVG) - Ejemplo:
const iconData = await trytonService.getIconData([1, 2]);
3. getIconUrl(iconName, color)
- Propósito: Obtener URL de blob para un icono (con caché)
- Parámetros:
iconName: Nombre del icono (ej: "tryton-list")color: Color para el SVG (default: "#267f82")
- Retorna: URL de blob o string vacío si no existe
- Ejemplo:
const iconUrl = await trytonService.getIconUrl("tryton-list", "#267f82");
// Usar en: <img src={iconUrl} />
4. preloadIcons(iconNames, color)
- Propósito: Precargar múltiples iconos en batch
- Parámetros:
iconNames: Array de nombres de iconoscolor: Color para los SVGs (default: "#267f82")
- Retorna: Objeto con mapeo
{ iconName: url } - Ejemplo:
const iconUrls = await trytonService.preloadIcons(
["tryton-list", "tryton-star"],
"#267f82"
);
5. convertSvgToUrl(svgData, color)
- Propósito: Convertir SVG string a URL de blob con color aplicado
- Parámetros:
svgData: String con el SVGcolor: Color para aplicar (default: "#267f82")
- Retorna: URL de blob
- Ejemplo:
const url = trytonService.convertSvgToUrl("<svg>...</svg>", "#267f82");
6. clearIconCache()
- Propósito: Limpiar la caché de iconos (útil para cambios de tema)
- Ejemplo:
trytonService.clearIconCache();
Flujo de Uso Típico
- Precargar iconos del menú:
const iconNames = menuItems.map(item => item.iconName).filter(Boolean);
const iconUrls = await trytonService.preloadIcons(iconNames);
// Asignar iconUrls a los items del menú
- Obtener icono individual:
const iconUrl = await trytonService.getIconUrl("tryton-list");
// Usar en componente
<img src={iconUrl} alt="Icon" />
- Cargar iconos desde archivos locales:
// Si el icono no está en el backend, se intenta cargar desde /images/{iconName}.svg
// Esto se hace automáticamente en getIconUrl()
ir.lang - Idiomas
Descripción
Modelo para gestionar idiomas disponibles en el sistema.
Uso en el Proyecto
Métodos Disponibles
1. getAvailableLanguages()
- Propósito: Obtener todos los idiomas disponibles en Tryton
- Retorna: Array de IDs de idiomas
- Ejemplo:
const languageIds = await trytonService.getAvailableLanguages();
// Luego usar read para obtener detalles: model.ir.lang.read([...], ["code", "name"])
Flujo de Uso Típico
- Obtener idiomas disponibles:
const languageIds = await trytonService.getAvailableLanguages();
const languages = await trytonService.makeRpcCall("model.ir.lang.read", [
languageIds,
["code", "name", "translatable"]
]);
ir.model.access - Control de Acceso
Descripción
Modelo para gestionar permisos de acceso a modelos.
Uso en el Proyecto
Métodos Disponibles
1. getModelAccess()
- Propósito: Obtener permisos de acceso a modelos para el usuario actual
- Retorna: Array de objetos con:
model: Nombre del modeloperm_read: Permiso de lecturaperm_write: Permiso de escrituraperm_create: Permiso de creaciónperm_delete: Permiso de eliminación
- Ejemplo:
const access = await trytonService.getModelAccess();
// Verificar permisos antes de mostrar/ocultar acciones
Flujo de Uso Típico
- Verificar permisos antes de acciones:
const access = await trytonService.getModelAccess();
const modelAccess = access.find(a => a.model === "gnuhealth.patient");
if (modelAccess && modelAccess.perm_create) {
// Mostrar botón de crear
}
ir.action.keyword - Acciones
Descripción
Modelo para gestionar acciones asociadas a menús y botones.
Uso en el Proyecto
Métodos Disponibles
1. getMenuActionInfo(menuId, selectedActionIndex)
- Propósito: Obtener información de acción de un menú
- Detalles: Ver sección ir.ui.menu
2. getActionOptions(menuId)
- Propósito: Obtener opciones de acción cuando hay múltiples disponibles
- Parámetros:
menuId: ID del menú
- Retorna: Objeto con:
{
hasOptions: true,
options: [
{
index: 0,
id: 123,
name: "Opción 1",
resModel: "gnuhealth.patient",
contextModel: "gnuhealth.appointment",
type: "ir.action.act_window",
views: [[1, "tree"], [2, "form"]]
}
],
defaultIndex: 0
}
- Ejemplo:
const options = await trytonService.getActionOptions(menuId);
// Mostrar modal para que el usuario seleccione
3. executeSelectedAction(menuId, selectedActionIndex)
- Propósito: Ejecutar una acción seleccionada después de mostrar modal
- Parámetros:
menuId: ID del menúselectedActionIndex: Índice de la acción seleccionada
- Retorna: Objeto con información para abrir la vista
- Ejemplo:
const result = await trytonService.executeSelectedAction(menuId, 0);
if (result.requiresContext) {
// Mostrar modal para seleccionar contexto
}
ir.module - Módulos
Descripción
Modelo para gestionar módulos instalados en el sistema.
Uso en el Proyecto
Uso Interno
Se utiliza internamente en getSidebarMenu() para verificar autenticación:
const testResult = await this.makeRpcCall(
"model.ir.module.search_read",
[[["state", "=", "installed"]], ["name"]]
);
ir.email - Correos Electrónicos
Descripción
Modelo para gestionar envío de correos electrónicos.
Uso en el Proyecto
Métodos Disponibles
1. getRecordData(model, recordId, fields)
- Propósito: Obtener datos de un registro para usar en email
- Parámetros:
model: Nombre del modelorecordId: ID del registrofields: Campos a obtener (default: ["id", "rec_name"])
- Retorna: Objeto con datos del registro
- Ejemplo:
const recordData = await trytonService.getRecordData("gnuhealth.patient", 123);
2. getEmailTemplateDefault(model, recordId)
- Propósito: Obtener plantilla de email por defecto para un modelo
- Parámetros:
model: Nombre del modelorecordId: ID del registro
- Retorna: Datos de la plantilla
- Ejemplo:
const template = await trytonService.getEmailTemplateDefault("gnuhealth.patient", 123);
3. getEmailComplete(query, limit)
- Propósito: Obtener sugerencias de autocompletado para direcciones de email
- Parámetros:
query: Texto de búsquedalimit: Límite de resultados (default: 1000)
- Retorna: Array de sugerencias
- Ejemplo:
const suggestions = await trytonService.getEmailComplete("john", 10);
Flujo de Uso Típico
- Abrir modal de email:
const recordData = await trytonService.getRecordData("gnuhealth.patient", 123);
const template = await trytonService.getEmailTemplateDefault("gnuhealth.patient", 123);
// Mostrar modal con datos precargados
- Autocompletar destinatarios:
const suggestions = await trytonService.getEmailComplete("john");
// Mostrar sugerencias en dropdown
Notas Importantes
Control de Concurrencia
Los modelos ir.attachment e ir.note utilizan timestamps (_timestamp) para control de concurrencia. Siempre incluir estos timestamps al actualizar o eliminar.
Lazy Loading de Menús
Los menús utilizan lazy loading para mejorar el rendimiento. Los hijos se cargan solo cuando el usuario expande un menú.
Caché de Iconos
Los iconos se cachean en memoria para evitar múltiples llamadas al servidor. Usar clearIconCache() cuando cambie el tema.
Recursos (resource)
Los modelos ir.attachment e ir.note usan el campo resource en formato "modelo,id" para asociar archivos y notas a cualquier recurso del sistema.