Objetivo
Permitir que un usuario seleccione documentos en un campo Choice (subtipo Document) y, al ejecutar una operación, se creen automáticamente filas en un campo de tipo tabla en el documento actual.
Este patrón es útil en procesos como:
Ofertas económicas (añadir productos o servicios).
Licitaciones (añadir proveedores seleccionados).
Pedidos o compras (añadir ítems seleccionados).
Requisitos previos
Un campo Choice configurado con subtipo Document
Un campo tabla donde se crearán las filas.
Una operación Python personalizada o automatismo que recupere los documentos seleccionados y genere las filas.
Un botón de ejecución configurado para lanzar la operación.
Campo | SubTipo | Clave | Descripción |
---|---|---|---|
Choice | Document | metadata.mi_campo_documentos | Campo donde el usuario selecciona los documentos. |
ITable | - | metadata.mi_campo_tabla | Tabla donde se crearán las filas con los datos de los documentos. |
Código de la operación
# Operation properties
from django.utils.translation import gettext as _
from file.models import File
import json
VERSION = "1.0"
NAME = _("Añadir filas desde documentos seleccionados")
DESCRIPTION = _("Crea filas en un ITable a partir de los documentos seleccionados en un campo Choice.")
ORDER = 100
CATEGORY = "Cookbook"
POSTLOAD = False
def run(uuid=None, **params):
from file.utils import get_document
fil = get_document(uuid, **params)
choice_field = 'metadata.mi_campo_documentos' # Campo Choice
itable_field = 'metadata.mi_campo_tabla' # Campo ITable
uuids = fil.gmv(choice_field)
if not uuids:
return {'msg_type': 'warning', 'msg': 'Seleccione uno o varios documentos.'}
if isinstance(uuids, str):
uuids = json.loads(uuids)
current_rows = fil.gmv(itable_field)
if isinstance(current_rows, str):
try:
current_rows = json.loads(current_rows)
except Exception:
current_rows = []
if not isinstance(current_rows, list):
current_rows = []
for doc_uuid in uuids:
try:
doc = File.objects.get(uuid=doc_uuid)
except File.DoesNotExist:
continue
new_row = {
's-descripcion-xxxxx': doc.gmv('metadata.producto_descripcion'),
's-precio-xxxxx': doc.gmv('metadata.producto_precio'),
's-cantidad-xxxxx': doc.gmv('metadata.producto_cantidad_minima') or 1,
'product_uuid': doc_uuid,
'DT_RowId': f'row-{doc_uuid}',
}
current_rows.append(new_row)
fil.set_metadata(itable_field, json.dumps(current_rows))
return {'msg_type': 'success', 'msg': 'Filas añadidas correctamente desde documentos seleccionados.'}
Configurar el botón de ejecución
Añade un campo de tipo botón en el formulario.
En la configuración del campo, selecciona la operación creada en la opción "Apply this automation on update event "
Configura la etiqueta del botón, por ejemplo: “Añadir filas desde documentos seleccionados”.
Guarda los cambios.
🧪 Resultado
El usuario selecciona documentos en el campo Choice.
Pulsa el botón.
La operación recupera esos documentos y crea una fila en el ITable por cada uno.
Cada ejecución añadirá nuevas filas correspondientes a los documentos seleccionados.
💡 Buenas prácticas
Usa el campo
product_uuid
como identificador único en la tabla.Guarda el valor del ITable siempre en formato JSON (
json.dumps
).Si quieres evitar duplicados, haz la operación idempotente (ver receta “Evitar duplicados en ITable”).
Añade logs con
fil.set_feature()
para registrar errores o depurar.
🧠 Tip: Este patrón puede aplicarse a cualquier tipo de relación entre documentos:
Expedientes ↔ Subdocumentos, Contratos ↔ Proveedores, Empleados ↔ Equipos asignados, etc.
Comentarios
0 comentarios
Inicie sesión para dejar un comentario.