Supprimer définitivement les publications supprimées en masse ?

Désolé si c’est une question idiote…
Pourquoi, avec Discourse, n’est-il pas possible de supprimer facilement des messages de la base de données ?

Discourse utilise un mécanisme appelé « suppression douce » qui permet de corriger facilement les erreurs. Il permet également de distinguer entre les messages « supprimés pour les autres utilisateurs » et ceux « supprimés pour les administrateurs ».

Cela préserve également l’intégrité de la base de données. Que se passe-t-il si un message supprimé avait été cité (avant sa suppression) ? Dans ce cas, le message qui cite fait référence à un message qui n’existe plus. Cela pourrait entraîner toutes sortes d’erreurs.

Merci, maintenant je comprends… le seul problème, c’est s’il y a beaucoup de messages supprimés.

Cela a déjà été discuté et demandé à plusieurs reprises, par exemple :

Bien que je comprenne que la suppression douce puisse être utile, il serait souhaitable qu’après un certain délai (par exemple une semaine ou un mois), les éléments supprimés soient réellement effacés afin de libérer de l’espace et de garantir la conformité légale, par exemple lorsqu’un contenu illégal a été publié ou que des données personnelles doivent être supprimées pour respecter le RGPD.

Être obligé de se connecter et d’exécuter une tâche Rake pour remplacer le message par « ceci a été supprimé » est un peu peu élégant.

Oups… désolé, venant de phpBB, je pensais que c’était possible.

C’est maintenant implémenté

Cordialement,

Mais comment faisons-nous cela ???

J’ai joué avec ce matin, mais je n’arrive pas à comprendre. :slightly_smiling_face: Des pistes ?

Eh bien, le paramètre doit être configuré dans Admin > Paramètres > Sécurité (actuellement masqué pour une raison quelconque), puis chaque administrateur doit se voir accorder ce droit comme un modérateur.

Une fois accordé, il apparaîtra dans le menu d’administration des publications.

Ah, cela pourrait être mon point de blocage. Je cherchais can_permanently_delete dans les paramètres d’administration et je ne l’ai pas vu.

Le paramètre du site est masqué car nous ne recommandons pas son utilisation. Il a été conçu pour les cas où des informations sensibles ont été publiées et doivent être complètement effacées de la base de données. De plus, cette opération n’est pas de toute façon une opération par lots.

Étant donné qu’il s’agit d’un paramètre de site masqué, la seule façon de l’activer est via la console.

C’est presque exactement ce dont j’ai besoin ! Merci.

Comment puis-je écrire la syntaxe pour qu’elle ne concerne que tous les messages supprimés avant la date du xxxx ?

Ce serait Post.with_deleted.where("deleted_at < 'YYYY-mm-dd'").update_all(...)

Pouvez-vous nous indiquer comment l’activer depuis la console ?

Voici les instructions :

Fonctionnalité activée depuis la console, mais comment puis-je supprimer les messages supprimés ? Tous les messages sont présents dans la section des messages supprimés.

Je ne suis vraiment pas expert en la matière, mais il semble qu’il y ait suffisamment d’extraits d’informations dans ce sujet pour créer le code que vous recherchez.

Le sujet que j’ai lié au début contient les mises en garde des créateurs indiquant qu’il s’agit d’un territoire inexploré et que vous le faites à vos propres risques. Cependant, ils fournissent également l’élément « destroy_all » qui semble utile et suggèrent de commencer par des lots.

Ce sujet contient également quelques exemples montrant comment cibler soit des publications, soit des sujets, ce qui (combiné aux exemples donnés par @RGJ sur la façon de cibler des publications spécifiques) devrait vous rapprocher de l’objectif.

Je n’ai cependant aucune expérience en la matière, je crains donc de ne pas pouvoir vous donner le feu vert, n’ayant jamais fait cela moi-même. :man_shrugging:

Pour supprimer les anciens posts de notre forum, j’ai utilisé cette méthode. Elle résulte de la combinaison de The proper way to completely delete hundred of topics via rails? et des suggestions de @RGJ.

J’ai finalement opté pour cette approche car je souhaitais vraiment supprimer les données de la base de données afin de protéger la vie privée des utilisateurs. Remplacer le texte par « Ce post a été supprimé » laisse l’historique des modifications intact et relativement facile d’accès, ce qui n’est pas suffisant.

Comme nous avions 20 000 sujets à détruire, cela a pris un certain temps !

Topic.with_deleted.where("deleted_at < '2021-08-28'").limit(1000).destroy_all

Cela ayant laissé de nombreux posts orphelins, j’ai dû le compléter par :

Post.where('topic_id not in (select id from topics)').limit(1000).destroy_all

J’imagine que votre ./launcher cleanup a également libéré de l’espace par la suite :slight_smile:

Malheureusement, bien que s’étant exécuté comme prévu, la table posts est toujours remplie de publications orphelines. La table topics a été correctement vidée. Les publications ne sont pas accessibles lorsque j’essaie de les visiter via /t/topic_id, mais cela est probablement dû à l’absence d’un identifiant de sujet valide. Je ne comprends pas vraiment pourquoi elles sont encore présentes dans la table.

Quelqu’un peut-il suggérer une meilleure méthode pour nettoyer la table posts ?