No se obtienen campos personalizados en el evento :approved_post

Estoy intentando guardar campos personalizados para una publicación que necesita revisión. Cuando apruebo la publicación, los campos personalizados no se guardan.

Verifiqué el evento :approved_post y los campos personalizados no se incluyen en el payload.

¿Cómo preservar los campos personalizados para las publicaciones revisables?

Además, utilicé NewPostManager, y en el manejador los campos personalizados están disponibles, pero por supuesto se activa antes de guardar los datos en las publicaciones revisables.

¿Puedes mostrarnos algo de código? Idealmente la cantidad mínima que podamos usar para reproducir este problema.

Estoy solucionando un problema con el plugin de eventos en el que los datos de los eventos en post_custom_field no se guardan si la categoría está configurada para requerir aprobación de los temas.

Hice referencia al plugin de polls y allí parece que los campos personalizados se establecen en :approved_post.

Este es el fragmento de código de polls:

NewPostManager.add_handler(1) do |manager|
    post = Post.new(raw: manager.args[:raw])

    if !DiscoursePoll::PollsValidator.new(post).validate_polls
      result = NewPostResult.new(:poll, false)

      post.errors.full_messages.each do |message|
        result.errors[:base] << message
      end

      result
    else
      manager.args["is_poll"] = true
      nil
    end
  end
on(:approved_post) do |queued_post, created_post|
    if queued_post.payload["is_poll"]
      created_post.validate_polls(true)
    end
  end

En mi intento, los datos de los campos personalizados están disponibles en NewPostManager, pero la instancia ReviewableQueuedPost en la devolución de llamada de :approved_post (que idealmente debería tener el campo personalizado en su payload) no los tiene.

Probé lo siguiente:

NewPostManager.add_handler do |manager|
 if manager.args['event'] && NewPostManager.post_needs_approval?(manager) # esta condición es verdadera 
      manager.args['is_event'] = true
end

y luego:

on(:approved_post) do |reviewable, post|
   p reviewable.payload['is_event'] # los datos no están disponibles aquí
 end

Esto es interesante porque tampoco esperaría que las encuestas funcionen aquí. Los argumentos pasados al administrador no se incluyen automáticamente en la carga útil del elemento revisable.

Sospecho que hay un error aquí con las encuestas y los mensajes en cola. Creo que validate_polls nunca se llama después de la aprobación. @Roman, ¿puedes revisarlo?

Confirmo que esto es un error. is_poll no se está almacenando dentro del payload, lo que hace que la devolución de llamada sea inútil.

Aquí hay una PR para solucionarlo:

También agregué una nueva interfaz para que podamos extender la lista de atributos permitidos desde un plugin.

Muchas gracias por esto, @Roman, @eviltrout. Me llevé 2 días completos enteros para resolver esto.

¡Bien hecho @fzngagan!

@Roman, ¿crees que esta característica necesita ser retrotraída?
Creo que debería serlo para que las personas en las ramas tests-passed y release también se beneficien. Creo que algunos, si no la mayoría, de los plugins que utilizan `post_custom_fields’ necesitan manejar este caso límite.

@fzngagan parece que esto ya está en tests-passed, consulta Commits · discourse/discourse · GitHub

@merefield. Oh, no lo noté.