أتلقى خطأ 502 أثناء محاولة حذف مواضيع أنشأها مستخدم معين

أثناء محاولة حذف المواضيع التي أنشأها مستخدم معين من لوحة تحكم المسؤول → المستخدمين. تظهر لي رسالة خطأ 502.


هل هناك طريقة أخرى لحذف المواضيع التي أنشأها مستخدم معين؟

مرحباً @Yogesh_g،

هل تحاول حذف جميع المنشورات البالغ عددها 301,719 التي أنشأها هذا المستخدم؟ :grimacing: يبدو أن هذا سيترك لك الكثير من المواضيع التي لا معنى لها بسبب المنشورات المفقودة.

هل سيكون إخفاء هوية المستخدم منطقيًا لك في هذا الموقف؟

أعتقد أنك تحصل على خطأ 502 هذا بسبب إعداد “حذف جميع المنشورات كحد أقصى”.

3 إعجابات

لقد قمت بزيادة الحد إلى ما هو أكبر من الرقم الذي أريد حذفه وهذه المواضيع تحتوي فقط على مشاركات من نفس المستخدم.

هل يمكنك من فضلك شرح كيفية عمل إخفاء هوية المستخدمين، هل سيجعل جميع المشاركات مخفية لجميع المستخدمين الآخرين؟

هل هناك أي طريقة يمكنني من خلالها الوصول إلى قاعدة البيانات التي أستخدمها لاستضافة discourse؟

لا، لا يخفي المشاركات؛ بل يزيل اسم المستخدم. إنه حل جيد في بعض الأحيان عندما يطلب المستخدم حذف حسابه، لأنه يحافظ على المحتوى، ويبقي المواضيع في مجتمعك سليمة، مع جعل هذا المحتوى مجهول الهوية، بحيث لا يعرف أحد من كتبه. تم وصفه بالكامل هنا:

إذا كان لديك موقع مستضاف، فقد يكون من الأفضل ترك فريق Discourse يساعدك.

3 إعجابات

هذا وضع فريد جدًا وكمية هائلة من العمل على [database] - لا عجب أن الطلب ينتهي وقته.

يبدو استثنائيًا جدًا؛ أوصي أيضًا بالاتصال بدعم الاستضافة للحصول على المساعدة بشأن هذا الأمر.

3 إعجابات

حسناً، سأتصل بالدعم. وسأقوم بتحديثكم هنا.

هل هناك طريقة أخرى لحذف جميع المشاركات لمستخدم معين. أو هل يمكنني محاولة إنشاء إضافة مخصصة لذلك تحذف المشاركات من قاعدة البيانات. (يطلب مني عميلي ذلك ولكني لست متأكدًا مما إذا كان سيعمل لعدد كبير من المشاركات نظرًا لأن Discourse لديه هذه الوظيفة بالفعل).

هل يجب علي إنشاء إضافة لذلك أم لا. وإذا كان الأمر كذلك، فكيف ستعمل؟

@ Michael Brown @southpaw لقد قمت بإنشاء إضافة لحذف مشاركات المستخدم على دفعات بعدد معين. لقد كتبت بعض أكواد Ruby لحذف المشاركات. حاليًا، أستخدم واجهة برمجة تطبيقات الإعدادات لأخذ المدخلات من المسؤول.

التحدي الذي أواجهه هو. أريد إنشاء صفحة مسؤول للإضافة تحتوي على بعض حقول الإدخال وزر. أريد أن يتم تشغيل كود Ruby الخاص بي عند النقر على هذا الزر.

لقد جربت بعض الطرق ولكن فشلت.

هل هناك أي طريقة ممكنة لتحقيق ذلك في discourse؟

مرحباً @Yogesh_g،

:open_mouth:

لست (بعد!) خبيرًا في كتابة الإضافات، لذلك ليس لدي إجابة سريعة لك حول الأسئلة التي طرحتها حول تشغيل صفحة المسؤول الخاصة بك، ولكني أود التأكد من حصولك على المساعدة التي تحتاجها.

أواجه بعض الصعوبة في تجميع كل القطع هنا، لذلك أرسلت لك رسالة خاصة للحصول على مزيد من التفاصيل.

تم الاستمرار في How to execute server-side code when clicking a button?

مرحباً، مجتمع المناقشة @pfaffman @merefield

أحتاج إلى حذف جميع المشاركات التي أنشأها مستخدم معين (ما مجموعه 301,719 مشاركة). لقد جربت طرقًا مختلفة، لكنني فشلت في الحذف.

كيف يجب أن أحذف جميع المشاركات لهذا المستخدم؟ يرجى تقديم طريقة. أنا أكافح مع هذا منذ 3 أشهر.

هل تقصد الحذف الدائم أم الحذف المؤقت؟

حذف دائم. لا أريد أن تظهر هذه المشاركات لأي مستخدمين.

هل هذا الموضوع مفيد لك؟

لا أعتقد أنه ما تبحث عنه بالضبط، ولكن قد تتمكن من تعديله لاستهداف ما تحتاجه؟

هذا لا يعمل. لقد جربته سابقًا

إعجاب واحد (1)

كانت لدي مشكلة مماثلة من قبل، احتجت إلى حذف حوالي 200000 مشاركة من مستخدمين مختلفين مع الكثير من الشروط. أي طريقة عادية ستؤدي إلى تأخير طويل الأمد.
أخيرًا، اتخذت الطريقة الأغبى. حلقة من 1 إلى أقصى معرف مشاركة. إذا كانت تلبي الشرط، فاحذفها. استغرقت حوالي ساعة للتكرار خلالها (حوالي 900000 مشاركة).

إعجابَين (2)

لقد جربت طريقة مشابهة، لكن الخادم يعطي خطأ انتهاء المهلة، إليك الكود

# frozen_string_literal: true

module Jobs
  class DeleteUserPosts < ::Jobs::Scheduled
    every 2.minutes

    def execute(args)
      return unless SiteSetting.delete_user_topics_enabled?

      username = SiteSetting.delete_posts_for_username
      posts_per_batch = SiteSetting.delete_posts_in_single_batch.to_i

      return unless username.present? && posts_per_batch.positive?

      user = User.find_by(username: username)
      return unless user.present?

      posts = user.posts.order(created_at: :asc)

      deleted_count = 0
      posts.each do |post|
        break if deleted_count >= posts_per_batch

        if SiteSetting.delete_user_topics_dry_run?
          Rails.logger.error("DeleteUserPosts would remove Post ID #{post.id} (#{post.topic.title} - #{post.excerpt}) (dry run mode)")
        else
          Rails.logger.error("DeleteUserPosts removing Post ID #{post.id} (#{post.topic.title} - #{post.excerpt})")
          begin
            PostDestroyer.new(Discourse.system_user, post).destroy
            deleted_count += 1
          rescue StandardError => e
            Rails.logger.error("Error deleting post ID #{post.id}: #{e.message}")
          end
        end
      end

      # Cancel the scheduled job if there are no more posts remaining
      if posts.size <= posts_per_batch
        self.class.cancel_scheduled_job
      end
    end
  end
end

من الواضح أن هذا يمكن أن يسير بشكل خاطئ. 300000 مشاركة ليست رقمًا صغيرًا، لا يمكنك تحميلها في الذاكرة دفعة واحدة.

إعجاب واحد (1)

هل يمكنك مشاركة مقتطف الكود الذي استخدمته، أو عرض مثال