Supprimer tous les messages d'un utilisateur dans une catégorie

Hi guys,

Recently I had the need to delete all posts from a user in a specific category. Leaving aside “debates” on deleting content I thought “oh, easy, just use the search and then pick all the results using the checkboxes and delete them”.

However, it seems that doing so allows me to delete The Topics and not so much the messages, even though the search is giving me the messages as results, not necessarily the topics (although they are there as well, yes).

Is there a “safe” way of doing this? At first I thought that I would be something very extreme to the DB (and I don’t discard that possibility) but since I can bulk-delete 50+ topics from the UI… maybe there is a way of doing that for messages only? (Or a way using the console, I just don’t want to “try” and blow up the DB :stuck_out_tongue: )

Thanks!

1 « J'aime »

I don’t have personal experience of these, but I believe you can ‘soft’ delete using the API -

And there are a few topics on ‘hard’ deleting if you search for ‘rails delete post’.

If you can give a few more details about what you’re trying to achieve, people may have more specific tips.

Hi @JammyDodger

Thanks for the links.

I just want to delete all messages from a user in a specific category. :stuck_out_tongue:

PD: Maybe using the Console? I just don’t want to nuke my DB…

1 « J'aime »

There’s some ongoing discussion about a similar thing in this topic: Delete deleted-posts permanently in bulk?

Hopefully that can provide some inspiration?

Désolé pour la necro, je peux créer un nouveau message si nécessaire.

Nous avons une catégorie politique et certains utilisateurs souhaiteraient supprimer tous leurs messages de cette catégorie pour des raisons évidentes. Y a-t-il un moyen facile de le faire pour eux ?

Une solution peut être d’utiliser la console Rais.

cd /var/discourse
./launcher enter app
rails c

Ensuite, vous pouvez suivre le formulaire suivant en renseignant le slug de la catégorie et le nom d’utilisateur.
Vous copiez le code et le collez dans la console.

Remarque :

  • Il ne supprime pas le premier message afin d’éviter la suppression du sujet
  • Si vous ciblez une sous-catégorie, fournissez le parent, par exemple : slug_parent/slug_cat.

:warning: Veuillez effectuer une sauvegarde avant toute modification.

Category
  .find_by_slug_path_with_id("=CATEGORY_SLUG=")
  .tap do |c|
    u = User.find_by_username("=USERNAME=")
    Post
      .joins(:topic)
      .where(user_id: u.id)
      .where("topics.category_id = ?", c.id)
      .where.not(post_number: 1)
      .where(deleted_at: nil)
      .find_each { |p| PostDestroyer.new(Discourse.system_user, p).destroy }
  end
1 « J'aime »

Merci ! C’est fantastic.