לא מצליח לבצע השעיה/ביטול הפעלה גורפת של משתמשים במסוף Rails ב-Discourse 3.5.0.beta5-dev

שלום לכולם,

אני מתמודד עם בעיה מתמשכת בניסיון להשעות/לבטל משתמשים רבים בו-זמנית במופע ה-Discourse שלי (גרסה 3.5.0.beta5-dev) דרך קונסולת Rails. אני מנסה לא לכלול את חשבון הניהול שלי (hoangthai, מזהה משתמש 100) ולהשעות לצמיתות את כל שאר המשתמשים הפעילים שאינם מנהלים/מפקחים עם סיבה מותאמת אישית “Chưa gia hạn tài khoản” (חידוש חשבון ממתין).

ניסיתי מספר גישות המבוססות על פקודות קונסולת Discourse נפוצות והצעות לאיתור באגים, אבל החשבונות נשארים active: true למרות שייתכן ש-suspended_at ו-suspended_till מוגדרים.

הנה פירוט של מה שניסיתי והשגיאות/תוצאות:

המטרה שלי: להשעות את כל המשתמשים לצמיתות (מלבד hoangthai, מזהה 100) עם הסיבה “Chưa gia hạn tài khoản” (חידוש חשבון ממתין).

ניסיונות ובעיות:

  1. ניסיון ראשוני (הגדרת suspend_reason, suspended_at, suspended_till ישירות):

    admin_id_to_exclude = 100
    User.where.not(id: admin_id_to_exclude).each do |user|
      if user.active? && !user.admin? && !user.moderator?
        user.suspend_reason = "Tài khoản tạm khóa do nghỉ phép dài hạn." # ניסיון סיבה ראשון
        user.suspended_at = Time.current
        user.suspended_till = Time.current + 100.years
        user.save!
        puts "Khóa tài khoản: #{user.username}"
      end
    end
    
    • תוצאה: NoMethodError: undefined method 'suspend_reason=' for an instance of User (הוצע suspended_at=). זה הצביע על כך ש-suspend_reason אינו המאפיין הנכון.
  2. ניסיון שני (שימוש ב-UserSuspension.suspend_user כפי שהוצע עבור גרסאות חדשות יותר):

    admin_id_to_exclude = 100
    User.where.not(id: admin_id_to_exclude).each do |user|
      if user.active? && !user.admin? && !user.moderator?
        UserSuspension.suspend_user(
            user,
            Time.current + 100.years,
            nil, # suspend_reason_id
            "Tài khoản tạm khóa: Nghỉ phép dài hạn.", # custom_suspend_reason
            Discourse.system_user
        )
        puts "Đã khóa tài khoản: #{user.username}"
      end
    end
    
    • תוצאה: NameError: uninitialized constant UserSuspension (הוצע UserSuspender). זה הצביע על כך ששם המחלקה שגוי.
  3. ניסיון שלישי (שם מחלקה תוקן ל-UserSuspender):

    admin_id_to_exclude = 100
    User.where.not(id: admin_id_to_exclude).each do |user|
      if user.active? && !user.admin? && !user.moderator?
        UserSuspender.suspend_user( # עדיין מנסה suspend_user
            user,
            Time.current + 100.years,
            nil,
            "Tài khoản tạm khóa: Nghỉ phép dài hạn.",
            Discourse.system_user
        )
        puts "Đã khóa tài khoản: #{user.username}"
      end
    end
    
    • תוצאה: NoMethodError: undefined method 'suspend_user' for class UserSuspender (הוצע UserSuspended?). זה הראה שגם שם השיטה שגוי.
  4. ניסיון רביעי (שימוש ב-UserSuspender.new(...).suspend כתבנית אובייקט שירות):

    admin_id_to_exclude = 100
    User.where.not(id: admin_id_to_exclude).each do |user|
      if user.active? && !user.admin? && !user.moderator?
        begin
            UserSuspender.new(
                user,
                Discourse.system_user,
                reason: "Tài khoản tạm khóa: Nghỉ phép dài hạn.",
                suspended_till: nil # להשעיה קבועה
            ).suspend
            puts "Đã khóa tài khoản: #{user.username}"
        rescue => e
            puts "Lỗi khi khóa tài khoản #{user.username}: #{e.message}"
        end
      end
    end
    
    • תוצאה: פקודה זו רצה ללא שגיאות בקונסולה. היא הדפיסה “Đã khóa tài khoản: [username]”.
    • אולם, כשבודקים את סטטוס המשתמש בממשק ניהול או באמצעות שאילתה ישירה של user.active בקונסולה, המשתמשים עדיין הראו active: true. רק suspended_at ו-suspended_till עודכנו (לדוגמה, suspended_at: "2025-05-26 00:37:01.406064419 +0000", suspended_till: nil). החשבונות עדיין יכלו להתחבר.
  5. ניסיון חמישי (הגדרה ישירה של active = false יחד עם שדות ההשעיה):

    admin_id_to_exclude = 100
    User.where.not(id: admin_id_to_exclude).each do |user|
      if user.active? && !user.admin? && !user.moderator?
        begin
            user.suspended_at = Time.current
            user.suspended_till = nil # קבוע
            user.custom_suspension_reason = "Chưa gia hạn tài khoản" # סיבה מותאמת אישית
            user.active = false # חלק מכריע
            user.save!
            puts "Đã **khóa VĨNH VIỄN** và vô hiệu hóa tài khoản: #{user.username}"
        rescue => e
            puts "LỖI khi xử lý tài khoản #{user.username}: #{e.message}"
        end
      end
    end
    
    • תוצאה: גם פקודה זו רצה ללא שגיאות והדפיסה הודעות הצלחה.
    • אולם, התוצאה הייתה זהה: active: true נשאר, ו-suspended_at/suspended_till עודכנו, אבל חשבונות לא עברו דה-אק…
לייק 1

I don’t believe deactivation is part of the user suspension process. In the UI, you would need to press the ‘deactivate’ button separately if you wanted a returning suspended user to also reverify their email.

Deciding if that’s what you want and tackling it as a separate operation may get better results. :crossed_fingers:

There’s some guidance for bulk suspensions in this topic if that helps Administrative Bulk Operations

Though if you try that and find it’s outdated let them know and they should be able to update the guide accordingly.

לייק 1