Не получаются пользовательские поля в событии :approved_post

Я пытаюсь сохранить пользовательские поля для поста, требующего проверки. Когда я одобряю пост, пользовательские поля не сохраняются.

Я проверил событие :approved_post, и пользовательские поля не передаются в полезной нагрузке (payload).

Как сохранить пользовательские поля для постов, требующих проверки?

Также я использовал NewPostManager, и в обработчике пользовательские поля доступны, но, разумеется, это срабатывает до сохранения данных в reviewables.

Можете показать нам код? В идеале — минимальный набор, достаточный для воспроизведения этой проблемы.

Я исправляю проблему с плагином событий, при которой данные событий в post_custom_field не сохраняются, если для категории установлена настройка «требовать одобрения тем». Я обратился к плагику polls, и там, похоже, пользовательские поля устанавливаются на
:approved_post.
Вот фрагмент кода из плагина 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

В моей попытке данные пользовательских полей доступны в NewPostManager, но экземпляр ReviewableQueuedPost в обратном вызове :approved_post (который в идеале должен содержать пользовательское поле в своём payload) не содержит их.

Я попробовал:


NewPostManager.add_handler do |manager|
 if manager.args['event'] && NewPostManager.post_needs_approval?(manager) # это условие истинно 
      manager.args['is_event'] = true
end

затем:

on(:approved_post) do |reviewable, post|
   p reviewable.payload['is_event'] #данные здесь недоступны
 end

Это интересно, потому что я тоже не ожидал, что опросы будут работать здесь. Аргументы, переданные менеджеру, автоматически не добавляются в полезную нагрузку проверяемого объекта.

Подозреваю, что здесь есть ошибка, связанная с опросами и постами в очереди. Похоже, validate_polls никогда не вызывается после утверждения. @Roman, можешь разобраться в этом?

Подтверждаю, что это ошибка. is_poll не сохраняется в полезной нагрузке, что делает обратный вызов бесполезным.

Вот PR для исправления:

Я также добавил новый интерфейс, чтобы мы могли расширять список разрешенных атрибутов из плагина.

Огромное спасибо за это, @Roman, @eviltrout. Я потратил целых два дня, чтобы во всём разобраться.

Отличная работа, @fzngagan!

@Roman, как ты думаешь, нужно ли портировать эту функцию обратно?
Я считаю, что это необходимо, чтобы пользователи веток tests-passed и release тоже могли этим воспользоваться. Думаю, что некоторые, если не большинство плагинов, использующих post_custom_fields, должны обрабатывать этот крайний случай.

@fzngagan похоже, что это уже находится в tests-passed, см. Commits · discourse/discourse · GitHub

@merefield. Ох, я не заметил.