Beim Versuch, Themen zu löschen, die von einem bestimmten Benutzer im Admin-Panel erstellt wurden, wird mir der Fehler 502 angezeigt.
Gibt es eine andere Möglichkeit, von einem bestimmten Benutzer erstellte Themen zu löschen?
Beim Versuch, Themen zu löschen, die von einem bestimmten Benutzer im Admin-Panel erstellt wurden, wird mir der Fehler 502 angezeigt.
Gibt es eine andere Möglichkeit, von einem bestimmten Benutzer erstellte Themen zu löschen?
Hallo @Yogesh_g,
Sie versuchen, alle 301.719 Beiträge dieses Benutzers zu löschen?
Das scheint dazu zu führen, dass viele Themen keinen Sinn mehr ergeben, da die Beiträge fehlen.
Wäre es in dieser Situation sinnvoll, den Benutzer zu anonymisieren?
Ich glaube, Sie erhalten diesen 502-Fehler wegen der Einstellung „Alle Beiträge maximal löschen“.
Ich habe das Limit auf größer als die zu löschende Zahl erhöht und diese Themen enthalten nur Beiträge desselben Benutzers.
Können Sie bitte erklären, wie die Anonymisierung von Benutzern funktioniert? Würden alle Beiträge für alle anderen Benutzer ausgeblendet werden?
Gibt es eine Möglichkeit, auf die Datenbank zuzugreifen, die ich für Discourse-Hosting verwende?
Nein, es werden keine Beiträge ausgeblendet, sondern der Benutzername entfernt. Dies ist manchmal eine gute Lösung, wenn ein Benutzer darum bittet, sein Konto zu löschen, da der Inhalt erhalten bleibt, die Themen in Ihrer Community intakt bleiben und dieser Inhalt anonymisiert wird, sodass niemand weiß, wer ihn geschrieben hat. Er wird hier vollständig beschrieben:
Wenn Sie eine gehostete Website haben, ist es am besten, das Discourse-Team um Unterstützung zu bitten.
Dies ist eine ziemlich einzigartige Situation und eine massive Menge an [database]-Arbeit – kein Wunder, dass die Anfrage mit einem Timeout abbricht.
Das klingt sehr außergewöhnlich; ich würde auch empfehlen, sich für Unterstützung an den Hosting-Support zu wenden.
Ok, ich werde den Support kontaktieren. Und werde euch hier auf dem Laufenden halten.
Gibt es eine andere Möglichkeit, alle Beiträge eines Benutzers zu löschen? Oder kann ich versuchen, ein benutzerdefiniertes Plugin dafür zu erstellen, das Beiträge aus der Datenbank löscht? (Mein Kunde fragt danach, aber ich bin mir nicht sicher, ob es bei einer großen Anzahl von Beiträgen funktionieren wird, da Discourse diese Funktionalität bereits bietet).
Soll ich ein Plugin dafür erstellen oder nicht? Und wenn ja, wie wird es funktionieren?
@ Michael Brown @southpaw Ich habe ein Plugin erstellt, um Beiträge eines Benutzers in Stapeln einer bestimmten Anzahl zu löschen. Ich habe etwas Ruby-Code zum Löschen von Beiträgen geschrieben. Derzeit verwende ich die Settings-API, um Eingaben vom Administrator zu erhalten.
Die Herausforderung, vor der ich stehe, ist, dass ich eine Admin-Seite für das Plugin erstellen möchte, die einige Eingabefelder und eine Schaltfläche enthält. Ich möchte, dass mein Ruby-Code beim Klicken auf diese Schaltfläche ausgeführt wird.
Ich habe einige Wege versucht, aber bin gescheitert.
Gibt es eine Möglichkeit, dies in Discourse zu erreichen?
Hallo @Yogesh_g,
![]()
Ich bin (noch!) kein erfahrener Plugin-Entwickler, daher habe ich keine schnelle Antwort auf deine Fragen zur Funktionsweise deiner Admin-Seite, aber ich möchte sicherstellen, dass du die Hilfe bekommst, die du brauchst.
Ich habe einige Schwierigkeiten, alle Teile hier zusammenzufügen, daher habe ich dir eine PN geschickt, um ein paar weitere Details zu erfahren.
Fortgesetzt in How to execute server-side code when clicking a button?
Hallo, Discourse-Community @pfaffman @merefield
Ich muss alle Beiträge eines bestimmten Benutzers löschen (insgesamt 301.719 Beiträge). Ich habe verschiedene Wege versucht, aber das Löschen ist fehlgeschlagen.
Wie kann ich alle Beiträge dieses Benutzers löschen? Bitte geben Sie mir einen Weg. Ich kämpfe seit 3 Monaten damit.
Meinen Sie endgültiges Löschen oder Soft Delete?
dauerhaft löschen. Ich möchte nicht, dass diese Beiträge für irgendeinen Benutzer angezeigt werden.
Ist dieses Thema für Sie von Nutzen?
Ich glaube nicht, dass es genau das ist, was Sie suchen, aber vielleicht können Sie es anpassen, um das zu erreichen, was Sie brauchen?
Das funktioniert nicht. Ich habe es bereits versucht.
Ich hatte zuvor ein ähnliches Problem. Ich musste etwa 200.000 Beiträge von verschiedenen Benutzern unter vielen Bedingungen löschen. Jede gewöhnliche Methode würde zu langfristigen Verzögerungen führen.
Schließlich habe ich den dümmsten Weg gewählt. Schleife von 1 bis zur maximalen Beitrags-ID. Wenn sie die Bedingung erfüllt, lösche sie. Es dauerte etwa eine Stunde, um sie alle zu durchlaufen (etwa 900.000 Beiträge).
Ich habe eine ähnliche Methode ausprobiert, der Server gibt einen Timeout-Fehler aus, hier ist der Code
# frozen_string_literal: true
module Jobs
class DeleteUserPosts < ::Jobs::Scheduled
every 2.minutes
def execute(args)
return unless SiteSetting.delete_user_topics_enabled?
username = SiteSetting.delete_posts_for_username
posts_per_batch = SiteSetting.delete_posts_in_single_batch.to_i
return unless username.present? && posts_per_batch.positive?
user = User.find_by(username: username)
return unless user.present?
posts = user.posts.order(created_at: :asc)
deleted_count = 0
posts.each do |post|
break if deleted_count >= posts_per_batch
if SiteSetting.delete_user_topics_dry_run?
Rails.logger.error("DeleteUserPosts würde Post ID #{post.id} (#{post.topic.title} - #{post.excerpt}) entfernen (Dry-Run-Modus)")
else
Rails.logger.error("DeleteUserPosts entfernt Post ID #{post.id} (#{post.topic.title} - #{post.excerpt})")
begin
PostDestroyer.new(Discourse.system_user, post).destroy
deleted_count += 1
rescue StandardError => e
Rails.logger.error("Fehler beim Löschen von Post ID #{post.id}: #{e.message}")
end
end
end
# Den geplanten Job abbrechen, wenn keine Posts mehr übrig sind
if posts.size <= posts_per_batch
self.class.cancel_scheduled_job
end
end
end
end
Das kann offensichtlich schiefgehen. 300.000 Beiträge sind keine kleine Zahl, man kann sie nicht auf einmal in den Speicher laden.
Können Sie bitte den Code-Schnipsel teilen, den Sie verwendet haben, oder ein Beispiel zeigen?