Skip to content

Commit

Permalink
Merge branch 'master' into widget-cookie-errors
Browse files Browse the repository at this point in the history
  • Loading branch information
lukebaker committed Aug 12, 2013
2 parents 5a91030 + f912dc4 commit 4c5d7a2
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 86 deletions.
165 changes: 82 additions & 83 deletions app/controllers/abingo_dashboard_controller.rb
@@ -1,5 +1,7 @@
class AbingoDashboardController < ApplicationController class AbingoDashboardController < ApplicationController
before_filter :admin_only before_filter :admin_only

caches_action :show_set, :layout => false


def index def index
if params[:all] if params[:all]
Expand All @@ -11,87 +13,56 @@ def index


## group results from all wiki surveys ## group results from all wiki surveys
def show_groups def show_groups
@experiments = Abingo::Experiment.all @grouped_experiments = group_experiments(Abingo::Experiment.all)

@grouped_experiments = Hash.new()

@experiments.each do |e|
if e.test_name =~ /^.*test_icecream.*$/
next
end
if e.test_name =~ /^.*_\d{1,5}_(.*)/
potential_group = $1
# group tests together by having "test_name|#{earl.name}"
elsif e.test_name =~ /^(.*?)\|/
potential_group = $1
elsif e.test_name =~ /^bg_color_aa_/
potential_group = 'bg_color_aa'
else
potential_group = "unknown"
end
@grouped_experiments[potential_group] = [] unless @grouped_experiments.has_key?(potential_group)
@grouped_experiments[potential_group] << e
end

end end


def show_set def show_set
ids = params[:ids].class == String ? params[:ids].split(/, */).uniq : params[:ids] @grouped_experiments = group_experiments(Abingo::Experiment.all)
ids = @grouped_experiments[params[:id]]

@experiments = Abingo::Experiment.find(ids, :include => :alternatives) @experiments = Abingo::Experiment.find(ids, :include => :alternatives)
session_list = [] admin_users = User.find(:all, :select => 'id', :conditions => {:admin => true})
admin_users = User.find(:all, :conditions => {:admin => true}) admin_user_list = admin_users.map{|u| u.id}
admin_user_list = admin_users.inject([]){|list, u| list << u.id} session_list = get_session_list(@experiments, admin_user_list)
@experiments.each do |experiment| session_ids = session_list.map{|s| s['session_id'] }
session_list += get_session_list(experiment, admin_user_list)
end

session_list.uniq!


theresponse = Session.post(:objects_by_session_ids, {}, {:session_ids => session_list}.to_json) theresponse = Session.post(:objects_by_session_ids, {}, {:session_ids => session_ids}.to_json)
@objects_by_session_ids = JSON.parse(theresponse.body) @objects_by_session_ids = JSON.parse(theresponse.body)
@voter_distribution = initialize_distribution_hash(@experiments.first)
@uploader_distribution= initialize_distribution_hash(@experiments.first) distributions = get_distributions(session_list, @objects_by_session_ids, @experiments.first.alternatives)

@voter_distribution = distributions[0]
@experiments.each do |experiment| @uploader_distribution = distributions[1]
add_totals_to_distribution(experiment, @voter_distribution, @objects_by_session_ids, "votes", admin_user_list)
add_totals_to_distribution(experiment, @uploader_distribution, @objects_by_session_ids, "ideas", admin_user_list)
end


@summary_stats = calculate_summary_stats(@experiments.first, @voter_distribution, @uploader_distribution) @summary_stats = calculate_summary_stats(@experiments.first, @voter_distribution, @uploader_distribution)
@vote_distribution_chart = create_voter_distribution_chart(@experiments.first, @voter_distribution) @vote_distribution_chart = create_voter_distribution_chart(@experiments.first, @voter_distribution)
@experiment = @experiments.first @experiment = @experiments.first
# change title to make it a bit prettier on display # change title to make it a bit prettier on display
@experiment.test_name = "#{ids.size} experiments aggregated together" @experiment.test_name = "#{ids.size} experiments aggregated together"
render :action => :show render :action => :show
if ActionController::Base.perform_caching
cache_key = 'views' + url_for(:controller => :abingo_dashboard, :action => 'show_set', :id => params[:id]).gsub(/^h.+:\//, '')
ActionController::Base.cache_store.delay(:run_at => Time.now.utc + 1.day).delete(cache_key)
end
end end


def show def show
@experiment = Abingo::Experiment.find(params[:id], :include => :alternatives) @experiment = Abingo::Experiment.find(params[:id], :include => :alternatives)


admin_users = User.find(:all, :conditions => {:admin => true}) admin_users = User.find(:all, :select => 'id', :conditions => {:admin => true})
admin_user_list = admin_users.inject([]){|list, u| list << u.id} admin_user_list = admin_users.map{|u| u.id}
# Make a list of sessions we are interested in to get info from the pairwise server
#this is to check for irregularities that I believe will be solved by redis
session_list = get_session_list(@experiment, admin_user_list) session_list = get_session_list(@experiment, admin_user_list)
origsize = session_list.size session_ids = session_list.map{|s| s['session_id'] }

session_list.uniq!

if origsize != session_list.size
flash[:notice] = "Warning: Experiment #{@experiment.id} has duplicate session ids"
end


# Get the list from the server # Get the list from the server
# The Session class uses json for simplicity, we need to do some parsing here # The Session class uses json for simplicity, we need to do some parsing here
# It's important that we send parameters in the body here, otherwise some undefined behavior occurs # It's important that we send parameters in the body here, otherwise some undefined behavior occurs
# when the URI gets too long # when the URI gets too long
theresponse = Session.post(:objects_by_session_ids, {}, {:session_ids => session_list}.to_json) theresponse = Session.post(:objects_by_session_ids, {}, {:session_ids => session_ids}.to_json)
@objects_by_session_ids = JSON.parse(theresponse.body) @objects_by_session_ids = JSON.parse(theresponse.body)
@voter_distribution = initialize_distribution_hash(@experiment)
@uploader_distribution= initialize_distribution_hash(@experiment)


add_totals_to_distribution(@experiment, @voter_distribution, @objects_by_session_ids, "votes", admin_user_list) distributions = get_distributions(session_list, @objects_by_session_ids, @experiment.alternatives)
add_totals_to_distribution(@experiment, @uploader_distribution, @objects_by_session_ids, "ideas", admin_user_list) @voter_distribution = distributions[0]
@uploader_distribution = distributions[1]


# Calculate some summary stats # Calculate some summary stats
@summary_stats = calculate_summary_stats(@experiment, @voter_distribution, @uploader_distribution) @summary_stats = calculate_summary_stats(@experiment, @voter_distribution, @uploader_distribution)
Expand Down Expand Up @@ -126,44 +97,72 @@ def median(array, already_sorted=false)


private private


def get_session_list(experiment, admin_user_list) def group_experiments(experiments)
session_list = [] grouped_experiments = Hash.new()
experiment.alternatives.each do |alt|
alt.session_infos.each do |sess| experiments.each do |e|
if sess.user_id and admin_user_list.include?(sess.user_id) if e.test_name =~ /^.*test_icecream.*$/
next next
else end
session_list << sess.session_id if e.test_name =~ /^.*_\d{1,5}_(.*)/
end potential_group = $1
# group tests together by having "test_name|#{earl.name}"
elsif e.test_name =~ /^(.*?)\|/
potential_group = $1
elsif e.test_name =~ /^bg_color_aa_/
potential_group = 'bg_color_aa'
else
potential_group = "unknown"
end end
grouped_experiments[potential_group] = [] unless grouped_experiments.has_key?(potential_group)
grouped_experiments[potential_group] << e.id
end end
session_list
grouped_experiments
end end


def initialize_distribution_hash(experiment) def get_session_list(experiment, admin_user_list)
distribution = Hash.new(0) if experiment.class == Array
experiment.alternatives.each do |a| experiment_ids = experiment.map{|e| e.id}
distribution[a.content] = Hash.new(0) else
experiment_ids = [experiment.id]
end end
distribution sql = "SELECT DISTINCT(s.session_id), a.content
FROM `experiments` e
LEFT JOIN `alternatives` a ON (a.experiment_id = e.id)
LEFT JOIN `trials` t ON (t.alternative_id = a.id)
LEFT JOIN `session_infos` s ON (s.id = t.session_info_id)
WHERE e.id IN (#{experiment_ids.join(",")})
AND s.session_id IS NOT NULL
AND (s.user_id NOT IN (#{admin_user_list.join(",")}) OR s.user_id IS NULL)"
Abingo::Experiment.connection.select_all(sql)
end end


def add_totals_to_distribution(experiment, distribution, objects_by_session_ids, object_type, admin_user_list) def get_distributions(session_list, objects_by_session_ids, alternatives)
experiment.alternatives.each do |a| voter_distribution = {}
a.session_infos.each do |s| uploader_distribution = {}
if s.user_id and admin_user_list.include?(s.user_id) alternatives.each do |a|
next voter_distribution[a.content] = Hash.new(0)
end uploader_distribution[a.content] = Hash.new(0)
end
session_list.each do |s|
sess = objects_by_session_ids[s['session_id']]
if sess.nil?
num = 0
else
num = sess['votes']
end
voter_distribution[s['content']][num.to_i] +=1


num = objects_by_session_ids[s.session_id][object_type] rescue nil sess = objects_by_session_ids[s['session_id']]

if sess.nil?
if num num = 0
distribution[a.content][num] +=1 else
else num = sess['ideas']
distribution[a.content][0] +=1
end
end end
uploader_distribution[s['content']][num.to_i] +=1
end end
[voter_distribution, uploader_distribution]
end end


def calculate_summary_stats(experiment, voter_distribution, uploader_distribution) def calculate_summary_stats(experiment, voter_distribution, uploader_distribution)
Expand Down
4 changes: 2 additions & 2 deletions app/views/abingo_dashboard/show_groups.html.haml
@@ -1,5 +1,5 @@
%h1= "Automatically found groups of Ab test experiments" %h1= "Automatically found groups of Ab test experiments"
-@grouped_experiments.each do |group, experiment_list| -@grouped_experiments.each do |group, experiment_ids|
=link_to(group, :action => :show_set, :ids => experiment_list.map{|e| e.id}.join(',')) =link_to(group, :action => :show_set, :id => group)
%br %br


2 changes: 1 addition & 1 deletion app/views/questions/admin.html.haml
Expand Up @@ -70,7 +70,7 @@
= f.label :default_lang, "Default language" + link_to(' <i class="icon-question-sign"></i>', 'http://blog.allourideas.org/post/5137327337/languages-and-all-our-ideas', :target=> '_blank'), :class => 'control-label' = f.label :default_lang, "Default language" + link_to(' <i class="icon-question-sign"></i>', 'http://blog.allourideas.org/post/5137327337/languages-and-all-our-ideas', :target=> '_blank'), :class => 'control-label'
.controls .controls
= # Have English be the first, but sort the rest = # Have English be the first, but sort the rest
= f.select :default_lang, [["English", "en"]] + [["French", "fr"], ["Spanish", "es"], ["Portuguese", "pt"], ["Arabic", "ar"], ["Turkish", "tr"], ["Italian", "it"], ["Dutch", "nl"], ["Hebrew", "he"], ["German", "de"], ["Farsi", "fa"], ["Finnish", "fi"], ["Albanian", "sq"], ["Mandarin", "zh"]].sort = f.select :default_lang, [["English", "en"]] + [["French", "fr"], ["Spanish", "es"], ["Portuguese", "pt"], ["Arabic", "ar"], ["Turkish", "tr"], ["Italian", "it"], ["Dutch", "nl"], ["Hebrew", "he"], ["German", "de"], ["Farsi", "fa"], ["Finnish", "fi"], ["Albanian", "sq"], ["Chinese", "zh"]].sort
.control-group .control-group
= f.label :ga_code, t('admin.google_analytics_code') + link_to(' <i class="icon-quesiton-sign"></i>', 'http://blog.allourideas.org/post/947544304/add-google-analytics-on-your-idea-marketplace', :target=> '_blank'), :class => 'control-label' = f.label :ga_code, t('admin.google_analytics_code') + link_to(' <i class="icon-quesiton-sign"></i>', 'http://blog.allourideas.org/post/947544304/add-google-analytics-on-your-idea-marketplace', :target=> '_blank'), :class => 'control-label'
.controls .controls
Expand Down
1 change: 1 addition & 0 deletions config/environment.rb
Expand Up @@ -15,3 +15,4 @@
config.action_mailer.delivery_method = :smtp config.action_mailer.delivery_method = :smtp


end end
ActionController::Base.cache_store = :file_store, "#{Rails.root}/tmp/cache"

0 comments on commit 4c5d7a2

Please sign in to comment.