Skip to content

Commit

Permalink
Added domain log session id to exp user table. Actually tied in exp
Browse files Browse the repository at this point in the history
conversion paragraph.
  • Loading branch information
Doug Youch committed Sep 9, 2010
1 parent 69a95bf commit bc0a734
Show file tree
Hide file tree
Showing 10 changed files with 112 additions and 37 deletions.
40 changes: 29 additions & 11 deletions app/controllers/editor/action_controller.rb
@@ -1,15 +1,21 @@
# Copyright (C) 2009 Pascal Rettig.

class Editor::ActionController < ParagraphController #:nodoc:all
permit 'editor_editor'

# Editor for authorization paragraphs
editor_header "System Paragraphs", :paragraph_action
editor_for :triggered_action, :name => 'Triggered Actions', :triggers => [ ['View Page','view']]

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
Expand Down Expand Up @@ -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
18 changes: 16 additions & 2 deletions app/controllers/editor/action_renderer.rb
Expand Up @@ -25,8 +25,22 @@ def experiment
if editor?
render_paragraph :text => '[Experiment Success]'
else
require_js '/javascripts/experiment.js'
render_paragraph :inline => "<script type=\"text/javascript\">WebivaExperiment.success(#{@options.experiment_id}, #{@options.delayed ? @options.delay_for.to_i : 0});</script>\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 => "<script type=\"text/javascript\">WebivaExperiment.success(#{@options.experiment_id}, #{@options.delay_for.to_i});</script>\n"
elsif @options.type == 'automatic'
@exp_user.success!
end
end

render_paragraph :nothing => true
end
end

Expand Down
4 changes: 2 additions & 2 deletions app/controllers/module_app_controller.rb
Expand Up @@ -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

Expand Down
8 changes: 6 additions & 2 deletions app/controllers/structure_controller.rb
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
33 changes: 18 additions & 15 deletions app/models/experiment.rb
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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
8 changes: 4 additions & 4 deletions app/models/site_node.rb
Expand Up @@ -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
Expand Down
29 changes: 29 additions & 0 deletions app/views/editor/action/experiment.html.erb
@@ -0,0 +1,29 @@
<div class='cms_form'>

<% 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 %>

<tr class="vertical"><td colspan="2" class="label_vertical"> <label for="experiment_manual_js"><%= 'Manual script (readonly)'.t %></label></td></tr>
<tr>
<td colspan="2" class="data_vertical text_area_control" nowrap="1">
<%= text_area_tag :experiment_manual_js, @options.manual_js, :cols => 50, :rows => 2, :readonly => true %>
</td>
</tr>
<% end -%>

<script>
updateExperimentJS = function() {
var experiment_id = $('experiment_experiment_id').value;
if(experiment_id) {
$('experiment_manual_js').value = "onclick=\"WebivaExperiment.finished(" + experiment_id + ");\"";
} else {
$('experiment_manual_js').value = "";
}
};

</script>

</div>

2 changes: 2 additions & 0 deletions app/views/structure/_experiment.html.erb
Expand Up @@ -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 -%>
Expand Down
2 changes: 2 additions & 0 deletions db/migrate/20100907170358_initial_experiment_setup.rb
Expand Up @@ -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|
Expand All @@ -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
Expand Down
5 changes: 4 additions & 1 deletion public/javascripts/experiment.js
Expand Up @@ -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);
}
};

0 comments on commit bc0a734

Please sign in to comment.