La discussione privata importata non appare nella casella di posta dell'autore

Ciao, sto cercando di importare i messaggi privati da un database vBulletin5.

Funziona, ma nel profilo dell’autore la discussione appare solo in “inviati”, non nella “posta in arrivo”.

Nel profilo dell’altro partecipante, la discussione appare correttamente sia nella “posta in arrivo” che in “inviati”.

Profilo dell’autore:
Appare in “inviati”

Ma non in “posta in arrivo”

Profilo dell’altro partecipante:
Appare in entrambi:

Come posso fare in modo che la discussione appaia nella posta in arrivo dell’autore?

Se necessario, ecco il mio codice attualmente disordinato:

  def import_pm
    puts "", "importazione argomenti PM..."

    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?

        # se è il primo messaggio
        if pm['parentid'] == 8 
          #next unless post = topic_lookup_from_imported_post_id("pm-#{pm["pmid"]}")

          target_usernames = []
          target_userids = []
          # ottieni la lista degli utenti
          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 "uno degli ID dei partecipanti è 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 con te stesso?
            # skip = true
            p[:target_usernames] = "system"
            puts "pm-#{pm['nodeid']} non ha destinatari"
          end
        # se non è il primo messaggio
        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

Dall’Esploratore di dati, ho notato che il valore di participant_count è errato:
image

È indicato 1, ma nella conversazione ci sono due persone.
Se aggiorno il campo participant_count dell’argomento a 2 in questo modo:

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

l’argomento ora appare nella casella di posta in arrivo dell’autore:

Non ho notato questo comportamento aggiornando altri campi come reply_count, ad esempio, quindi sembra specifico di participant_count e forse di altri campi.

Nel mio script di importazione, ho provato ad aggiungere questo:

p[:participant_count] = target_usernames.count

Ma non ha funzionato; immagino non sia possibile impostare questo campo nei metodi degli importatori.

Quindi sono un po’ bloccato. Vorrei che i miei utenti avessero nella loro casella di posta in arrivo tutti i loro PM con risposte, non solo quelli che non hanno iniziato loro stessi.

Qualche idea?

Hai qualche pensiero su questo @kris.kotlarek?

Grazie per aver segnalato quel bug. L’ho verificato personalmente e hai ragione: quando participant_count è errato, il messaggio non è visibile nella casella di posta del suo autore.

Hai anche ragione nel dire che, anche se aggiungi esplicitamente quel parametro a create_posts, non viene impostato correttamente.

Questo perché TopicCreate ha un elenco esplicito dei parametri consentiti:

Oggi creerò una PR per Discourse per accettare quell’attributo in modalità importazione.

Nel frattempo, per non dover attendere l’ultima versione di Discourse, puoi eseguire alla fine del tuo script:

Topic.private_messages.map(&:update_statistics) - questo dovrebbe correggere tutti i numeri.

La PR è pronta - FIX: topic_creator accepts participant_count in import mode by KrisKotlarek · Pull Request #10632 · discourse/discourse · GitHub

Una volta unita e distribuita, potrai utilizzarla in questo modo:

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

Deve trovarsi sotto [:topic_opts] perché il metodo create_posts valuta post_creator, il quale attiva topic_creator.