Importierte private Diskussion erscheint nicht im Posteingang des Autors

Hallo, ich versuche, private Nachrichten aus einer vBulletin5-Datenbank zu importieren.

Es funktioniert, aber im Profil des Autors erscheint die Diskussion nur unter „Gesendet", nicht im „Posteingang".

Im Profil des anderen Teilnehmers erscheint die Diskussion korrekt sowohl im „Posteingang" als auch unter „Gesendet".

Profil des Autors:
Erscheint unter „Gesendet"

Aber nicht im „Posteingang"

Profil des anderen Teilnehmers:
Erscheint in beiden:

Wie kann ich bewirken, dass die Diskussion auch im Posteingang des Autors erscheint?

Falls nötig, hier mein aktueller, etwas unübersichtlicher Code:

  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 first post
        if pm['parentid'] == 8 
          #next unless post = topic_lookup_from_imported_post_id("pm-#{pm["pmid"]}")

          target_usernames = []
          target_userids = []
          # get user list
          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 # pm with yourself?
            # skip = true
            p[:target_usernames] = "system"
            puts "pm-#{pm['nodeid']} has no target"
          end
        # if not first post
        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

Im Daten-Explorer habe ich festgestellt, dass der Wert für participant_count falsch ist:
image

Dort steht 1, aber in der Unterhaltung sind zwei Personen.
Wenn ich das Feld participant_count des Themas auf 2 aktualisiere, wie hier:

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

erscheint das Thema nun im Posteingang des Autors:

Ich habe dieses Verhalten beim Aktualisieren anderer Felder wie beispielsweise reply_count nicht beobachtet, sodass es spezifisch für participant_count und möglicherweise andere Felder zu sein scheint.

In meinem Import-Skript habe ich versucht, Folgendes hinzuzufügen:

p[:participant_count] = target_usernames.count

Das hat jedoch nicht funktioniert. Ich vermute, dass wir dieses Feld in den Methoden der Importeure nicht setzen können.

Ich stehe also etwas fest. Ich möchte, dass meine Benutzer alle ihre PMs mit Antworten in ihrem Posteingang haben, nicht nur diejenigen, die sie nicht selbst gestartet haben.

Irgendeine Idee?

Hast du dazu eine Meinung, @kris.kotlarek?

Vielen Dank, dass du diesen Fehler erwähnt hast. Ich habe ihn selbst überprüft und du hast recht – wenn participant_count falsch ist, ist die Nachricht im Posteingang des Autors nicht sichtbar.

Auch hast du recht, dass dieser Parameter selbst dann nicht korrekt gesetzt wird, wenn du ihn explizit zu create_posts hinzufügst.

Das liegt daran, dass TopicCreate eine explizite Liste erlaubter Parameter hat:

Heute werde ich einen PR an Discourse erstellen, um dieses Attribut im Importmodus zu akzeptieren.

Bis dahin, damit du nicht auf die neueste Version von Discourse warten musst, kannst du am Ende deines Skripts Folgendes ausführen:

Topic.private_messages.map(&:update_statistics) – damit sollten alle Zahlen korrigiert werden.

Der PR ist bereit – FIX: topic_creator accepts participant_count in import mode by KrisKotlarek · Pull Request #10632 · discourse/discourse · GitHub

Sobald er gemergt und deployed wurde, können Sie ihn wie folgt verwenden:

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

Dies muss unter [:topic_opts] stehen, da die Methode create_posts den post_creator auswertet, was den topic_creator auslöst.