Copia de documentos

Cordial saludo,

¿’Puedo copiar documentos de un team a otro cuando se cumple una condición?

Ejemplo: tengo una politica en team de gestión documental pero quiero que se copie al team de Talento Humano cuando esta se apruebe.

Buenos días Rodrigo,

Dado que los teams normalmente son utilizados para separar completamente un entorno de otro, no es recomendable realizar la copia de un documento entre teams.

Sin embargo, en caso de que aún así se requiera, para lograrlo debiera ser creada una operación personalizada ya que se estaría “copiando” un documento entre equipos. Dicha operación debiera recibir la serie y el tipo documental de destino, además de un mapeo de metadatos para poder crear el nuevo documento con los mismos datos. Quedaría algo como lo siguiente:

import json

from operations.classes.document_operation import DocumentOperation
from operations.enums import ProcessOperationParameterType
from doctypes.models import DocumentType
from series.models import Serie

class CopyDocumentToSerieOperation(DocumentOperation):
version = “1.0”
name = “Copiar documento a otra serie y tipo documental”
description = “”“Esta operación crea una copia del documento actual en una serie y tipo documental de destino.”“”
deprecated = False
configuration_parameters = {
‘copy_to_serie’: {
‘label’: ‘Serie de destino’,
‘help_text’: ‘Serie o espacio donde copiar el documento’,
‘type’: ProcessOperationParameterType.TEXT.value[0]
},
‘copy_to_doctype’: {
‘label’: ‘Tipo documental de destino’,
‘help_text’: ‘Tipo documental para el documento en destino’,
‘type’: ProcessOperationParameterType.TEXT.value[0]
},
‘map_metadata’: {
‘label’: ‘Mapeo de campos’,
‘help_text’: ‘Diccionario que mapea los metadatos de origen con los de destino.’,
‘type’: ProcessOperationParameterType.TEXTAREA.value[0],
‘default_value’: ‘{}’,
},
}

def get_metadata_dict(self):
    document = self.document

    map_metadata_text = self.parameters.get('map_metadata', '{}')
    try:
        map_metadata = json.loads(map_metadata_text)
    except json.JSONDecodeError:
        map_metadata = {}

    new_metadata_map = {}
    for metadata_origen, metadata_destino in map_metadata.items():
        new_metadata_map\[metadata_destino\] = document.gmv(metadata_origen)

    return new_metadata_map

def execute(self, \*args, \*\*kwargs):
    document = self.document

    serie_id = self.parameters.get('copy_to_serie', '')
    doctype_id = self.parameters.get('copy_to_doctype', '')

    if serie_id:
        serie = Serie.objects.filter(name=serie_id).first()
        if not serie:
            serie = Serie.objects.filter(uuid=serie_id).first()
            if not serie:
                serie = document.serie
    else:
        serie = document.serie

    if doctype_id:
        doctype = DocumentType.objects.filter(name=doctype_id).first()
        if not doctype:
            doctype = DocumentType.objects.filter(uuid=doctype_id).first()
            if not doctype:
                doctype = document.doctype
    else:
        doctype = document.doctype

    try:
        metadata_dict = self.get_metadata_dict()
    except Exception:
        return {'msg_type': 'error', 'msg': 'Hubo un error al armar el diccionario de metadatos.'}

    try:
        serie.load_file(
            document.file.path,
            document.filename,
            doctype=doctype,
            metadata=metadata_dict,
        )
    except Exception:
        return {'msg_type': 'error', 'msg': 'Hubo un error al crear el documento nuevo.'}

    return {'msg_type': 'success', 'msg': 'Operacion ejecutada exitosamente'}

VERSION = CopyDocumentToSerieOperation.version
NAME = CopyDocumentToSerieOperation.name
DESCRIPTION = CopyDocumentToSerieOperation.description
ORDER = 4000
CATEGORY = “”
POSTLOAD = False
POSTCHARACT = False
POSTCLASSIF = False
POSTEXTRACTION = False
CONFIGURATION_PARAMETERS = CopyDocumentToSerieOperation.configuration_parameters

def run(uuid=None, **params):
return CopyDocumentToSerieOperation(uuid, **params).run()

Esta operación luego debiera ser configurada para ejecutarse en el evento requerido. ¿Cómo se representa actualmente la aprobación de la política?

En caso que la aprobación se represente como un cambio de estado, debiera ejecutarse en la transición de dicho cambio de estado. Si se representa a través del cambio de valor de un metadato, pues podría configurarse en el tipo de metadato.

Espero la respuesta sea útil,
Saludos,
Yair