Keine benutzerdefinierten Felder im :approved_post-Event

Ich versuche, benutzerdefinierte Felder für einen Beitrag, der einer Prüfung bedarf, zu speichern. Wenn ich den Beitrag genehmige, werden die benutzerdefinierten Felder nicht gespeichert.

Ich habe das Ereignis :approved_post überprüft, und die benutzerdefinierten Felder werden nicht im Payload gesetzt.

Wie kann man benutzerdefinierte Felder für prüfbare Beiträge beibehalten?

Außerdem habe ich NewPostManager verwendet. Dort sind die benutzerdefinierten Felder im Handler verfügbar, aber natürlich wird dies ausgelöst, bevor die Daten in den Reviewables gespeichert werden.

Könntest du uns etwas Code zeigen? Idealerweise das Minimum, das wir benötigen, um dieses Problem nachzuvollziehen.

Ich behebe ein Problem mit dem Events-Plugin, bei dem die Event-Daten im Feld post_custom_field nicht gespeichert werden, wenn die Kategorie so eingestellt ist, dass eine Genehmigung für Themen erforderlich ist.

Ich habe mich auf das polls-Plugin bezogen, und dort scheint es, dass die benutzerdefinierten Felder auf :approved_post gesetzt werden.

Dies ist der Code-Auszug aus 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

In meinem Versuch sind die Daten der benutzerdefinierten Felder in NewPostManager verfügbar, aber die Instanz ReviewableQueuedPost im Callback von :approved_post (die idealerweise das benutzerdefinierte Feld in ihrem Payload enthalten sollte) hat diese nicht.

Ich habe Folgendes versucht:

NewPostManager.add_handler do |manager|
 if manager.args['event'] && NewPostManager.post_needs_approval?(manager) # Diese Bedingung ist erfüllt
      manager.args['is_event'] = true
end

Dann:

on(:approved_post) do |reviewable, post|
   p reviewable.payload['is_event'] # Daten sind hier nicht verfügbar
 end

Das ist interessant, denn ich würde auch hier nicht erwarten, dass Umfragen funktionieren. Die an den Manager übergebenen Argumente werden nicht automatisch in die Nutzlast des Überprüfungsobjekts übernommen.

Ich vermute, es liegt hier ein Fehler bei Umfragen und in der Warteschlange befindlichen Beiträgen vor. Ich vermute, validate_polls wird nach der Freigabe nie aufgerufen. @Roman, könntest du das bitte prüfen?

Ich bestätige, dass dies ein Fehler ist. is_poll wird nicht im Payload gespeichert, was den Callback nutzlos macht.

Hier ist ein PR zur Behebung:

Außerdem habe ich eine neue Schnittstelle hinzugefügt, damit wir die Liste der zulässigen Attribute über ein Plugin erweitern können.

Vielen Dank dafür, @Roman, @eviltrout. Ich habe zwei ganze Tage damit verbracht, das herauszufinden.

Gut gemacht, @fzngagan!

@Roman, denkst du, dass dieses Feature zurückportiert werden muss?
Ich finde, es sollte so sein, dass auch Nutzer auf Tests-passed- und Release-Branches davon profitieren können. Ich denke, einige, wenn nicht die meisten Plugins, die post_custom_fields verwenden, müssen diesen Randfall behandeln.

@fzngagan sieht so aus, als wäre das bereits in tests-passed, siehe Commits · discourse/discourse · GitHub

@merefield. Oh, das ist mir gar nicht aufgefallen.