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…
1 « J'aime »

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.

1 « J'aime »