mountain-goat 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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