Wir haben einige hundert Nutzer in unserem Forum, deren Namen (nicht Benutzernamen, Namen) versehentlich auf ihre E-Mail-Adresse gesetzt wurden, weil der externe SSO-Anbieter (über WordPress) bei der Erstellung ihrer Konten so eingerichtet war.
Gibt es eine relativ einfache Möglichkeit, diese Namen massenhaft von der_name@beispiel.de in der_name zu ändern (d. h. alles ab dem ‘@’ abzuschneiden), ohne jedes Profil einzeln manuell zu bearbeiten?
Das kannst du über die Rails-Konsole erledigen. Es ist etwas komplizierter, als es hier erklärt werden kann, insbesondere da E-Mail-Adressen nicht mehr im Benutzerdatensatz gespeichert sind. Wenn du ein Budget hast, kannst du im Kanal Marketplace posten oder mich direkt kontaktieren.
Oder aber, dir ist die eigentliche E-Mail-Adresse egal…
Etwas in der Art:
users = User.where('username like', '%@%')
Anschließend würdest du die Liste durchlaufen und mit gsub alles ab dem @-Zeichen bis zum Ende entfernen. Das ist das Beste, was ich von meinem Handy aus bieten kann.
Ich danke dir für die Antwort, @pfaffman. Ich kann SQL schreiben, aber die Arbeit in einer Rails-Konsole liegt etwas außerhalb meines Kompetenzbereichs. Wie komme ich in die Discourse-Python-Konsole?
Es wäre schön – obwohl ich auch verstehe, dass es potenziell gefährlich sein kann –, wenn es ein Tool wie den Data Explorer gäbe, mit dem man auch UPDATE-Abfragen ausführen könnte.
Weiß jemand, ob es eine Möglichkeit gibt, ein Drittanbieter-SQL-Tool (wie Sequel Pro oder ein Äquivalent) mit der laufenden Datenbank in einer selbst gehosteten Discourse-Docker-Instanz zu verbinden?
Stimmt, aber die Umsetzung in Rails macht es viel schwieriger, deine Datenbank zu beschädigen. Wenn du es mit Rails machst, weißt du zum Beispiel, dass du keine ungültigen Benutzernamen erstellt hast (und wenn bei einer Änderung in der betroffenen Tabelle andere Tabellen aktualisiert werden müssen, erledigt Rails das automatisch – SQL nicht).
cd /var/discourse
./launcher enter app
rails c
Jetzt bist du in Rails.
users = User.where("username like '%@%'")
users.each do |user|
user.name.gsub!(/@(.*)/,"")
puts "Neuer Name: #{user.name}"
# user.save
end
Das sollte das Gewünschte bewirken. Wenn es so aussieht, als ob es funktioniert, kannst du user.save auskommentieren und es versuchen.
Mache zuerst ein Backup, okay? (Oder besser noch: auf einem Staging-Server.)
Ich habe keinen Staging-Server für diese Discourse-Instanz, aber ich kann ein Backup erstellen und den Code morgen früh ausführen, wenn wahrscheinlich wenig (oder gar kein) Verkehr zu erwarten ist. So kann ich sofort wiederherstellen, falls ein Problem auftritt.
Das Abschneiden beim @ lässt personenbezogene Daten (E-Mail-Adresse) für das große böse Internet immer noch weitgehend sichtbar (da die meisten Personen @gmail.com oder einen der wenigen großen Anbieter nutzen). Es wäre wahrscheinlich besser, sie auf denselben Wert wie den Benutzernamen zu setzen.
Danke @lionel-rowe, das ist ein guter Punkt. Die Benutzernamen sind jedoch bereits derselbe Wert (der Benutzername wurde erstellt, indem alles vor dem ‘@’ aus der E-Mail-Adresse des Benutzers übernommen wurde).