Импортированные приватные обсуждения не отображаются в входящих автора

Привет, я пытаюсь импортировать личные сообщения из базы данных vBulletin5.

Это работает, но в профиле автора обсуждение отображается только во вкладке «Отправленные», а не во «Входящих».

На профиле другого участника обсуждение корректно отображается как во «Входящих», так и в «Отправленных».

Профиль автора:
Отображается во «Входящих»

Но не отображается во «Входящих»

Профиль другого участника:
Отображается в обоих разделах:

Как сделать так, чтобы обсуждение отображалось во «Входящих» у автора?

Мой текущий неаккуратный код, если это необходимо:

  def import_pm
    puts "", "importing topics PMs..."

    pms_count = mysql_query("SELECT COUNT(nodeid) cnt, starter
        FROM #{DB_PREFIX}node
        WHERE (unpublishdate = 0 OR unpublishdate IS NULL)
        AND (approved = 1 AND showapproved = 1)    
          AND starter = 2676436
        AND contenttypeid=#{@pm};"
    ).first["cnt"]

    batches(BATCH_SIZE) do |offset|
      pms = mysql_query <<-SQL
        SELECT pm.nodeid AS pmid, pm.starter, pm.title, pm.parentid AS parentid,pm.open,pm.userid AS postuserid,pm.publishdate AS dateline,
            nv.count views, 1 AS visible, pm.sticky,
            CONVERT(CAST(rawtext AS BINARY)USING utf8) AS raw
        FROM #{DB_PREFIX}node pm
        LEFT JOIN #{DB_PREFIX}nodeview nv ON nv.nodeid=pm.nodeid
        LEFT JOIN #{DB_PREFIX}text txt ON txt.nodeid=pm.nodeid
        WHERE
          pm.contenttypeid = #{@pm}
          AND (pm.unpublishdate = 0 OR pm.unpublishdate IS NULL)
          AND pm.approved = 1 AND pm.showapproved = 1
          AND pm.starter = 2676436
        ORDER BY pm.nodeid
          LIMIT #{BATCH_SIZE}
          OFFSET #{offset}
      SQL

      break if pms.size < 1

      create_posts(pms, total: pms_count, offset: 0) do |pm|
        p = {}

        p[:id] = "pm-#{pm['pmid']}"
        p[:user_id] = user_id_from_imported_user_id(pm['postuserid']) || Discourse::SYSTEM_USER_ID
        p[:raw] = preprocess_post_raw(pm['raw']) rescue nil
        p[:created_at] = parse_timestamp(pm["dateline"]),

        topic_id = nil

        next if p[:raw].blank?

        # если это первый пост
        if pm['parentid'] == 8 
          #next unless post = topic_lookup_from_imported_post_id("pm-#{pm["pmid"]}")

          target_usernames = []
          target_userids = []
          # получаем список пользователей
          userlist = mysql_query("select distinct userid from sentto where nodeid = #{pm["starter"]}")
          userlist.each do |user|
            userid = user_id_from_imported_user_id(user["userid"]) || Discourse::SYSTEM_USER_ID;
            target_userids << userid || Discourse::SYSTEM_USER_ID
            target_usernames << User.find_by(id: userid).try(:username) || "system"
          end

          participants = target_userids
          begin
            participants.sort!
          rescue
            puts "one of the participant's id is nil -- #{participants.inspect}"
          end

          p[:title] = @htmlentities.decode(pm['title']).strip[0...255]
          p[:archetype] = Archetype.private_message
          p[:target_usernames] = target_usernames.join(',')

          if p[:target_usernames].size < 1 # ЛС самому себе?
            # skip = true
            p[:target_usernames] = "system"
            puts "pm-#{pm['nodeid']} has no target"
          end
        # если это не первый пост
        else
          next unless topic = topic_lookup_from_imported_post_id("pm-#{pm["starter"]}")
          p[:topic_id] = topic[:topic_id]

        end
        puts "post : #{p}\n"
        p
      end
    end
    exit
  end

Из Data Explorer я заметил, что значение participant_count указано неверно:
image

Там написано 1, но в разговоре участвуют два человека.
Если я обновлю поле participant_count темы до 2 следующим образом:

Topic.find_by(id: 218613).update(participant_count: 2)

то тема теперь появится во входящих у автора:

Я не заметил подобного поведения при обновлении других полей, например reply_count, поэтому кажется, что это специфично для participant_count и, возможно, других полей.

В моем скрипте импорта я попытался добавить следующее:

p[:participant_count] = target_usernames.count

Но это не сработало. Полагаю, мы не можем устанавливать это поле в методах импортеров.

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

Есть какие-то идеи?

Есть какие-то мысли по этому поводу, @kris.kotlarek?

Спасибо, что указали на эту ошибку. Я проверил это сам, и вы правы — когда participant_count указан неверно, сообщение не отображается в входящих сообщениях его автора.

Также вы правы: даже если вы явно добавите этот параметр в create_posts, он всё равно устанавливается неправильно.

Это связано с тем, что TopicCreate содержит явный список разрешённых параметров:

Сегодня я создам PR в репозиторий Discourse, чтобы разрешить этот атрибут в режиме импорта.

А пока, чтобы не ждать выхода последней версии Discourse, вы можете выполнить в самом конце вашего скрипта:

Topic.private_messages.map(&:update_statistics) — это должно исправить все показатели.

PR готов — FIX: topic_creator accepts participant_count in import mode by KrisKotlarek · Pull Request #10632 · discourse/discourse · GitHub

После слияния и развёртывания вы сможете использовать его следующим образом:

create_posts(pms, total: pms_count, offset: 0) do |pm|
...
  p[:topic_opts][:participant_count] = target_usernames.count 
...
end

Это должно находиться под [:topic_opts], так как метод create_posts вычисляет post_creator, что запускает topic_creator.