Não estou recebendo campos personalizados no evento :approved_post

Estou tentando salvar campos personalizados para um post que precisa de revisão. Quando aprovo o post, os campos personalizados não são salvos.

Verifiquei o evento :approved_post e os campos personalizados não estão sendo incluídos no payload.

Como preservar os campos personalizados para posts revisáveis?

Além disso, usei o NewPostManager e, no manipulador, os campos personalizados estão disponíveis, mas, claro, ele é acionado antes de salvar os dados nos revisáveis.

Você pode nos mostrar um pouco de código? Idealmente, a quantidade mínima que possamos usar para reproduzir esse problema.

Estou corrigindo um problema no plugin de eventos onde os dados do evento em post_custom_field não são salvos se a categoria estiver configurada para exigir aprovação de tópicos.

Consultei o plugin de enquetes e lá parece que os campos personalizados estão sendo definidos em :approved_post.

Este é o trecho do código das enquetes:

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

Na minha tentativa, os dados dos campos personalizados estão disponíveis no NewPostManager, mas a instância ReviewableQueuedPost no callback de :approved_post (que idealmente deveria conter o campo personalizado em seu payload) não os possui.

Tentei:

NewPostManager.add_handler do |manager|
 if manager.args['event'] && NewPostManager.post_needs_approval?(manager) # esta condição é verdadeira 
      manager.args['is_event'] = true
end

E então:

on(:approved_post) do |reviewable, post|
   p reviewable.payload['is_event'] # os dados não estão disponíveis aqui
 end

Isso é interessante, pois eu também não esperaria que as enquetes funcionassem aqui. Os argumentos passados para o manager não são automaticamente incluídos no payload do reviewable.

Suspeito que haja um bug aqui relacionado a enquetes e posts em fila. Acredito que validate_polls nunca é chamado após a aprovação. @Roman, você pode investigar isso?

Confirmo que isso é um bug. is_poll não está sendo armazenado dentro do payload, tornando o callback inútil.

Aqui está um PR para corrigir isso:

Também adicionei uma nova interface para que possamos estender a lista de atributos permitidos a partir de um plugin.

Muito obrigado por isso, @Roman, @eviltrout. Passei 2 dias inteiros tentando resolver isso.

Muito bem @fzngagan!

@Roman, você acha que esse recurso precisa ser portado para versões anteriores?
Acho que sim, para que as pessoas nas branches de testes aprovados e de lançamento também possam se beneficiar. Acredito que alguns, senão a maioria dos plugins que usam post_custom_fields, precisam lidar com esse caso limite.

@fzngagan parece que isso já está em tests-passed, veja Commits · discourse/discourse · GitHub

@merefield. Ah, eu não notei.