Benutzer können in der Rails-Konsole auf Discourse 3.5.0.beta5-dev nicht massenweise gesperrt/deaktiviert werden

Hallo zusammen,

ich habe ein anhaltendes Problem beim Versuch, Benutzer auf meiner Discourse-Instanz (Version 3.5.0.beta5-dev) per Massenvorgang über die Rails-Konsole zu sperren/deaktivieren. Ich versuche, meinen Admin-Account (hoangthai, Benutzer-ID 100) auszuschließen und alle anderen aktiven Nicht-Admin-/Nicht-Moderator-Benutzer dauerhaft mit einem benutzerdefinierten Grund „Chưa gia hạn tài khoản“ (Kontoerneuerung ausstehend) zu sperren.

Ich habe verschiedene Ansätze ausprobiert, die auf gängigen Discourse-Konsolenbefehlen und Debugging-Vorschlägen basieren, aber die Konten bleiben active: true, obwohl suspended_at und suspended_till gesetzt werden könnten.

Im Folgenden eine Aufschlüsselung meiner Versuche und der Fehler/Ergebnisse:

Mein Ziel: Alle Benutzer dauerhaft sperren (außer hoangthai, ID 100) mit dem Grund „Chưa gia hạn tài khoản“ (Kontoerneuerung ausstehend).

Versuche Probleme:

  1. Erster Versuch (Direktes Setzen von 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." # Erster Grundversuch
        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
    
    • Ergebnis: NoMethodError: undefined method 'suspend_reason=' for an instance of User (Vorschlag suspended_at=). Dies deutete darauf hin, dass suspend_reason nicht das richtige Attribut war.
  2. Zweiter Versuch (Verwendung von UserSuspension.suspend_user, wie für neuere Versionen vorgeschlagen):

    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
    
    • Ergebnis: NameError: uninitialized constant UserSuspension (Vorschlag UserSuspender). Dies deutete darauf hin, dass der Klassenname falsch war.
  3. Dritter Versuch (Korrigierter Klassenname zu 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( # Versuche immer noch 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
    
    • Ergebnis: NoMethodError: undefined method 'suspend_user' for class UserSuspender (Vorschlag UserSuspended?). Dies zeigte, dass der Methodenname ebenfalls falsch war.
  4. Vierter Versuch (Verwendung von UserSuspender.new(...).suspend als Service-Object-Muster):

    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." (Konto vorübergehend gesperrt: Längerer Urlaub),
                suspended_till: nil # For permanent suspension
            ).suspend
            puts "Đã khóa tài khoản: #{user.username}" (Konto gesperrt: #{user.username})
        rescue => e
            puts "Lỗi khi khóa tài khoản #{user.username}: #{e.message}" (Fehler beim Sperren des Kontos #{user.username}: #{e.message})
        end
      end
    end
    
    • Ergebnis: Dieser Befehl wurde ohne Fehler in der Konsole ausgeführt. Er gab „Đã khóa tài khoản: [username]“ aus (Konto gesperrt: [Benutzername]).
    • Beim Überprüfen des Benutzerstatus in der Admin-UI oder beim direkten Abfragen von user.active in der Konsole zeigten die Benutzer jedoch immer noch active: true an. Nur suspended_at und suspended_till wurden aktualisiert (z. B. suspended_at: "2025-05-26 00:37:01.406064419 +0000", suspended_till: nil). Die Konten konnten sich weiterhin anmelden.
  5. Fünfter Versuch (Direktes Setzen von active = false zusammen mit den Sperrfeldern):

    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 # Permanent
            user.custom_suspension_reason = "Chưa gia hạn tài khoản" (Konto nicht verlängert)
            user.active = false # Crucial part
            user.save!
            puts "Đã **khóa VĨNH VIỄN** và vô hiệu hóa tài khoản: #{user.username}" (Konto **PERMANENT** gesperrt und deaktiviert: #{user.username})
        rescue => e
            puts "LỖI khi xử lý tài khoản #{user.username}: #{e.message}" (FEHLER bei der Verarbeitung des Kontos #{user.username}: #{e.message})
        end
      end
    end
    
    • Ergebnis: Auch dieser Befehl wurde ohne Fehler ausgeführt und gab Erfolgsmeldungen aus.
    • Das Ergebnis war jedoch das gleiche: active: true blieb bestehen, und suspended_at/suspended_till wurden aktualisiert, aber die Konten wurden nicht tatsächlich deak…
1 „Gefällt mir“

Ich glaube nicht, dass die Deaktivierung Teil des Prozesses zur Suspendierung von Benutzern ist. In der Benutzeroberfläche müssten Sie separat auf die Schaltfläche „Deaktivieren“ klicken, wenn Sie möchten, dass ein zurückkehrender suspendierter Benutzer seine E-Mail erneut verifiziert.

Wenn Sie entscheiden, ob dies das ist, was Sie möchten, und es als separaten Vorgang angehen, erzielen Sie möglicherweise bessere Ergebnisse. :crossed_fingers:

Es gibt einige Anleitungen für Massen-Suspendierungen in diesem Thema, falls das hilfreich ist: Administrative Bulk Operations

Wenn Sie dies jedoch versuchen und feststellen, dass es veraltet ist, lassen Sie es sie wissen, und sie sollten in der Lage sein, die Anleitung entsprechend zu aktualisieren.

1 „Gefällt mir“