mountain-goat 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. data/.gitignore +2 -0
  2. data/README.md +5 -4
  3. data/generators/mg/mg_generator.rb +2 -2
  4. data/generators/mg/templates/update_mountain_goat_tables_v2.rb +73 -0
  5. data/lib/mountain-goat/controllers/mg/choices_controller.rb +81 -0
  6. data/lib/mountain-goat/controllers/mg/goals_controller.rb +136 -0
  7. data/lib/mountain-goat/controllers/mg/records_controller.rb +46 -0
  8. data/lib/mountain-goat/controllers/mg/tests_controller.rb +139 -0
  9. data/lib/mountain-goat/mg_core.rb +403 -0
  10. data/lib/mountain-goat/models/mg/choice.rb +50 -0
  11. data/lib/mountain-goat/models/mg/gi_meta.rb +10 -0
  12. data/lib/mountain-goat/models/mg/goal.rb +183 -0
  13. data/lib/mountain-goat/models/mg/goal_meta_type.rb +20 -0
  14. data/lib/mountain-goat/models/mg/gs_meta.rb +10 -0
  15. data/lib/mountain-goat/models/mg/record.rb +59 -0
  16. data/lib/mountain-goat/models/mg/test.rb +31 -0
  17. data/lib/mountain-goat/public/g-funnel.js +168 -0
  18. data/lib/mountain-goat/switch_choice.rb +32 -0
  19. data/lib/mountain-goat/version.rb +1 -1
  20. data/lib/mountain-goat/views/mountain_goat/layouts/.tmp_mountain_goat.html.erb.50680~ +76 -0
  21. data/lib/mountain-goat/views/mountain_goat/mg/choices/_choice_form.html.erb +37 -0
  22. data/lib/mountain-goat/views/mountain_goat/mg/choices/edit.html.erb +13 -0
  23. data/lib/mountain-goat/views/mountain_goat/mg/choices/index.html.erb +34 -0
  24. data/lib/mountain-goat/views/mountain_goat/mg/choices/new.html.erb +15 -0
  25. data/lib/mountain-goat/views/mountain_goat/mg/choices/show.html.erb +30 -0
  26. data/lib/mountain-goat/views/mountain_goat/mg/goals/.tmp__goal_form.html.erb.5027~ +0 -0
  27. data/lib/mountain-goat/views/mountain_goat/mg/goals/.tmp__goal_meta_type_form.html.erb.39992~ +0 -0
  28. data/lib/mountain-goat/views/mountain_goat/mg/goals/.tmp_edit.html.erb.55874~ +0 -0
  29. data/lib/mountain-goat/views/mountain_goat/mg/goals/.tmp_index.html.erb.97274~ +36 -0
  30. data/lib/mountain-goat/views/mountain_goat/mg/goals/_goal_form.html.erb +28 -0
  31. data/lib/mountain-goat/views/mountain_goat/mg/goals/_goal_meta_type_form.html.erb +34 -0
  32. data/lib/mountain-goat/views/mountain_goat/mg/goals/edit.html.erb +12 -0
  33. data/lib/mountain-goat/views/mountain_goat/mg/goals/index.html.erb +37 -0
  34. data/lib/mountain-goat/views/mountain_goat/mg/goals/new.html.erb +12 -0
  35. data/lib/mountain-goat/views/mountain_goat/mg/goals/show.html.erb +32 -0
  36. data/lib/mountain-goat/views/mountain_goat/mg/records/_record.html.erb +16 -0
  37. data/lib/mountain-goat/views/mountain_goat/mg/records/_records.html.erb +5 -0
  38. data/lib/mountain-goat/views/mountain_goat/mg/records/_records_form.html.erb +21 -0
  39. data/lib/mountain-goat/views/mountain_goat/mg/records/edit.html.erb +13 -0
  40. data/lib/mountain-goat/views/mountain_goat/mg/records/index.html.erb +17 -0
  41. data/lib/mountain-goat/views/mountain_goat/mg/records/new.html.erb +13 -0
  42. data/lib/mountain-goat/views/mountain_goat/mg/records/show.html.erb +14 -0
  43. data/lib/mountain-goat/views/mountain_goat/mg/report_items/.tmp__chart.html.erb.13419~ +18 -0
  44. data/lib/mountain-goat/views/mountain_goat/mg/report_items/.tmp__funnel.html.erb.60493~ +18 -0
  45. data/lib/mountain-goat/views/mountain_goat/mg/report_items/.tmp__report_item_form.html.erb.87420~ +10 -0
  46. data/lib/mountain-goat/views/mountain_goat/mg/report_items/.tmp__report_item_pivot_form.html.erb.77056~ +14 -0
  47. data/lib/mountain-goat/views/mountain_goat/mg/report_items/.tmp_edit.html.erb.31048~ +19 -0
  48. data/lib/mountain-goat/views/mountain_goat/mg/report_items/.tmp_new.html.erb.36371~ +17 -0
  49. data/lib/mountain-goat/views/mountain_goat/mg/report_items/_funnel.html.erb +13 -0
  50. data/lib/mountain-goat/views/mountain_goat/mg/reports/.tmp__report_form.html.erb.76535~ +21 -0
  51. data/lib/mountain-goat/views/mountain_goat/mg/reports/.tmp__report_report_items.html.erb.26030~ +5 -0
  52. data/lib/mountain-goat/views/mountain_goat/mg/reports/.tmp_edit.html.erb.78064~ +36 -0
  53. data/lib/mountain-goat/views/mountain_goat/mg/reports/.tmp_index.html.erb.74591~ +23 -0
  54. data/lib/mountain-goat/views/mountain_goat/mg/reports/.tmp_show.html.erb.58427~ +21 -0
  55. data/lib/mountain-goat/views/mountain_goat/mg/tests/_test_form.html.erb +25 -0
  56. data/lib/mountain-goat/views/mountain_goat/mg/tests/edit.html.erb +12 -0
  57. data/lib/mountain-goat/views/mountain_goat/mg/tests/index.html.erb +48 -0
  58. data/lib/mountain-goat/views/mountain_goat/mg/tests/new.html.erb +12 -0
  59. data/lib/mountain-goat/views/mountain_goat/mg/tests/show.html.erb +63 -0
  60. metadata +69 -6
  61. data/lib/mountain-goat/metric_tracking.rb +0 -401
  62. data/lib/mountain-goat/switch_variant.rb +0 -32
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ .svn
2
+ .DS_Store
data/README.md CHANGED
@@ -40,13 +40,13 @@ For more information, read my blog post on how mountain goat quickly accomplishe
40
40
 
41
41
  ## Upgrade from < 1.0.0
42
42
 
43
- If you are upgrading from Mountain Goat < 1.0.1, please run the following command (please overwrite mountain-goat.yml when prompted):
43
+ If you are upgrading from Mountain Goat < 1.0.2, please run the following command (please overwrite mountain-goat.yml when prompted):
44
44
 
45
- ./script/generate mg --update=1.0.0,1.0.1
45
+ ./script/generate mg --update=1.0.0,1.0.2
46
46
 
47
47
  rake db:migrate
48
48
 
49
- This will install new migrations necessary for version 1.0.1. Leave out the 1.0.0 from the command if you are upgrading from version 1.0.0.
49
+ This will install new migrations necessary for version 1.0.2. Leave out the 1.0.0 from the command if you are upgrading from version 1.0.0.
50
50
 
51
51
  ## Install
52
52
 
@@ -267,7 +267,8 @@ As mountain goat is a suite that is added into your project dynamically, the fol
267
267
  * mg_reports
268
268
 
269
269
  ## Change log
270
- 1.0.1 - Renamed objects to reflect real-world thinking (e.g. metric => test)
270
+ 1.0.2 - Big UI overhaul ~ Robert
271
+ - Renamed objects to reflect real-world thinking (e.g. metric => test)
271
272
  - Fixed glitch in bandit choice selection
272
273
  1.0.0 - Changed from a/b testing to multi-armed bandit
273
274
  - Added Mountain Goat Reporting
@@ -2,7 +2,7 @@ class MgGenerator < Rails::Generator::Base
2
2
  def add_options!(opt)
3
3
  opt.on('-p', '--password=password', String, "Your password to access Mountain Goat") { |v| options[:password] = v}
4
4
  opt.on('-w', '--wkhtmltopdf=/path/to/dir', String, "Path to installation of wkhtmltopdf (optional)") { |v| options[:wkhtmltopdf] = v}
5
- opt.on('-u', '--update=1.0.0,1.0.1', String, "If you have previously installed Mountain Goat, use to generate *update* tables.") { |v| options[:update] = v}
5
+ opt.on('-u', '--update=1.0.0,1.0.2', String, "If you have previously installed Mountain Goat, use to generate *update* tables.") { |v| options[:update] = v}
6
6
  puts <<-HELPFUL_INSTRUCTIONS
7
7
 
8
8
  Mountain Goat is your home for in-house bandit testing.
@@ -42,7 +42,7 @@ class MgGenerator < Rails::Generator::Base
42
42
  m.migration_template 'update_mountain_goat_tables.rb', 'db/migrate', { :migration_file_name => "update_mountain_goat_tables" }
43
43
  end
44
44
 
45
- if update.include?("1.0.1")
45
+ if update.include?("1.0.2") || update.include?("1.0.1")
46
46
  m.migration_template 'update_mountain_goat_tables_v2.rb', 'db/migrate', { :migration_file_name => "update_mountain_goat_tables_v2" }
47
47
  end
48
48
 
@@ -0,0 +1,73 @@
1
+ class UpdateMountainGoatTablesV2 < ActiveRecord::Migration
2
+
3
+ def self.up
4
+ rename_table :mg_ci_metas, :mg_gi_metas
5
+ rename_table :mg_cs_metas, :mg_gs_metas
6
+ rename_table :mg_convert_meta_types, :mg_goal_meta_types
7
+ rename_table :mg_converts, :mg_goals
8
+ rename_table :mg_metric_variants, :mg_choices
9
+ rename_table :mg_metrics, :mg_tests
10
+ rename_table :mg_rallies, :mg_records
11
+
12
+ rename_column :mg_gi_metas, :rally_id, :mg_record_id
13
+ rename_column :mg_gi_metas, :convert_meta_type_id, :mg_goal_meta_type_id
14
+ rename_column :mg_goal_meta_types, :convert_id, :mg_goal_id
15
+ add_column :mg_goal_meta_types, :is_hidden, :boolean, :default => false
16
+ rename_column :mg_goals, :convert_type, :goal_type
17
+ remove_column :mg_goals, :reward
18
+ add_column :mg_goals, :is_hidden, :boolean, :default => false
19
+ rename_column :mg_gs_metas, :rally_id, :mg_record_id
20
+ rename_column :mg_gs_metas, :convert_meta_type_id, :mg_goal_meta_type_id
21
+ rename_column :mg_choices, :metric_id, :mg_test_id
22
+ rename_column :mg_choices, :conversions, :reward_count
23
+ rename_column :mg_tests, :metric_type, :test_type
24
+ add_column :mg_tests, :is_hidden, :boolean, :default => false
25
+ rename_column :mg_records, :convert_id, :mg_goal_id
26
+ rename_column :mg_report_items, :report_id, :mg_report_id
27
+
28
+ add_column :mg_goals, :rewards_given, :integer, :default => 0
29
+ add_column :mg_goals, :rewards_total, :float
30
+ add_column :mg_records, :reward, :float
31
+
32
+ add_column :mg_reports, :report_type, :string, :default => 'graph'
33
+ add_column :mg_reports, :report_opts, :text
34
+ add_column :mg_reports, :meta, :string
35
+ add_column :mg_reports, :meta2, :string
36
+ end
37
+
38
+ def self.down
39
+ rename_table :mg_gi_metas, :mg_ci_metas
40
+ rename_table :mg_gs_metas, :mg_cs_metas
41
+ rename_table :mg_goal_meta_types, :mg_convert_meta_types
42
+ rename_table :mg_goals, :mg_converts
43
+ rename_table :mg_choices, :mg_metric_variants
44
+ rename_table :mg_tests, :mg_metrics
45
+ rename_table :mg_records, :mg_rallies
46
+
47
+ rename_column :mg_gi_metas, :mg_record_id, :rally_id
48
+ rename_column :mg_gi_metas, :mg_goal_meta_type_id, :convert_meta_type_id
49
+ rename_column :mg_goal_meta_types, :mg_goal_id, :convert_id
50
+ remove_column :mg_goal_meta_types, :is_hidden
51
+ rename_column :mg_goals, :goal_type, :convert_type
52
+ add_column :mg_goals, :reward, :float
53
+ remove_column :mg_goals, :is_hidden
54
+ rename_column :mg_gs_metas, :mg_record_id, :rally_id
55
+ rename_column :mg_gs_metas, :mg_goal_meta_type_id, :convert_meta_type_id
56
+ rename_column :mg_choices, :mg_test_id, :metric_id
57
+ rename_column :mg_choices, :reward_count, :conversions
58
+ rename_column :mg_tests, :test_type, :metric_type
59
+ remove_column :mg_tests, :is_hidden
60
+ rename_column :mg_records, :mg_goal_id, :convert_id
61
+ rename_column :mg_report_items, :mg_report_id, :report_id
62
+
63
+ remove_column :mg_goals, :rewards_given
64
+ remove_column :mg_goals, :rewards_total
65
+ remove_column :mg_records, :reward
66
+
67
+ remove_column :mg_reports, :report_type
68
+ remove_column :mg_reports, :report_opts
69
+ remove_column :mg_reports, :meta
70
+ remove_column :mg_reports, :meta2
71
+ end
72
+
73
+ end
@@ -0,0 +1,81 @@
1
+
2
+ class Mg::ChoicesController < Mg
3
+
4
+ # GET /mg/choices
5
+ # GET /mg/choices.xml
6
+ def index
7
+ @choices = Mg::Choice.all
8
+
9
+ respond_to do |format|
10
+ format.html # index.html.erb
11
+ format.xml { render :xml => @choices }
12
+ end
13
+ end
14
+
15
+ # GET /mg/choices/1
16
+ # GET /mg/coihces/1.xml
17
+ def show
18
+ @choice = Mg::Choice.find(params[:id])
19
+
20
+ respond_to do |format|
21
+ format.html # show.html.erb
22
+ format.xml { render :xml => @choice }
23
+ end
24
+ end
25
+
26
+ # GET /mg/tests/:test_id/choices/new
27
+ # GET /mg/tests/:test_id/choices/new.xml
28
+ def new
29
+ @test = Mg::Test.find( params[:test_id] )
30
+ @choice = Mg::Choice.new( :mg_test_id => @test.id )
31
+
32
+ respond_to do |format|
33
+ format.html # new.html.erb
34
+ format.xml { render :xml => @choice }
35
+ end
36
+ end
37
+
38
+ # GET /mg/choices/1/edit
39
+ def edit
40
+ @choice = Mg::Choice.find(params[:id])
41
+ end
42
+
43
+ # POST /mg/tests/:test_id/choices
44
+ # POST /mg/tests/:test_id/choices.xml
45
+ def create
46
+ @test = Mg::Test.find( params[:choice][:mg_test_id] )
47
+ @choice = Mg::Choice.new(params[:choice])
48
+
49
+ if @choice.save
50
+ flash[:notice] = 'Choice was successfully created.'
51
+ redirect_to mg_test_url :id => @choice.mg_test.id
52
+ else
53
+ render :action => "new"
54
+ end
55
+ end
56
+
57
+ # PUT /mg/choices/1
58
+ # PUT /mg/choices/1.xml
59
+ def update
60
+ @choice = Mg::Choice.find(params[:id])
61
+
62
+ if @choice.update_attributes(params[:choice])
63
+ flash[:notice] = 'Choice was successfully updated.'
64
+ redirect_to mg_test_url :id => @choice.mg_test.id
65
+ else
66
+ render :action => "edit"
67
+ end
68
+ end
69
+
70
+ # DELETE /mg/choices/1
71
+ # DELETE /mg/choices/1.xml
72
+ def destroy
73
+ @choice = Mg::Choice.find(params[:id])
74
+ @choice.destroy
75
+
76
+ respond_to do |format|
77
+ format.html { redirect_to mg_choices_url }
78
+ format.xml { head :ok }
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,136 @@
1
+
2
+ class Mg::GoalsController < Mg
3
+
4
+ # GET /mg/goal
5
+ # GET /mg/goals.xml
6
+ def index
7
+ @goals = Mg::Goal.all(:conditions => { :is_hidden => false } )
8
+ @hidden_goals = Mg::Goal.all(:conditions => { :is_hidden => true } )
9
+
10
+ respond_to do |format|
11
+ format.html # index.html.erb
12
+ format.xml { render :xml => @goals }
13
+ end
14
+ end
15
+
16
+ # GET /mg/goals/1
17
+ # GET /mg/goals/1.xml
18
+ def show
19
+ @goal = Mg::Goal.find(params[:id])
20
+
21
+ @results_per_day = []
22
+ created_at = @goal.created_at
23
+ running_date = Time.utc( created_at.year, created_at.month, created_at.day )
24
+
25
+ while running_date < Time.zone.now
26
+ @results_per_day.push({ :date => running_date.to_i * 1000, :val => @goal.mg_records.find( :all, :conditions => { :created_at => running_date..(running_date + 60 * 60 * 24) } ).count })
27
+ running_date += 60 * 60 * 24
28
+ end
29
+
30
+ @results_by_gmt = {}
31
+ @results_by_gmt_titles = {}
32
+
33
+ @goal.mg_goal_meta_types.each do |gmt|
34
+ @results_by_gmt[gmt.id] = []
35
+ @results_by_gmt_titles[gmt.id] = {}
36
+ i = 0
37
+ gmt.meta.all(:select => "data, count(*) as count", :group => "data").each do |meta|
38
+ next if meta.data.nil?
39
+ if gmt.meta_type == 'cs_meta' || gmt.meta_type == 'gs_meta'
40
+ @results_by_gmt[gmt.id].push( { :name => i, :val => meta.count } )
41
+ @results_by_gmt_titles[gmt.id].merge!({ i => meta.data })
42
+ else
43
+ @results_by_gmt[gmt.id].push( { :name => meta.data, :val => meta.count } )
44
+ end
45
+
46
+ i += 1
47
+ end
48
+ end
49
+
50
+ respond_to do |format|
51
+ format.html # show.html.erb
52
+ format.xml { render :xml => @goal }
53
+ end
54
+ end
55
+
56
+ # GET /mg/goals/new
57
+ # GET /mg/goals/new.xml
58
+ def new
59
+ @goal = Mg::Goal.new
60
+
61
+ respond_to do |format|
62
+ format.html # new.html.erb
63
+ format.xml { render :xml => @goal }
64
+ end
65
+ end
66
+
67
+ # GET /mg/goals/1/edit
68
+ def edit
69
+ @goal = Mg::Goal.find(params[:id])
70
+ end
71
+
72
+ # POST /mg/goals
73
+ # POST /mg/goals.xml
74
+ def create
75
+ @goal = Mg::Goal.new(params[:goal])
76
+
77
+ if @goal.save
78
+ flash[:notice] = 'Goal was successfully created.'
79
+ redirect_to mg_goal_url :id => @goal.id
80
+ else
81
+ render :action => "new"
82
+ end
83
+ end
84
+
85
+ # PUT /goals/1
86
+ # PUT /goals/1.xml
87
+ def update
88
+ @goal = Mg::Goal.find(params[:id])
89
+
90
+ if @goal.update_attributes(params[:goal])
91
+ flash[:notice] = 'Goal was successfully updated.'
92
+ redirect_to mg_goal_url :id => @goal.id
93
+ else
94
+ render :action => "edit"
95
+ end
96
+ end
97
+
98
+
99
+ # GET /mg/goals/1/hide
100
+ # GET /mg/goals/1/hide.xml
101
+ def hide
102
+ @goal = Mg::Goal.find(params[:id])
103
+ @goal.update_attribute(:is_hidden, true)
104
+ flash[:notice] = "Goal #{@goal.name} has been hidden."
105
+
106
+ respond_to do |format|
107
+ format.html { redirect_to mg_goals_url }
108
+ format.xml { head :ok }
109
+ end
110
+ end
111
+
112
+ # GET /mg/goals/1/unhide
113
+ # GET /mg/goals/1/unhide.xml
114
+ def unhide
115
+ @goal = Mg::Goal.find(params[:id])
116
+ @goal.update_attribute(:is_hidden, false)
117
+ flash[:notice] = "Goal #{@goal.name} has been restored."
118
+
119
+ respond_to do |format|
120
+ format.html { redirect_to mg_goals_url }
121
+ format.xml { head :ok }
122
+ end
123
+ end
124
+
125
+ # DELETE /mg/goals/1
126
+ # DELETE /mg/goals/1.xml
127
+ def destroy
128
+ @goal = Mg::Goal.find(params[:id])
129
+ @goal.destroy
130
+
131
+ respond_to do |format|
132
+ format.html { redirect_to mg_goals_url }
133
+ format.xml { head :ok }
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,46 @@
1
+
2
+ class Mg::RecordsController < Mg
3
+
4
+ # GET /mg/records
5
+ # GET /mg/goals/:goal_id/records
6
+ def index
7
+ @page = !params[:page].nil? ? params[:page].to_i : 1
8
+ @goal = Mg::Goal.find(params[:goal_id]) if !params[:goal_id].nil?
9
+
10
+ if @goal
11
+ @records = @goal.mg_records.find(:all, :conditions => { }, :order => "created_at DESC", :limit => 100, :offset => ( @page - 1 ) * 100 )
12
+ else
13
+ @records = Mg::Record.find(:all, :conditions => { }, :order => "created_at DESC", :limit => 100, :offset => ( @page - 1 ) * 100 )
14
+ end
15
+
16
+ respond_to do |format|
17
+ format.html { }
18
+ end
19
+ end
20
+
21
+ def new_records
22
+ recent_record = params[:recent_record].to_i
23
+ goal = Mg::Goal.find(params[:goal_id].to_i) unless params[:goal_id].blank?
24
+
25
+ if goal
26
+ @records = goal.mg_records.find(:all, :conditions => [ 'id > ?', recent_record ], :order => "id DESC" )
27
+ else
28
+ @records = Mg::Record.find(:all, :conditions => [ 'id > ?', recent_record ], :order => "id DESC" )
29
+ end
30
+
31
+ if @records.count > 0
32
+ render :json => { :success => true,
33
+ :result => render_to_string(:partial => 'mg/records/records', :locals => { :records => @records } ),
34
+ :recent_record_id => @records.first.id }
35
+ else
36
+ render :json => { :success => false }
37
+ end
38
+
39
+ end
40
+
41
+ # GET /mg/records/:id
42
+ def show
43
+ @record = Mg::Record.find(params[:id])
44
+ end
45
+
46
+ end
@@ -0,0 +1,139 @@
1
+
2
+ class Mg::TestsController < Mg
3
+
4
+ # GET /mg/tests
5
+ # GET /mg/tests.xml
6
+ def index
7
+ @tests = Mg::Test.all(:conditions => { :is_hidden => false } )
8
+ @hidden_tests = Mg::Test.all(:conditions => { :is_hidden => true } )
9
+
10
+ respond_to do |format|
11
+ format.html # index.html.erb
12
+ format.xml { render :xml => @tests }
13
+ end
14
+ end
15
+
16
+ # TODO: Whhhhha?
17
+ # GET /mg/tests/1
18
+ # GET /mg/tests/1.xml
19
+ def show
20
+ @test = Mg::Test.find(params[:id])
21
+
22
+ @rates = {}
23
+ @rates[:served] = []
24
+ @rates[:reward_count] = []
25
+ @rates[:reward_rates] = []
26
+ @rates[:titles] = {}
27
+ i = 0
28
+ @test.mg_choices.each do |mv|
29
+ @rates[:served].push( { :choice_type => i, :value => mv.served } )
30
+ @rates[:reward_count].push( { :choice_type => i, :value => mv.reward_count } )
31
+ @rates[:reward_rates].push( { :choice_type => i, :value => mv.reward_rate } )
32
+ @rates[:titles].merge!({i => mv.name})
33
+ i += 1
34
+ end
35
+
36
+ logger.warn @rates[:titles].inspect
37
+
38
+ respond_to do |format|
39
+ format.html # show.html.erb
40
+ format.xml { render :xml => @test }
41
+ end
42
+ end
43
+
44
+ # GET /mg/tests/new
45
+ # GET /mg/tests/new.xml
46
+ def new
47
+ @test = Mg::Test.new
48
+
49
+ respond_to do |format|
50
+ format.html # new.html.erb
51
+ format.xml { render :xml => @test }
52
+ end
53
+ end
54
+
55
+ # GET /mg/tests/1/edit
56
+ def edit
57
+ @test = Mg::Test.find(params[:id])
58
+ end
59
+
60
+ # POST /mg/tests
61
+ # POST /mg/tests.xml
62
+ def create
63
+ @test = Mg::Test.new(params[:test])
64
+
65
+ if @test.save
66
+ flash[:notice] = 'Test was successfully created.'
67
+ redirect_to mg_test_url :id => @test.id
68
+ else
69
+ render :action => "new"
70
+ end
71
+ end
72
+
73
+ # PUT /mg/tests/1
74
+ # PUT /mg/tests/1.xml
75
+ def update
76
+ @test = Mg::Test.find(params[:id])
77
+
78
+ if @test.update_attributes(params[:test])
79
+ flash[:notice] = 'Test was successfully updated.'
80
+ redirect_to mg_test_url :id => @test.id
81
+ else
82
+ render :action => "edit"
83
+ end
84
+ end
85
+
86
+ # GET /mg/tests/1/hide
87
+ # GET /mg/tests/1/hide.xml
88
+ def hide
89
+ @test = Mg::Test.find(params[:id])
90
+ @test.update_attribute(:is_hidden, true)
91
+ flash[:notice] = "Test #{@test.title} has been hidden."
92
+
93
+ respond_to do |format|
94
+ format.html { redirect_to mg_tests_url }
95
+ format.xml { head :ok }
96
+ end
97
+ end
98
+
99
+ # GET /mg/tests/1/unhide
100
+ # GET /mg/tests/1/unhide.xml
101
+ def unhide
102
+ @test = Mg::Test.find(params[:id])
103
+ @test.update_attribute(:is_hidden, false)
104
+ flash[:notice] = "Test #{@test.title} has been restored."
105
+
106
+ respond_to do |format|
107
+ format.html { redirect_to mg_tests_url }
108
+ format.xml { head :ok }
109
+ end
110
+ end
111
+
112
+ # DELETE /mg/tests/1
113
+ # DELETE /mg/tests/1.xml
114
+ def destroy
115
+ @test = Mg::Test.find(params[:id])
116
+ @test.destroy
117
+
118
+ respond_to do |format|
119
+ format.html { redirect_to(mg_tests_url) }
120
+ format.xml { head :ok }
121
+ end
122
+ end
123
+
124
+ #TODO: This only works if we are using cookie storage? Clear session as well
125
+ def fresh_choices
126
+ #clear choices
127
+ #logger.warn "Headerish #{response.headers['cookie']}"
128
+
129
+ cookies.each do |cookie|
130
+ if cookie[0] =~ /test_([a-z0-9_]+)/
131
+ logger.warn "Deleting cookie #{cookie[0]}"
132
+ cookies.delete cookie[0]
133
+ end
134
+ end
135
+
136
+ flash[:notice] = "Your tests have been cleared from cookies."
137
+ redirect_to :back
138
+ end
139
+ end