المناقشة الخاصة المستوردة لا تظهر في صندوق وارد المؤلف

مرحبًا، أحاول استيراد الرسائل الخاصة من قاعدة بيانات 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 "واحد من معرّفات المشاركين هو 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']} ليس لها مستلم مستهدف"
          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، لكن هناك شخصان في المحادثة.
إذا قمت بتحديث حقل participant_count للموضوع إلى 2 كما يلي:

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

سيظهر الموضوع الآن في صندوق الوارد للمؤلف:

لم ألاحظ هذا السلوك عند تحديث حقول أخرى مثل reply_count على سبيل المثال، لذا يبدو أنه خاص بـ participant_count وربما حقول أخرى.

في سكريبت الاستيراد الخاص بي، حاولت إضافة التالي:

p[:participant_count] = target_usernames.count

لكنه لم ينجح، أظن أننا لا نستطيع تعيين هذا الحقل في دوال المستوردين.

لذا أنا عالق قليلاً هنا. أود أن يكون لدى مستخدمِي جميع الرسائل الخاصة (PMs) مع الردود في صندوق الوارد، وليس فقط تلك التي لم يبدأوها هم بأنفسهم.

هل لديك أي فكرة؟

أي أفكار حول هذا الأمر @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