インポートされたプライベートディスカッションが作成者の受信トレイに表示されない

こんにちは、vBulletin5 データベースからプライベートメッセージのインポートを試みています。

インポートは動作しますが、投稿者のプロフィールでは、その会話が「送信済み」には表示されるものの、「受信トレイ」には表示されません。

一方、他の参加者のプロフィールでは、その会話が「受信トレイ」と「送信済み」の両方に正しく表示されています。

投稿者のプロフィール:
「送信済み」に表示されます

しかし、「受信トレイ」には表示されません

他の参加者のプロフィール:
両方に表示されます:

投稿者の受信トレイにその会話が表示されるようにするには、どのようにすればよいでしょうか?

必要であれば、現在の複雑なコードを以下に示します。

  def import_pm
    puts "", "プライベートメッセージのトピックをインポート中..."

    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 "参加者の ID のいずれかが 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 # 自分自身への PM?
            # skip = true
            p[:target_usernames] = "system"
            puts "pm-#{pm['nodeid']} に宛先がありません"
          end
        # 最初の投稿ではない場合
        else
          next unless topic = topic_lookup_from_imported_post_id("pm-#{pm["starter"]}")
          p[:topic_id] = topic[:topic_id]

        end
        puts "投稿 : #{p}\n"
        p
      end
    end
    exit
  end

データエクスプローラーから、participant_count の値が正しくないことに気づきました:
image

1 と表示されていますが、会話には 2 人がいます。
もしトピックのフィールド participant_count を 2 に更新すると、

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

トピックが作成者の受信トレイに表示されるようになります:

reply_count のような他のフィールドを更新したときはこのような挙動には気づかなかったため、これは participant_count およびおそらく他の特定のフィールドに固有の問題のようです。

インポートスクリプトでは、以下を追加しようとしました:

p[:participant_count] = target_usernames.count

しかし、機能しませんでした。インポーターのメソッドではこのフィールドを設定できないのかもしれません。

そのため、少し行き詰まっています。ユーザーが返信付きのすべての PM を、自分が開始したものだけでなく、すべて受信トレイで確認できるようにしたいのです。

何かアイデアはありますか?

@kris.kotlarek さん、ご意見はありますか?

バグの指摘をありがとうございます。私も確認しましたが、おっしゃる通りです。participant_count が正しくない場合、メッセージは投稿者の受信トレイに表示されません。

また、create_posts にそのパラメータを明示的に追加しても、正しく設定されないという点もその通りです。

これは、TopicCreate に許可されたパラメータの明示的なリストがあるためです。

本日、インポートモードでその属性を受け付けるように Discourse への PR を作成します。

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

create_posts メソッドが post_creator を評価し、それが topic_creator をトリガーするため、[:topic_opts] の下に配置する必要があります。