From bc0a734f7504f4a28fb4c758a3f266d64e83daef Mon Sep 17 00:00:00 2001 From: Doug Youch Date: Thu, 9 Sep 2010 18:38:07 +0000 Subject: [PATCH] Added domain log session id to exp user table. Actually tied in exp conversion paragraph. --- app/controllers/editor/action_controller.rb | 40 ++++++++++++++----- app/controllers/editor/action_renderer.rb | 18 ++++++++- app/controllers/module_app_controller.rb | 4 +- app/controllers/structure_controller.rb | 8 +++- app/models/experiment.rb | 33 ++++++++------- app/models/site_node.rb | 8 ++-- app/views/editor/action/experiment.html.erb | 29 ++++++++++++++ app/views/structure/_experiment.html.erb | 2 + ...20100907170358_initial_experiment_setup.rb | 2 + public/javascripts/experiment.js | 5 ++- 10 files changed, 112 insertions(+), 37 deletions(-) create mode 100644 app/views/editor/action/experiment.html.erb diff --git a/app/controllers/editor/action_controller.rb b/app/controllers/editor/action_controller.rb index 92213417..bdeb90c6 100644 --- a/app/controllers/editor/action_controller.rb +++ b/app/controllers/editor/action_controller.rb @@ -1,7 +1,6 @@ # Copyright (C) 2009 Pascal Rettig. class Editor::ActionController < ParagraphController #:nodoc:all - permit 'editor_editor' # Editor for authorization paragraphs editor_header "System Paragraphs", :paragraph_action @@ -9,7 +8,14 @@ class Editor::ActionController < ParagraphController #:nodoc:all editor_for :html_headers, :name => 'HTML/JS/CSS Headers' - editor_for :experiment, :name => 'Experiment Success' + editor_for :experiment, :name => 'Experiment Conversion' + + user_actions [:exp] + + def exp + Experiment.success! params[:path][0], session + render :nothing => true + end def triggered_action end @@ -49,21 +55,33 @@ def js_files end class ExperimentOptions < HashModel - attributes :experiment_id => nil, :delayed => false, :delay_for => 10 + attributes :experiment_id => nil, :type => 'automatic', :delay_for => 10 - boolean_options :delayed integer_options :delay_for, :experiment_id validates_presence_of :experiment_id - options_form( - fld(:experiment_id, :select, :options => :experiment_options), - fld(:delayed, :yes_no), - fld(:delay_for, :text_field, :size => 5, :unit => 'seconds') - ) +# options_form( +# fld(:experiment_id, :select, :options => :experiment_options), +# fld(:type, :select, :options => :type_options), +# fld(:delay_for, :text_field, :size => 5, :unit => 'seconds') +# ) + + def manual_js + self.experiment_id ? "onclick=\"WebivaExperiment.finished(#{self.experiment_id});\"" : '' + end + + @@type_options = [['Automatic', 'automatic'], ['Delayed', 'delayed'], ['Manual', 'manual']] + def self.type_options + @@type_options + end + + def experiment_options + [['--Select Experiment--'.t, nil]] + Experiment.find(:all, :conditions => ["ended_at >= ? || ended_at IS NULL || id = ?", Time.now, self.experiment_id]).collect { |e| [e.name, e.id] } + end - def self.experiment_options - Experiment.find(:all, :conditions => ["ended_at >= ? || ended_at IS NULL", Time.now]).collect { |e| [e.name, e.id] } + def experiment + @experiment ||= Experiment.find_by_id(self.experiment_id) end end end diff --git a/app/controllers/editor/action_renderer.rb b/app/controllers/editor/action_renderer.rb index ec75ddf6..4a0e663b 100644 --- a/app/controllers/editor/action_renderer.rb +++ b/app/controllers/editor/action_renderer.rb @@ -25,8 +25,22 @@ def experiment if editor? render_paragraph :text => '[Experiment Success]' else - require_js '/javascripts/experiment.js' - render_paragraph :inline => "\n" + require_js '/javascripts/experiment.js' unless @options.type == 'automatic' + + return render_paragraph :nothing => true unless session[:domain_log_visitor] && session[:cms_language] + return render_paragraph :nothing => true if @options.type == 'manual' + + @exp_user = @options.experiment.get_user session + + if @exp_user && ! @exp_user.success? + if @options.type == 'delayed' + return render_paragraph :inline => "\n" + elsif @options.type == 'automatic' + @exp_user.success! + end + end + + render_paragraph :nothing => true end end diff --git a/app/controllers/module_app_controller.rb b/app/controllers/module_app_controller.rb index 00496c54..2c5ecc72 100644 --- a/app/controllers/module_app_controller.rb +++ b/app/controllers/module_app_controller.rb @@ -123,8 +123,8 @@ def handle_page return render :inline => 'Invalid version' unless @revision.revision_type == 'real' || @revision.revision_type == 'temp' elsif @page.is_running_an_experiment? self.log_visitor - if session[:domain_log_visitor] && session[:domain_log_visitor][:id] - @revision = @page.experiment_page_revision session[:domain_log_visitor], session[:cms_language] + if session[:domain_log_visitor] + @revision = @page.experiment_page_revision session end end diff --git a/app/controllers/structure_controller.rb b/app/controllers/structure_controller.rb index 42cc15e5..7a5a81c6 100644 --- a/app/controllers/structure_controller.rb +++ b/app/controllers/structure_controller.rb @@ -467,8 +467,12 @@ def experiment @experiment.attributes = params[:experiment] if params[:update] && @experiment.save @container.update_attribute :experiment_id, @experiment.id + + p_element_info @container, false + render :update do |page| page << 'RedBox.close();' + page.replace_html 'element_info', :partial => 'page_element_info' end return end @@ -533,13 +537,13 @@ def m_element_info(node) end # Page Element Information - def p_element_info(node) + def p_element_info(node, display=true) @languages = Configuration.languages @revision_info = node.language_revisions(@languages) @active_revision_info = @revision_info.detect { |rev| rev[0] == @view_language } @node = node - render :partial => 'page_element_info' + render :partial => 'page_element_info' if display end # Group Element Information diff --git a/app/models/experiment.rb b/app/models/experiment.rb index 70c0a41b..e178cdfb 100644 --- a/app/models/experiment.rb +++ b/app/models/experiment.rb @@ -5,6 +5,7 @@ class Experiment < DomainModel has_many :experiment_versions, :order => :id, :dependent => :destroy has_many :experiment_users belongs_to :experiment_container, :polymorphic => true + belongs_to :conversion_site_node, :class_name => 'SiteNode' validates_presence_of :name validates_presence_of :experiment_container_type @@ -147,22 +148,22 @@ def after_save end end - def get_user(domain_log_visitor, language) - user = self.experiment_users.find_by_domain_log_visitor_id_and_language(domain_log_visitor[:id], language) - user.update_attribute(:end_user_id, domain_log_visitor[:end_user_id]) if user && user.end_user_id.nil? && domain_log_visitor[:end_user_id] + def get_user(session) + return nil unless session[:domain_log_visitor] && session[:cms_language] + user = self.experiment_users.find_by_domain_log_visitor_id_and_language(session[:domain_log_visitor][:id], session[:cms_language]) + user.update_attribute(:end_user_id, session[:domain_log_visitor][:end_user_id]) if user && user.end_user_id.nil? && session[:domain_log_visitor][:end_user_id] user end - def get_version(domain_log_visitor, language) + def get_version(session) return nil unless self.is_running? + return nil unless session[:domain_log_visitor] && session[:cms_language] - domain_log_visitor = domain_log_visitor.attributes.symbolize_keys if domain_log_visitor.is_a?(DomainModel) - - user = self.get_user(domain_log_visitor, language) + user = self.get_user(session) return user.experiment_version if user @versions = nil - self.language = language + self.language = session[:cms_language] weight_sum = 0 random_weight = rand(self.total_weight) @@ -173,18 +174,20 @@ def get_version(domain_log_visitor, language) return nil unless version - self.experiment_users.create :experiment_version_id => version.id, :domain_log_visitor_id => domain_log_visitor[:id], :language => language, :end_user_id => domain_log_visitor[:end_user_id] + + self.experiment_users.create :experiment_version_id => version.id, :domain_log_visitor_id => session[:domain_log_visitor][:id], :language => self.language, :end_user_id => session[:domain_log_visitor][:end_user_id], :domain_log_session_id => session[:domain_log_session][:id] version end - def success!(domain_log_visitor, language) - user = self.get_user(domain_log_visitor, language) - user.success! if user && self.is_running? + def success!(session) + return unless self.is_running? + user = self.get_user(session) + user.success! if user end - def self.success!(experiment_id, domain_log_visitor, language) - domain_log_visitor = domain_log_visitor.attributes.symbolize_keys if domain_log_visitor.is_a?(DomainModel) + def self.success!(experiment_id, session) + return unless session[:domain_log_visitor] && session[:cms_language] exp = Experiment.find_by_id experiment_id - exp.success!(domain_log_visitor, language) if exp + exp.success!(session) if exp end end diff --git a/app/models/site_node.rb b/app/models/site_node.rb index 51cdf104..b310820d 100644 --- a/app/models/site_node.rb +++ b/app/models/site_node.rb @@ -51,14 +51,14 @@ def is_running_an_experiment? self.experiment_id && self.experiment && self.experiment.is_running? && self.experiment.active? end - def experiment_version(domain_log_visitor, language) + def experiment_version(session) return nil unless self.experiment - self.experiment.get_version(domain_log_visitor, language) + self.experiment.get_version(session) end - def experiment_page_revision(domain_log_visitor, language) + def experiment_page_revision(session) return @experiment_page_revision if @experiment_page_revision - version = self.experiment_version(domain_log_visitor, language) + version = self.experiment_version(session) return nil unless version @experiment_page_revision = self.page_revisions.first :conditions => {:revision => version.revision, :language => version.language, :revision_type => 'real'} end diff --git a/app/views/editor/action/experiment.html.erb b/app/views/editor/action/experiment.html.erb new file mode 100644 index 00000000..c6206332 --- /dev/null +++ b/app/views/editor/action/experiment.html.erb @@ -0,0 +1,29 @@ +
+ +<% paragraph_options_form_for "Experiment Conversion Options", :experiment do |f| -%> + <%= f.select :type, @options.class.type_options, :vertical => true %> + <%= f.select :experiment_id, @options.experiment_options, {}, :vertical => true, :onchange => 'updateExperimentJS();' %> + <%= f.text_field :delay_for, :vertical => true %> + + + + + <%= text_area_tag :experiment_manual_js, @options.manual_js, :cols => 50, :rows => 2, :readonly => true %> + + +<% end -%> + + + +
+ diff --git a/app/views/structure/_experiment.html.erb b/app/views/structure/_experiment.html.erb index 14e701a2..1917490d 100644 --- a/app/views/structure/_experiment.html.erb +++ b/app/views/structure/_experiment.html.erb @@ -26,6 +26,8 @@ submitExperimentForm = function(frm, update) { <% end -%> <% end -%> <% end -%> + <%= f.header 'Optional' %> + <%= f.page_selector :conversion_site_node_id %> <%= f.spacer %> <%= f.cancel_submit_buttons "Cancel", "Submit", { :onclick => 'RedBox.close(); return false;' } %> <% end -%> diff --git a/db/migrate/20100907170358_initial_experiment_setup.rb b/db/migrate/20100907170358_initial_experiment_setup.rb index 2ec85cad..6f4a170c 100644 --- a/db/migrate/20100907170358_initial_experiment_setup.rb +++ b/db/migrate/20100907170358_initial_experiment_setup.rb @@ -7,6 +7,7 @@ def self.up t.datetime :started_at t.datetime :ended_at t.text :note + t.integer :conversion_site_node_id end create_table :experiment_versions do |t| @@ -18,6 +19,7 @@ def self.up create_table :experiment_users do |t| t.integer :domain_log_visitor_id + t.integer :domain_log_session_id t.integer :experiment_version_id t.integer :experiment_id t.string :language diff --git a/public/javascripts/experiment.js b/public/javascripts/experiment.js index 642ca26f..72686c5a 100644 --- a/public/javascripts/experiment.js +++ b/public/javascripts/experiment.js @@ -9,6 +9,9 @@ WebivaExperiment = { }, finished: function(experiment_id) { - alert( 'experiment: ' + experiment_id + ' was completed' ); + if(! experiment_id) { return; } + var script = document.createElement('script'); + script.src = '/website/editor/action/exp/' + experiment_id; + document.documentElement.firstChild.appendChild(script); } };