Ne pas obtenir les champs personnalisés sur l'événement :approved_post

J’essaie d’enregistrer des champs personnalisés pour un article nécessitant une validation. Lorsque j’approuve l’article, les champs personnalisés ne sont pas enregistrés.

J’ai vérifié l’événement :approved_post et les champs personnalisés ne sont pas inclus dans la charge utile.

Comment préserver les champs personnalisés pour les articles soumis à validation.

De plus, j’ai utilisé NewPostManager et, dans le gestionnaire, les champs personnalisés sont disponibles, mais bien sûr, cela se déclenche avant l’enregistrement des données dans les tables de validation.

Pouvez-vous nous montrer un peu de code ? Idéalement, le minimum nécessaire pour reproduire ce problème.

Je corrige un problème avec le plugin events où les données d’événements dans post_custom_field ne sont pas sauvegardées si la catégorie est configurée pour exiger une approbation des sujets.

J’ai consulté le plugin polls et il semble que les champs personnalisés y soient définis sur :approved_post.

Voici l’extrait de code du 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

Dans ma tentative, les données des champs personnalisés sont disponibles dans NewPostManager, mais l’instance ReviewableQueuedPost dans le callback de :approved_post (qui devrait idéalement contenir le champ personnalisé dans son payload) ne les possède pas.

J’ai essayé :

NewPostManager.add_handler do |manager|
 if manager.args['event'] && NewPostManager.post_needs_approval?(manager) # cette condition est vraie
      manager.args['is_event'] = true
end

puis :

on(:approved_post) do |reviewable, post|
   p reviewable.payload['is_event'] # les données ne sont pas disponibles ici
 end

C’est intéressant car je ne m’attendrais pas non plus à ce que les sondages fonctionnent ici. Les arguments passés au gestionnaire ne sont pas automatiquement ajoutés au contenu de l’élément révisable.

Je soupçonne un bug ici concernant les sondages et les messages en file d’attente. Je pense que validate_polls n’est jamais appelé après la validation. @Roman, peux-tu regarder cela ?

Je confirme qu’il s’agit d’un bogue. is_poll n’est pas stocké dans le payload, ce qui rend le callback inutile.

Voici une PR pour le corriger :

J’ai également ajouté une nouvelle interface afin que nous puissions étendre la liste des attributs autorisés depuis un plugin.

Un grand merci à vous, @Roman et @eviltrout. J’ai passé deux jours entiers à essayer de résoudre ce problème.

Bien joué @fzngagan !

@Roman, penses-tu que cette fonctionnalité doit être rétroportée ?
Je pense que oui, afin que les personnes sur les branches tests-passés et release puissent également en bénéficier. Je pense que certains, sinon la plupart des plugins utilisant post_custom_fields, doivent gérer ce cas limite.

@fzngagan, il semble que cela soit déjà sur tests-passed, voir Commits · discourse/discourse · GitHub

@merefield. Oh, je ne l’avais pas remarqué.