Ante todo, un saludo al Sr. Massimo Di Pierro y toda la colectividad que lo secunda, por este excelente framework, que no deja de sorprenderme.
Contexto del problema:
Versión de web2py: 2.13.4 para windows (EXE) (siempre voy al día ;-))
Sistema operativo: windows XP SP3.
Db: postgresql 9.4
Estoy usando como mecanismo general de tratamiento CRUD y funcionalidad asociada a los reg.de una tabla, el método SQLFORM(grid).
Pero me tope con un problema no menor: dos (o más) usuarios que acceden al mismo registro en un mismo lapso de tiempo -están mirando la misma información obviamente-, uno de ellos denominado “primero”, actualiza los datos -nada que objetar-, pero luego, un “segundo usuario”, que tiene todavía una "vista de datos viejos", al dar confirmar para actualizar los suyos, termina realizando cambios sobre datos no previamente refrescados como correspondería, si no que, además, campos que “segundo” no actualizó y están con valores “de la vista vieja”…..¡¡ se terminan restaurando ¡!!, anulando los valores que “primero” realizó…..
No encontré un mecanismo para detectar este hecho, y proceder a advertir a los usuarios, que deben refrescar los datos para proceder nuevamente a realizar cambios si corresponde, similar al que si poseen los formularios individuales con SQLFORM(form), como es, la acción DETECT_RECORD_CHANGE para el evento PROCESS().
Aclaro que no me estoy refiriendo al mecanismo transaccional de web2py y la DB -uso POSTGRESQL-, que funciona correctamente.
La
solución que busco -si alguien ya la descubrió- , sería un mecanismo general
para SQLFORM(grid), no para uno en particular. Quiero evitar el crear y asignar
FORMs individuales para SQLFORM(grid) dado que, obviamente, se dispararían los
tiempos de desarrollo, incrementando innecesariamente, la cantidad de objetos
de la aplicación.
Previamente, intenté solucionar esto en el evento ONVALIDATION, consultando el objeto form que recibe como parámetro, en sus atributos (record, latest, detect_changed, detect_record_change). Pero no obtuve resultados.
La idea, es que esto debiera ser un chequeo normal del GRID y cualquier otro tipo de FORM. Inclusive, debiera estar siempre activado y poder devolver un error específico y/o realizar una acción a sus efectos.
Gracias de antemano desde Montevideo/Uruguay.
update_form.process(
formname=formname,
onvalidation=onvalidation,
onfailure=onfailure,
onsuccess=onupdate,
next=referrer,
**processargs)