Como regresar datos cuando ejecutas un script

Cuando un script se ejecuta dentro de la plataforma de LinkaForm. Dicho script o proceso se ejecuta dentro de un contenedor independiente a la plataforma, teniendo acceso a solo leer el STDOUT de dicho proceso.

Cuando ejecutas un script en python, para enviar datos al STDOUT una opcion es llamar al sys.stdout.write() para ello es necesario importar sys primero.

La información debe de ser regresada como un json para que LinkaForm pueda leer bien dicha repuesta es por eso que dentro del stdout write debe llevar un simplejson.dumps(res).

Donde res debe ser un json con la siguiente siguiente estructura

{
    'status': 101,
    'merge': {
        'primary': True,
        'replace': True,
        'answers': {
            '58d41fa6b43fdd78abf55f3b': 987,
        }
    },
    'id': '5ebd725889be1b27db41adab',
 }

Les explico las llaves del json:

valores Descripcion
status Opciones validas son 101 y 206.
merge Campo que indica la información que se va agregar y sus propiedades
metadata Campo para enviar información q se desea actualizar de la metadata, ojo folio solo funciona en post. Solo disponible en status 206
replace_ans reemplaza las respuestas al 100% sin hacer un merge las respuestas. Solo disponible en status 101. Nota: esta opcion solo es tomada en cuenta si la llave merge no esta presente.

status

Por el momento la llave status solo puede tener los valores de 101 o 206

valores Descripcion
101 Sirve para indicar que se hará un merge de los answers que mande el script con los answers del registro.
206 Sirve para indicar que se va a complementar las respuestas. Por ejemplo, si hay dos campos en el registro que sean cantidad de artículos y un campo de precio, el script puede calcular el total y se agregaría la respuesta en los answers
           answers_registro = {'cantidad': 3, 'precio': 10.0}

           answers_script = {'subtotal': 30.0}
     
          nuevos_answers = {'cantidad': 3, 'precio': 10.0,'subtotal': 30.0}

merge

Es una llave opcional, aunque requerida cuando se indica que es un status 101. Dentro de esta llave se deben enviar estos parametros.

Llave Descripcion
primary Boleano Default False. En el caso que la respuesta ya exista, si se configura como True indica que los valores que envia el script, reemplazaran a los valores actuales “de la respuesta” existente. Si se omite o se manda como False se conservan las respuestas del registro. Como quien dice, es para ver quien lleva mano
replace Boleano Default False. Es para cuando en los answers del registro y en los answers del script se manda una respuesta tipo grupo repetitivo, imágenes, o cualquier valor que sea del tipo lista, se usaría para saber si se va a reemplazar la lista o si se va a agregar a dicha lista
answers JSON. Son las respuestas que el script desea agregar al registro

Ejemplo con replace como True

         answers_registro = {'mi_lista': [1, 2, 3]}

         answers_script = {'mi_lista': [2, 3, 4, 5]}

         nuevos_answers = {'mi_lista': [2, 3, 4, 5]}

Se reemplazaron las posiciones y se agregaron las nuevas que no existían en el registro. En caso de no mandarse o mandarse como False se habría hecho un append y tendríamos algo así

        nuevos_answers = {'mi_lista': [1, 2, 3, 2, 3, 4, 5]}

id

Es el id del registro que se desea editar.

Ejemplo

#####
# Made by Jose Patricio VM
#####
# Script para generar Asistencia ejemplo Webinar
#
#
#####

import sys, simplejson, time

# from linkaform_api import settings
# from linkaform_api import network, utils

# from lkf_settings import *
import time


# net = network.Network(settings)
# cr = net.get_collections()


if __name__ == "__main__":
    #print 'starting..........'
    #print 'sys.argv[1]', sys.argv[1]
    current_record = simplejson.loads(sys.argv[1])
    #print 'current_record1', current_record
    if current_record.has_key('voucher'):
        current_record.pop('voucher')
    if current_record.has_key('other_versions'):
        current_record.pop('other_versions')

    sys.stdout.write(simplejson.dumps({
    'status': 101,
    'merge': {
        'primary': True,
        'replace': True,
        'answers': {
            '58d41fa6b43fdd78abf55f3b': 987,
        }
    },
    'id': '5ebd725889be1b27db41adab',
     }))

Crear folio nuevo

Para poder setear un folio en un script, esto solo se puede crear en en la creación de registros, osea en un POST. Para ello, el folio o cualquier otro dato de la metadata, debe de ser enviado en la llave metadata . Solo disponible en status 206.

ej

{
"status": 206,
"merge":{
    "answers":{"58d41fa6b43fdd78abf55f3b":"New answer"}
},
"metadata":{
   "folio":"NewFolioHere"
}
}