Script de Python para ocultar el formulario ploneformgen después de que el usuario lo haya completado. (Para Plone-4.3.2-64.)

Después de que un usuario haya completado un formulario (ploneformgen), me gustaría usar un adaptador de script personalizado para llamar a un script de Python para cambiar la función local del usuario para que ya no puedan ver el formulario. En otras palabras, quiero evitar que el usuario complete (o vea) el formulario dos veces.

Pensé que una forma de hacerlo es llamar al script permission_changer.py que se encuentra en la carpeta de formularios. El código que tengo en ese script es este:

container.manage_delLocalRoles(('bob',)) container.reindexObjectSecurity() 

Donde ‘bob’ es solo un usuario de ejemplo, que solo tiene el rol global FormFiller (que creé en la pestaña Seguridad del ZMI) y el rol local “Reader” para la carpeta de formularios.

Cuando completo el formulario (que tiene un estado “privado”) como administrador del sistema, el script se llama con éxito y Bob pierde su función local de “Lector” (que es todo lo que tenía que comenzar), y no puede ver el formulario más. Sin embargo, cuando bob llena el formulario, se muestra el error “No tiene suficientes privilegios para ver esta página”. El rol local de bob no se elimina. No puedo entender por qué y he intentado muchas cosas diferentes:

He cambiado el proxy para el permission_changer.py haciendo clic en la pestaña “Proxy” para el script en ZMI. Lo cambié a “Administrador”, “Administrador del sistema” y “Propietario”, pero eso no resolvió el problema (ni ninguna combinación de ellos).

Intenté cambiar el proxy creando un archivo permission_changer.py.metdadata en la carpeta del formulario e incluyendo esto:

  [default] proxy = Manager 

pero eso tampoco funcionó.

Extrañamente, cuando cambio el rol global de bob a Administrador, Administrador del sistema, o incluso Visor o Editor, el problema desaparece y el script se ejecuta correctamente (también puedo cambiar el script para que agregue y elimine otros roles locales arbitrarios) . (Estas opciones no son soluciones para mí porque Bob aún podrá ver el formulario debido a su rol global).

Además, intenté otorgarle al rol FormFiller todos los permisos posibles en la pestaña Seguridad, pero no funcionó.

Entonces, supongo que el problema tiene que ver con la configuración del proxy, pero no puedo entender qué estoy haciendo mal. He buscado mucho por todas partes y no encuentro a nadie que discuta un problema similar.

Cualquier ayuda sería muy apreciada!

La forma fea y fea de manejar esto puede ser acceder al método de descarga del campo de ahorro de datos y analizar su salida para encontrar datos para verificar. Por ejemplo, si el nombre de usuario es el segundo campo pfg agregado a la forma, un adaptador de script personalizado que evita que el usuario realice más rellenos puede ser

 alreadyInDB = False savedData = ploneformgen.savefield.getSavedFormInputForEdit() username = request.AUTHENTICATED_USER.getId() usersInDB = [x.split(',')[1] for x in savedData.split('\r\n') if len(x)>0] if username in usersInDB: alreadyInDB = True if alreadyInDB: return {'username': 'No way man!'} 

Me di cuenta de lo que estaba pasando, pero no estoy seguro de cómo describirlo con precisión. Básicamente, encontré que al llamar al script como una Acción de éxito personalizada (formulario> editar> anulaciones), no entiendo el problema. Así que creo que al llamar al script como adaptador de script personalizado, intenté cambiar el permiso del usuario cuando aún estaban comprometidos con el formulario y eso es imposible, incluso con la función de proxy de administrador.

Espero que eso ayude. Y si alguien tiene una descripción más precisa del problema, eso sería apreciado.

Para otorgar y revocar los permisos para enviar un formulario, puede:

  1. Cree un grupo (por ejemplo, con el ID “Remitentes”) y asígnele los usuarios elegidos.
  2. Asegúrese de que la carpeta de formularios tenga el estado ‘privado’ y otorgue permisos de visualización a través del tabulador de la carpeta de formularios al grupo
  3. Agregue un elemento de contenido del tipo ‘Página’ en la carpeta principal del formulario (por ejemplo, con el ID ‘enviado’) y establezca su estado en ‘público’
  4. Agregue un elemento de contenido del tipo ‘Adaptador de secuencias de comandos personalizado’, seleccione ‘Administrador’ en el campo ‘Función de proxy’, e inserte las siguientes líneas en el campo ‘Cuerpo de la secuencia de comandos’:
 # Remove current user of group and redirect to [FORM_PARENT_URL]/landing_page_id'. # If user is not in group, fail silently and continue. # Fail if landing_page_id does not exist in form-folder, or one of its parents. # # Assumes a page with the ID as declared in `landing_page_id` lives in the # form-folder's parent (or one of its grand-parents, first found wins), # and holds the state 'public', so users can view it regardless of their # group-memberships. # # Ment to be used after submission of a PloneFormGen-form with private-state and # a locally assigned Reader-role for the group, so only group-members can view and # submit the form. from Products.CMFCore.utils import getToolByName group_id = 'Submitters' # change as needed landing_page_id = 'submitted' # change as needed portal_groups = getToolByName(ploneformgen, 'portal_groups') user_id = ploneformgen.memberId() parent_url = '/'.join(ploneformgen.absolute_url().split('/')[:-1]) redirect_to_url = parent_url + '/' + landing_page_id # Revoke current user's group-membership: portal_groups.removePrincipalFromGroup(user_id, group_id) # Let user land in userland: request.response.redirect(redirect_to_url) 

Probado con Plone-4.3.11 y Products.PloneFormGen-1.7.25