Impossibile ottenere i campi personalizzati sull'evento :approved_post

Sto cercando di salvare i campi personalizzati per un post che richiede revisione. Quando approvo il post, i campi personalizzati non vengono salvati.

Ho controllato l’evento :approved_post e i campi personalizzati non vengono inseriti nel payload.

Come preservare i campi personalizzati per i post revocabili?

Inoltre, ho utilizzato NewPostManager, e lì nel gestore i campi personalizzati sono disponibili, ma ovviamente viene attivato prima di salvare i dati nei reviewables.

Puoi mostrarci del codice? Idealmente la quantità minima necessaria per riprodurre questo problema.

Sto risolvendo un problema con il plugin eventi in cui i dati degli eventi in post_custom_field non vengono salvati se la categoria è impostata per richiedere l’approvazione per i topic.

Ho fatto riferimento al plugin polls e lì sembra che i campi personalizzati vengano impostati su :approved_post.

Questo è il frammento di codice del plugin 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

Nel mio tentativo, i dati dei campi personalizzati sono disponibili in NewPostManager, ma l’istanza ReviewableQueuedPost nel callback di :approved_post (che idealmente dovrebbe contenere il campo personalizzato nel suo payload) non li ha.

Ho provato:

NewPostManager.add_handler do |manager|
 if manager.args['event'] && NewPostManager.post_needs_approval?(manager) # questa condizione risulta vera
      manager.args['is_event'] = true
end

Poi:

on(:approved_post) do |reviewable, post|
   p reviewable.payload['is_event'] # i dati non sono disponibili qui
 end

È interessante perché non mi aspetterei che i sondaggi funzionino nemmeno qui. Gli argomenti passati a manager non vengono inseriti automaticamente nel payload di reviewable.

Sospetto ci sia un bug qui tra i sondaggi e i post in coda. Sospetto che validate_polls non venga mai chiamato dopo l’approvazione. @Roman, puoi dare un’occhiata?

Confermo che si tratta di un bug. is_poll non viene salvato nel payload, rendendo inutile il callback.

Ecco una PR per risolverlo:

Ho anche aggiunto una nuova interfaccia in modo da poter estendere l’elenco degli attributi consentiti da un plugin.

Grazie mille per questo @Roman, @eviltrout. Ho passato 2 giorni interi a capire come risolvere.

Ottimo lavoro @fzngagan!

@Roman, pensi che questa funzionalità debba essere retroportata?
Credo di sì, in modo che anche gli utenti sui rami con test superati e sui rami di rilascio ne possano beneficiare. Penso che alcuni, se non la maggior parte, dei plugin che utilizzano post_custom_fields debbano gestire questo caso limite.

@fzngagan sembra che questo sia già su tests-passed, vedi Commits · discourse/discourse · GitHub

@merefield. Ohh, non l’avevo notato.