From 37ca27b570b98114bb6c21808e6a32f5beba0aec Mon Sep 17 00:00:00 2001 From: Doug Youch Date: Wed, 8 Sep 2010 23:15:59 +0000 Subject: [PATCH] Can stop, start, restart experiments. Display experiment results on the revision info page. --- app/controllers/structure_controller.rb | 41 +++++++++++++++-- app/models/experiment_version.rb | 27 +++++++++++- app/views/structure/_experiment.html.erb | 9 +++- app/views/structure/_experiment_info.html.erb | 44 +++++++++++++++++++ app/views/structure/_revision_info.rhtml | 21 ++++++--- app/views/structure/_structure_editor.rhtml | 9 +++- 6 files changed, 137 insertions(+), 14 deletions(-) create mode 100644 app/views/structure/_experiment_info.html.erb diff --git a/app/controllers/structure_controller.rb b/app/controllers/structure_controller.rb index 2811e519..460acfb7 100644 --- a/app/controllers/structure_controller.rb +++ b/app/controllers/structure_controller.rb @@ -448,15 +448,26 @@ def edit_page_revision end def experiment + view_language + @container = SiteNode.find params[:path][0] - @language = params[:path][1] || 'en' - @experiment = @container.experiment || Experiment.new(:experiment_container => @container) - @experiment.language = @language + @new = params[:new] + if @new + @experiment = Experiment.new(:experiment_container => @container) + else + @experiment = @container.experiment || Experiment.new(:experiment_container => @container) + end + + @experiment.language = @view_language @min_revisions = @experiment.started? ? @experiment.versions.size : 2 @experiment.num_versions = @experiment.id ? @experiment.versions.size : @min_revisions + @experiment.num_versions = @min_revisions if @experiment.num_versions < @min_revisions + + @revisions = @container.page_revisions.find(:all, :conditions => {:revision_type => 'real', :language => @view_language}, :select => 'revision, version_name, active', :order => :revision).collect { |r| ["#{r.active ? '*' : ''} #{r.revision} #{r.version_name}".strip, r.revision] } - @revisions = @container.page_revisions.find(:all, :conditions => {:revision_type => 'real', :language => @language}, :select => 'revision, version_name, active', :order => :revision).collect { |r| ["#{r.active ? '*' : ''} #{r.revision} #{r.version_name}".strip, r.revision] } + @max_revisions = @revisions.size + @max_revisions = @min_revisions if @max_revisions < @min_revisions if request.post? && params[:experiment] @experiment.num_versions = (params[:num_versions] || @min_revisions).to_i @@ -475,6 +486,28 @@ def experiment render :partial => 'experiment' end + def update_experiment + view_language + + @experiment = Experiment.find params[:path][0] + @experiment.language = @view_language + + if params[:start] + @experiment.start! params[:start_time] + elsif params[:restart] + @experiment.restart! params[:end_time], :start_time => params[:start_time], :reset => params[:reset] + elsif params[:stop] + @experiment.end_experiment! params[:end_time] + else params[:select] && params[:version_id] + version_id = params[:version_id].to_i + @experiment.end_experiment! unless @experiment.finished? + @version = @experiment.versions.find { |v| v.id == version_id } + PageRevision.activate_page_revision(@experiment.experiment_container, @version.page_revision.id) if @version && @version.page_revision + end + + p_element_info @experiment.experiment_container + end + protected def view_language diff --git a/app/models/experiment_version.rb b/app/models/experiment_version.rb index a888ba3c..3997024a 100644 --- a/app/models/experiment_version.rb +++ b/app/models/experiment_version.rb @@ -2,11 +2,36 @@ class ExperimentVersion < DomainModel belongs_to :experiment has_many :experiment_users, :dependent => :destroy - has_many :successful_users, :conditions => 'success=1' + has_many :successful_users, :conditions => 'success=1', :class_name => 'ExperimentUser' validates_presence_of :language validates_presence_of :revision validates_presence_of :weight validates_presence_of :experiment_id + + def title + return @title if @title + return @title = self.revision.to_s unless self.page_revision + @title = "#{self.page_revision.active? ? '*' : ''} #{self.revision} #{self.page_revision.version_name}" + end + + def num_visits + self.experiment_users.count + end + + def num_conversions + self.successful_users.count + end + + def success_percent + return 0 unless self.num_visits > 0 + (self.num_conversions.to_f / self.num_visits.to_f * 100.0).to_i + end + + def page_revision + return @page_revision if @page_revision + return nil unless self.experiment && self.experiment.experiment_container + @page_revision = self.experiment.experiment_container.page_revisions.first :conditions => {:revision => self.revision, :language => self.language, :revision_type => 'real'} + end end diff --git a/app/views/structure/_experiment.html.erb b/app/views/structure/_experiment.html.erb index 3e4dae85..3d896d02 100644 --- a/app/views/structure/_experiment.html.erb +++ b/app/views/structure/_experiment.html.erb @@ -4,6 +4,7 @@