• Workflow para mover archivos

  • Hemos intentado hacer de OpenKM una aplicación lo más intuitiva posible, sin embargo siempre viene bien algún consejo.
Hemos intentado hacer de OpenKM una aplicación lo más intuitiva posible, sin embargo siempre viene bien algún consejo.
Forum rules: Por favor, antes de preguntar algo consulta el wiki de documentación o utiliza la función de búsqueda del foro. Recuerda que no tenemos una bola de cristal ni poderes mentales, o sea que que para informar sobre un error es necesario que nos indiques tanto la versión de OpenKM que usas como la del navegador y sistema operativo. Para más información consulta Cómo informar de fallos de forma efectiva.
 #5103  by Pepito
 
Gracias por responder.
El problema es que siempre me coge un token distinto al token del usuario y eso que cogí el token según la uuid del usuario (también he probado a obtener el token con la clase sessionManager).

De todas formas eso es un problema secundario, lo que más me preocupa es que cuando muevo o renombro un documento al asignar un workflow me saltan los fallos antes mencionados, ¿tengo que usar otro método? , he probado con la clase OKMDocument y DirectDocumentModule. Quizá haya que refrescar la taxonomía porque cuando muevo un documento o lo renombro desde una tarea (entonces el usuario no esta en la pantalla de la taxonomía, está en la de tareas) no me da ningún fallo, ¿hay algún método o solución?. Gracias de antemano.
 #5106  by jllort
 
Hay una cosa que tienes que tener clara en la version 4.1, un usuario solo puede estar logeado una vez. Esta limitación en la 5.0 la hemos eliminado.
 #5107  by Pepito
 
Gracias por responder pero creo que no me he explicado bien o no entiendo muy bien tu respuesta.

Yo tengo un workflow que automáticamente renombra el fichero A y le pone de nombre B, bien si esto lo hago con una tarea que no es automática, es decir, requiere la interacción del usuario desde el apartado de tareas pendientes, lo renombra todo correctamente pero si esta tarea la hago automática (por ejemplo un workflow con una transición desde el nodo start hasta el primer nodo, en esa transición le meto la acción que simplemente renombra el archivo) entonces como la persona que asigna el workflow sigue en el escritorio es como si el propio openkm perdiera de vista el archivo, cabe decir que el archivo no se actualiza al instante, tengo que cambiar de carpeta y volver a la anterior.

Para dejarlo más claro:
-entro al escritorio.
-activo workflow para renombrar el archivo a.txt a b.txt
-el workflow lo renombra pero en pantalla sigo viendo el fichero como a.txt y me saltan los errores señalados en un post anterior.
-cierra la ventana de errores y cambio de carpeta
-vuelvo a la carpeta donde estaba a.txt y aparece como b.txt

En conclusión, se renombra bien pero la taxonomía se vuelve loca y como que no se actualiza en el acto aunque sí se actualiza el fichero.
Esto me pasa también cuando muevo un archivo, es decir, cuando cambia el path. Sin embargo cuando lo hago desde una tarea no automática como ya dije antes pese a que si vuelvo al escritorio no se ha actualizado el fichero (debo cambiar de carpeta y volver a la anterior) el fallo no aparece. ¿Hay que refrescar la taxonomía o la web?, ¿se puede?.
 #5110  by jllort
 
Tienes que darle al boton de refrescar ... la interfaz de usuario te da una vista de las carpetas y documentos, pero como hay varios usuarios trabajando a la vez con el paso del tiempo esta vista va cambiando. Puedes tener carpetas nuevas o algunas nuevas que no ves y lo mismo con documentos etc... lo que hacemos es intentar refrescar lo máximo posible con cada acción que realiza el usuario. Lo que no hacemos es refrescar automaticamente sin que el usuario lo pida para causar menos estress en el servidor ( esto creeme que esta bien pensando ... ) cuando le das a un folder te refresca los subfolders y carpetas internas, pero claro o bien haces click en el folder o le das al botón de refrescar.

Esto por un post es difícil de explicar ... pero piensa un poco a lo grande, imagínate una instalación de 300-400 usuarios y con un buen repositorio... la aplicación es web, con lo cual es la aplicación web la que dispara peticiones contra el servidor ... en este escenario constantemente se tendrían que disparar peticiones para mantener constantemente sincronizado lo que ves con lo que hay en el repositorio ... si piensas un poco en un arbol mas o menos desplegado es disparar el refresco por cada uno de los nodos ( no se si te lo puedes imaginar ) ... esto no es rentable ni deseable ... la mejor opción es la que esta implementada. Aqui pueden pasar 2 cosas. si una carpeta no existe; si pinchas encima te dirá que no existe y si pinchas en la carpeta padre al refrescar te desaparecerá, lo mismo con los documentos. Si hay algo nuevo al refrescar una carpeta te aparecera ( refrescar o pinchar encima que hace la operación de refresco ). Fíjate que siempre que subimos un documento etc... intentamos refrescar la vista actual ( no es por casualidad ).

Estas en el mundo web, cuando ves una pagina, la pagina no sabe nada del servidor ... sino que es ella la que solicita periodicamente refrescarse ... esta es la idea ... no sé si has entendido muy bien el problema ? en todo caso efectivamente si al disparar el workflow se mueve el documento ... tendrás que refrescar la interfaz de usuario ... por que despues de ejecutar el workflow este refresco no se ejecuta automaticamente ( igual seria buena idea despues de disparar un workflow refrescar la interfaz de usuario ... pero claro como lo asignas directamente no ? ... de esto la interfaz de usuario no sabe nada o sea que no le veo solución fácil ).
 #5114  by Pepito
 
Gracias por responder.
Después de leerte entiendo mejor el problema, es cierto que la carga sería bastante grande. El workflow no se asigna automáticamente, lo asigna manualmente el usuario, mi idea es que una vez lo haya asignado se ejecute una acción automática del workflow en la que se renombre el archivo y se refresque la página, lo primero sí sé hacerlo pero lo segundo no, lo único que quiero es saber cómo podría yo, desde el workflow, refrescar la página para que el proceso quede como lo siguiente:
-persona asigna el workflow al archivo a.txt y sigue en la pantalla de escritorio
-el archivo a.txt pasa a llamarse pendienteDeRevision_a.txt (hasta aquí todo bien)
-refresco la página para que no le aparezcan los errores mencionados (esos errores aparecen porque no se refresca, creo)
-el workflow continúa
Yo quiero refrescar la página desde el workflow una vez haya hecho un rename, un move, añadir una nota.....en resumidas cuentas que se refresque de la misma forma que lo hace cuando se mueve un archivo desde el menú o se añade una nota desde la pestaña de notas, pero en este caso lo haría yo manualmente desde el workflow (el refresco). Vamos que lo que quiero es lo último que has dicho "seria buena idea despues de disparar un workflow refrescar la interfaz de usuario", justamente eso es lo que no sé hacer y a la pregunta de después como ya dije antes, no, no se asigna automáticamente, la asignación del workflow es manual.

¿Hay algún método?.

P.D: perdón por tanta pregunta pero creo que no me he explicado bien. Gracias de antemano.
 #5116  by jllort
 
No, para esto hay que modificar el codigo fuente del UI. Y de todas formas tampoco puedes asegurar que te funcione siempre al 100% por el simple hecho que se estan ejecutando 2 cosas en paralelo. El workflow del lado del servidor es independiente del refresco que tambien es otra instancia del servidor cuando la llamada llega del UI.

Lo pensaré para la 5.0, pero lo veo negro ( aquí hay un problema de concurrencia ... el workflow debería enviar un mensaje, como una cola de batch de tareas pendientes de hacerse del lado del navegador y este debería leerlas ... esto como entenderas es complicarse mucho la vida ... hay que pensar algo mas sencillo que podría ser ejecutar el refresco despues de ejecutarse el workflow ... pero por el tema de concurrencia y que no sabemos que tarea terminará antes estamos en las mismas y no podemos asegurar que el refresco sea bueno, es decir que el refresco no termine antes de que termine la tarea del workflow ).

Lo meditare.
 #5120  by Pepito
 
Por lo que comentas sería bastante difícil sí, quizá comprobar qué procesos se están llevando acabo y una vez que uno finalice se refresque pero buff como bien dices ver qué tarea termina antes si el refresco o el workflow también sería un problema, bueno si se me ocurre algo lo comentaré a ver que te parece. En cualquier caso muchas gracias por responder a tanta pregunta que he hecho :).

EDITO: Una última cosa que se me olvidó preguntar:
Entonces las excepciones que mencioné, ¿no me las puedo tragar de ninguna forma?, probé a capturar las del método move, addnote, etc pero siguen apareciendo.
Otra cosa, no hay manera de capturar el token del usuario de la tarea, lo pongo en todo tipo de eventos, start, assign, etc... pero nada, siempre devuelve null. He probado con:

String uuid = (String)ctx.getContextInstance().getVariable("uuid"); <---aquí siempre sale la del sistema
SessionManager.getInstance().getTokenByUserId(uuid); <--aquí no me da el del usuario porque la uuid no es la suya.
SessionManager.getInstance().getSystemToken(); <---esta no sé si es para coger el del usuario pero me da el del sistema siempre (no sabía si al asignar la tarea a un usuario cogía entonces el suyo). Los usuarios los cogemos del active directory, no los tenéis en el propio openkm.
 #5124  by jllort
 
El UUID normalmente es un identificador unico que utilizamos para documentos y folders.
El uid de usuario es el nombre del usuario "okmAdmin" u otro
Y el system token, nada de nada ... eso es interno y no lo tienes que utilizar
 #5131  by Pepito
 
Gracias por responder, mi fallo era que confundía los términos token, uuid e id, pensaba que la id tenía que ser numérica por narices y bueno, más cosas que no tenía claras, al final conseguí que saliera la nota firmada por quien yo quiera, dejo el código por si le sirve a alguien:
Code: Select all
public void execute(ExecutionContext ctx) throws Exception{
		String usuario = SessionManager.getInstance().getTokenByUserId("nombre_usuario");
		String uuid = (String)ctx.getContextInstance().getVariable("uuid");
		String path = DirectDocumentModule.class.newInstance().getPath(usuario, uuid);
		OKMDocument.getInstance().addNote(usuario, path, "Pendiente de revisión. Yo mismo.");
	}
No sé si hay algo que debería cambiar (quizá haya alguna forma mejor de hacerlo) pero esta funciona, lo único que me extraña es el método getPath de DirectDocumentModule, ¿para qué necesita el token del usuario?, ¿para abrir la sesión?, es por entenderlo mejor >_<.

Y una pregunta:
-¿Cómo podría sustituir "nombre_usuario" de "getTokenByUserId("nombre_usuario");", que es la id que pongo yo manualmente (pongo el nombre del usuario que quiero), por la id del usuario que tiene asignada la tarea?, es decir, que no tenga que poner yo la id manualmente sino que varie según se asigne la tarea a uno u otro usuario. Es que tengo 3 workflows que hacen exactamente lo mismo pero varían en que la tarea se asigna a uno u otro usuario y cada vez que modifico un workflow me toca cambiar los 3 e ir poniendo en cada acción el nombre correcto pero si hago que coja el de la tarea me ahorraría bastante tiempo.
 #28017  by reynaldo
 
Hola Buen dia, stoy creando un workflow, al crear me crea una carpeta para un expediente EXP-001, cada usuario asignado, tendra la posibilidad de subir un archivo, y ser guardado en el expediente, puedo obtener la instancia del folder expediente, pero aun no he podido subir el archivo por el form.

he probado este codigo:
Code: Select all
<upload name="upload1" label="Subir archivo" folderPath="/okm:root/archivos"  data="data_upload1">
   </upload>

-----------------------------------------
 String uuid = (String) context.getContextInstance().getVariable("uuid");
	      String token = context.getToken().toString();
	      String folderPath = OKMRepository.getInstance().getNodePath(token, uuid);
	      context.getContextInstance().setVariable("document-path", folderPath);

          Upload upload = new Upload();
	      upload.setName("upload1");
	      upload.setLabel("Subir archivo");
	      upload.setData("data_upload1"); 
	      upload.setFolderPath(folderPath);
	      upload.setType("create");
	      context.getContextInstance().setVariable("file_subido", upload);
	      //String mivar = (String) context.getContextInstance().getVariable("file_subido");
	      System.out.println("uuid: "+uuid);
	      System.out.println("token:"+token);

Con codigo java, quiero modificar el folderPath, del upload, para que me suba en el expediente creado.. alguna solucion..
 #28049  by jllort
 
Hola Pepito lo mejor dentro del workflow es utilizar el usuario system:
Code: Select all
String token = DbSessionManager.getInstance().getSystemToken();
Reinaldo ya te he contestado la pregunta en otro post. Mejor si no mezclamos varias questiones en un mismo post,porque al final esto para otros usuarios es infumable. Para casos concretos mejor crear un post nuevo.

About Us

OpenKM is part of the management software. A management software is a program that facilitates the accomplishment of administrative tasks. OpenKM is a document management system that allows you to manage business content and workflow in a more efficient way. Document managers guarantee data protection by establishing information security for business content.