Impossible de suspendre/désactiver des utilisateurs en masse dans la console Rails sur Discourse 3.5.0.beta5-dev

Bonjour à tous,

Je rencontre un problème persistant en essayant de suspendre/désactiver en masse des utilisateurs sur mon instance Discourse (version 3.5.0.beta5-dev) via la console Rails. J’essaie d’exclure mon compte administrateur (hoangthai, ID utilisateur 100) et de suspendre définitivement tous les autres utilisateurs actifs non-administrateurs/non-modérateurs avec une raison personnalisée « Chưa gia hạn tài khoản » (Renouvellement de compte en attente).

J’ai essayé plusieurs approches basées sur les commandes courantes de la console Discourse et des suggestions de débogage, mais les comptes restent active: true même si suspended_at et suspended_till peuvent être définis.

Voici une ventilation de ce que j’ai tenté et les erreurs/résultats :

Mon objectif : Suspendre tous les utilisateurs définitivement (sauf hoangthai, ID 100) avec la raison « Chưa gia hạn tài khoản » (Renouvellement de compte en attente).

Tentatives & Problèmes :

  1. Première tentative (Définition directe de 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." # Première tentative de raison
        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
    
    • Résultat : NoMethodError: undefined method 'suspend_reason=' for an instance of User (suggéré suspended_at=). Cela indiquait que suspend_reason n’était pas l’attribut correct.
  2. Deuxième tentative (Utilisation de UserSuspension.suspend_user comme suggéré pour les versions plus récentes) :

    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
    
    • Résultat : NameError: uninitialized constant UserSuspension (suggéré UserSuspender). Cela indiquait que le nom de la classe était incorrect.
  3. Troisième tentative (Nom de classe corrigé en 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( # J'essaie toujours 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
    
    • Résultat : NoMethodError: undefined method 'suspend_user' for class UserSuspender (suggéré UserSuspended?). Cela a montré que le nom de la méthode était également incorrect.4. Quatrième tentative (Utilisation de UserSuspender.new(...).suspend comme modèle d’objet de service) :
    admin_id_to_exclude = 100
    User.where.not(id: admin_id_to_exclude).each do |user|
      if user.active? 						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
    
    • Résultat : Cette commande s’est exécutée sans erreur dans la console. Elle a affiché « Đã khóa tài khoản: [username] ».
    • Cependant, lors de la vérification de l’état de l’utilisateur dans l’interface d’administration ou de l’interrogation directe de user.active dans la console, les utilisateurs affichaient toujours active : true. Seuls suspended_at et suspended_till ont été mis à jour (par exemple, suspended_at : "2025-05-26 00:37:01.406064419 +0000", suspended_till : nil). Les comptes pouvaient toujours se connecter.
  4. Cinquième tentative (Définition directe de active = false avec les champs de suspension) :

    admin_id_to_exclude = 100
    User.where.not(id: admin_id_to_exclude).each do |user|
      if user.active? 						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
    
    • Résultat : Cette commande s’est également exécutée sans erreur et a affiché des messages de succès.
    • Cependant, le résultat a été le même : active : true est resté, et suspended_at/suspended_till ont été mis à jour, mais les comptes n’ont pas été réellement désac…

Je ne pense pas que la désactivation fasse partie du processus de suspension des utilisateurs. Dans l’interface utilisateur, vous devrez appuyer séparément sur le bouton « désactiver » si vous souhaitez qu’un utilisateur suspendu qui revient réauthentifie également son e-mail.

Décider si c’est ce que vous voulez et aborder cela comme une opération distincte pourrait donner de meilleurs résultats. :crossed_fingers:

Il y a quelques directives pour les suspensions en masse dans ce sujet si cela peut aider Administrative Bulk Operations

Cependant, si vous essayez cela et que vous constatez qu’il est obsolète, informez-les et ils devraient être en mesure de mettre à jour le guide en conséquence.