Software Challenge : Saison Klonen / Testsaison

Um eine existierende Saison zu klonen, sind folgende Schritte nötig:

Damit man die Testsaison nun korrekt verwenden kann, braucht man noch eine passende Saisondefinition. Dazu kopiert man am besten die für die geklonte Saison bestehende Definition im Ordner

RAILS_ROOT/config/seasons/

und benennt die Datei entsprechend der für den Klon gewählten Subdomain. In der Kopie müssen dann noch folgende und evtl. weitere ähnliche Einträge angepasst werden:

SeasonDefinition.create "Testsaison 2012" do # Namen anpassen, dieser Name wird unten der neuen Saison zugewiesen, s.u.

subdomain "test_season_2012" # Subdomain anpassen

import_contestants_from_contest "test_season_2012_nrth" do # Subdomain anpassen

Icon

Die IDs der Contestants haben sich durch das Klonen natuerlich geaendert. Wenn der Wettkampf in der Original-Saison bereits begonnen hatte, d.h. die Teams bereits ueber die Saison-Definition Gruppen zugeordnet worden sind, muessen diese auch in der Definition angepasst werden. Werden die Teams nicht ueber die Saison-Definition zugeordnet (dies ist der neuere Weg), muss nichts getan werden. Man kann ueber die Namen die neuen IDs herausfinden:

cs = Contestant.find [array mit alten ids]
testseason = Season.find id_der_testsaison
testseason.contestants.all.select{|c| cs.map(&:name).include? c.name}.map(&:id)
=> [array mit neuen ids]

Zunächst in der Rails-Konsole (bundle exec ./script/console production) auf dem Produktivsystem die zu klonende Saison finden, z.B.

s = Season.find_by_subdomain("2012")

Dann einen Klon dieser Saison erstellen:

snew = s.create_clone("Testsaison 2012", "test2012", :only_current_clients => true)

Dieser Befehl erstellt einen Klon der Saison mit folgendem Inhalt:

  • Name "Testsaison 2012" (dieser Name stellt nicht etwa schon die Verbindung zur SeasonDefinition her, s.u.)
  • Subdomain "test2012"
  • Die geklonten Teams und deren aktivierte Computerspieler inklusive der Memberships

Weitere Optionen sind

  • :clone_clients => true|false # Sollen die Clients kopiert werden (default true)
  • :clone_memberships => true|false # Sollen die Memberships in den Klon übernommen werden (default true)

Nun existiert eine Kopie der Saison im System. Möglicherweise möchte man diese nun verstecken (da sie i.d.R. nur Testzwecken dient):

snew.public = false
snew.save

Der geklonten Saison muss dann über die Railskonsole noch die neue Seasondefinition zugewiesen werden:

snew.season_definition = "Testsaison 2012"
snew.save

Jetzt sollte der Saisonklon unabhängig von der Originalsaison benutzbar sein (für den Fall, dass snew.public = false gesetzt wurde natürlich nur für Admins).

Icon

Wenn in der Saison nun Wettbewerbe erstellt werden, sind diese sichtbar (contest.public ist true). Das ist für die Oberfläche nicht weiter schlimm, weil man die Saison ja nicht anwählen kann (wenn snew.public auf false gesetzt wurde), aber es werden dadurch eMails an die Teilnehmer geschickt, also unbedingt nach anlegen der Contests diese auch verstecken:

snew.contests.each{|c| c.public = false; c.save!}