Skript-Framework zum Umordnen von Themen und Kategorien

Um ein großes Discourse neu zu ordnen, habe ich in Zusammenarbeit mit meiner Site-Leitung ein einfaches Framework geschrieben, um eine Reihe von Ruby-Skripten zu verpacken, die über eine YAML-Konfigurationsdatei gesteuert werden. Auf diese Weise kann ich ein Backup auf einer Staging-Site wiederherstellen, mein Skript ausführen, Feedback erhalten, ein paar Zeilen YAML ändern, das Backup wiederherstellen, das Skript mit neuer Konfiguration ausführen und wiederholen, bis ich zufrieden bin.

Ich habe fast 600 Zeilen Konfiguration für meine Website und das würde manuell über die Benutzeroberfläche nicht passieren. Nicht einmal einmal, geschweige denn viele Male, um es richtig zu machen. Das weiß ich, denn als ich das letzte Mal weitreichende Änderungen vorschlug, gab ich buchstäblich auf. Im Gegensatz dazu kann ich mit diesem Skript nun den gesamten Zyklus in nur wenigen Minuten pro Iteration abschließen, obwohl die Website etwa eine halbe Million Beiträge und über 100 Kategorien hat. Dies gibt mir schnelles Feedback von meiner Site-Leitung und ich werde bereit sein, meine Website schnell zu migrieren.

Eine detailliertere Dokumentation finden Sie in der README-Datei im Repository mit dem Code:

:warning: Dieses Skript führt keine Fehlerprüfung durch. Es ist ziemlich verrückt, es auf Ihrer Live-Site auszuführen. Es ist dazu gedacht, auf einer Staging-Site ausgeführt zu werden, das Ergebnis zu validieren und dann live genommen zu werden. Als Autor beabsichtige ich immer noch, es auf diese Weise auszuführen. Wenn Sie es direkt auf einer Live-Site ausführen, müssen Sie alle Teile behalten, wenn es kaputt geht. :warning:

Aus der Dokumentation könnte eine Konfigurationsdatei wie folgt aussehen:

---
- describe:
    context: Alter Name
    category: 7
    name: Neuer Name
    description: Neue Beschreibung der Kategorie
    slug: neuer-slug
- movePosts:
    context: Verschiebe nur FAQ-Beiträge aus der Support-Kategorie in die Dokumentationskategorie
    source: 3 # Support-Kategorie-ID
    target: 6 # Dokumentationskategorie-ID
    withTag: faq
    hide: false # Verstecke die Support-Kategorie nicht, wenn sie fertig ist
- movePosts:
    context: Konsolidiere die How-To-Kategorie in die Dokumentation mit dem Tag "how-to"
    source: 8 # How-To-Kategorie-ID
    target: 6 # Dokumentationskategorie-ID
    addTag: how-to
    hide: true # Verstecke die alte How-To-Kategorie, nur für Administratoren sichtbar

Die Fortschrittsausgabe während der Ausführung könnte dann wie folgt aussehen.

==========
Versteckte Kategorien ausblenden, damit sie die Admin-Ansicht nicht überladen
setHiddenCategory: {:category=>11}
==========
Old Name in New Name umbenennen
describe: {:category=>7, :name=>"New Name", :description=>"New description of category", :slug=>"new-slug"}
==========
nur FAQ-Beiträge aus der Support-Kategorie in die Dokumentationskategorie verschieben
movePosts: {:source=>3, :withTag=>"faq", :target=>6}
==========

Um dies zu verwenden, legen Sie Ihre YAML-Datei in /var/discourse/shared/app/tmp/rearrange.yaml ab und dann:

cd /var/discourse
./launcher enter app
git clone https://github.com/johnsonm/discourse-site-rearranger.git script/discourse-site-rearranger
ruby script/discourse-site-rearranger/rearrange.rb /shared/tmp/rearrange.yaml

Allerdings ist es durchaus wahrscheinlich, dass dieses Skript nicht ganz alles tut, was Sie brauchen. Es ist wirklich ein Framework, das es sehr einfach macht, neue Aktionen einzufügen, die weitere Aspekte einer geskripteten Site-Änderung mit nur wenigen Codezeilen automatisieren. Alles, was Sie tun müssen, ist eine Methode mit ein paar Codezeilen zu definieren, und Sie können sie ordnungsgemäß aus der YAML-Datei aufrufen.

Haben Sie darüber nachgedacht, die Organisation Ihrer Website zu verbessern, aber davor zurückgeschreckt, die Benutzeroberfläche zu verwenden, oder sich gefragt, wie Sie sicher sein können, dass Sie Ihre Tests auf einer Staging-Site replizieren können, um Änderungen live zu schalten? Schauen Sie es sich an und sagen Sie mir, was Sie denken!

5 „Gefällt mir“

Ich verwende dieses Skript, um eine Testseite zu erstellen, als Klon meiner Hauptseite. Hohe visuelle Treue ist Teil des Ziels, könnte es aber leicht machen, versehentlich auf der falschen Seite zu posten, während Änderungen überprüft werden, und diese versehentlichen Posts beim nächsten Aktualisieren der Testseite zu löschen.

Ich habe meine Testseite zuerst schreibgeschaltet, als ich um öffentliches Feedback bat. Aber die Anmeldung ist deaktiviert, während die Seite im schreibgeschützten Modus ist, sodass sie sich nicht anmelden konnten, als ich sie darum bat.

Ich habe eine neue Aktion publicCategoriesReadonly hinzugefügt, die anonym sichtbare Kategorien nur für :admins schreibbar und für :everyone schreibgeschützt macht, um es den Leuten zu ermöglichen, sich anzumelden und herumzustöbern, aber versehentliches Posten auf der falschen Seite zu vermeiden. Jetzt ist die gesamte Seite nicht mehr schreibgeschaltet, aber die öffentlichen Kategorien sind es.

Es ist möglich, Kategorien als Hashtags anhand von Slugs zu referenzieren. Dieses Skript ermöglicht das gemeinsame Verschieben von Inhalten von Kategorien und das Ändern von Slugs, wodurch frühere Beiträge nach einem erneuten Backen nicht mehr verlinkt werden. (Vor einem erneuten Backen würden Permalink-Weiterleitungen die Links funktionsfähig machen.)

Ich habe das Skript nun aktualisiert, um Tags vor und nach der Migration zu verfolgen und Referenzen auf geänderte Kategorien in Beiträgen neu zuzuordnen.

Ich habe eine migrateRetortToReactions-Aktion zum Framework hinzugefügt, für diejenigen unter uns, die Retort installiert hatten und zu einem unterstützten Plugin wechseln möchten.

2 „Gefällt mir“

Wow! Das sind tolle Neuigkeiten. Es wäre großartig, wenn jemand eine Rake-Aufgabe daraus machen und sie für das Reactions-Plugin einreichen könnte.

Ich werde es mir bald ansehen.

1 „Gefällt mir“

Es scheint mir eine gute Idee zu sein, dies als Rake-Aufgabe im Plugin zu haben.

Ich habe die CDCK CLA unterschrieben, sodass keine Urheberrechtsansprüche meinerseits am Ergebnis im Wege stehen und es unter die gleiche Lizenz wie das Plugin selbst gestellt werden kann.

Außerdem könnte ich mir vorstellen, dass ich etwas falsch gemacht habe; wenn Sie etwas daran auszusetzen haben, würde ich es gerne wissen, da ich plane, dieses Skript in den nächsten Wochen auf meiner eigenen Website auszuführen. :smiley:

Im größeren Maßstab, wenn Sie dieses Framework für Ihre eigene Arbeit zur Unterstützung von Discourse-Installationen nützlich finden, aber mehr Fehlerbehandlung wünschen, würde ich PRs annehmen. Ich möchte lediglich sicherstellen, dass jeder PR von jemandem stammt, der die CLA unterschrieben hat und zustimmt, dass nützliche Teile davon in das offizielle Discourse integriert werden können, was bei Ihnen der Fall ist…

2 „Gefällt mir“

Ich habe im Retort-Thema entdeckt, dass @angus einen Branch mit UI-gesteuerter Konvertierung hat, den ich völlig übersehen hatte.

Mein Skript taucht in Interna ein, die sich irgendwann ändern könnten, und sobald ich meine Konvertierungen mit diesem Skript durchgeführt habe, werde ich nicht bemerken, wenn sich diese Interna ändern. Ich habe zuerst versucht, es “auf die richtige Art und Weise” zu machen, aber festgestellt, dass das Reactions-Plugin keine Schnittstelle bereitstellt, die dies ermöglicht. @angus nimmt die längere Sichtweise ein:

@pfaffman, wenn du eine Rake-Aufgabe erstellst, möchtest du sie vielleicht in einen PR aufnehmen, der auch die Änderungen an den Schnittstellen vornimmt, sodass beispielsweise created_by sowie silent übergeben werden können, anstatt die “Hintertür” zu verwenden, die ich benutzt habe. Zu diesem Zeitpunkt wäre die Rake-Aufgabe für Befehlszeilenmigrationen vorhanden und würde gleichzeitig @angus die Durchführung einer UI-gesteuerten Migration ermöglichen.