diff --git a/app/assets/stylesheets/specific/reports.css.scss b/app/assets/stylesheets/specific/reports.css.scss new file mode 100644 index 000000000..e69de29bb diff --git a/app/logical/reports/user_promotions.rb b/app/logical/reports/user_promotions.rb index 3fe16ae27..8885797f6 100644 --- a/app/logical/reports/user_promotions.rb +++ b/app/logical/reports/user_promotions.rb @@ -2,6 +2,19 @@ require 'statistics2' module Reports class UserPromotions + class User + attr_reader :user + delegate :name, :post_upload_count, :level_string, :level, :created_at, :to => :user + + def initialize(user) + @user = user + end + + def confidence_interval_for(n) + Reports::UserPromotions.confidence_interval_for(user, n) + end + end + def self.confidence_interval_for(user, n) up_votes = Post.where("created_at >= ?", min_time).where(:uploader_id => user.id).where("fav_count >= ?", n).count total_votes = Post.where("created_at >= ?", min_time).where(:uploader_id => user.id).count @@ -23,7 +36,7 @@ module Reports end def users - User.where("users.level < ? and users.post_upload_count >= 100", User::Levels::CONTRIBUTOR).order("created_at desc").limit(50) + ::User.where("users.level < ? and users.post_upload_count >= 100", ::User::Levels::CONTRIBUTOR).order("created_at desc").limit(50).map {|x| Reports::UserPromotions::User.new(x)} end end end diff --git a/app/views/reports/user_promotions.html.erb b/app/views/reports/user_promotions.html.erb index db89f783f..26ba0d0e1 100644 --- a/app/views/reports/user_promotions.html.erb +++ b/app/views/reports/user_promotions.html.erb @@ -4,29 +4,45 @@

Binomial proportion confidence interval for how likely a user's uploads will achieve a fav count of at at least n with 95% confidence within the past 30 days.

- +
- - - - - + + + + + + + <% cache("user-promotions-report/#{Date.today}") do %> <% @report.users.each do |user| %> - - - - - + + + + + + + <% end %> <% end %>
UserLevelscore:1+score:5+score:10+UserLevelUploadsAgescore:1+score:5+score:10+
<%= link_to user.name, user_path(user) %><%= user.level_string %><%= number_to_percentage Reports::UserPromotions.confidence_interval_for(user, 1), :precision => 0 %><%= number_to_percentage Reports::UserPromotions.confidence_interval_for(user, 5), :precision => 0 %><%= number_to_percentage Reports::UserPromotions.confidence_interval_for(user, 10), :precision => 0 %><%= link_to user.name, user_path(user.user) %><%= user.level_string %><%= user.post_upload_count %><%= time_ago_in_words user.created_at %><%= number_to_percentage user.confidence_interval_for(1), :precision => 0 %><%= number_to_percentage user.confidence_interval_for(5), :precision => 0 %><%= number_to_percentage user.confidence_interval_for(10), :precision => 0 %>
- \ No newline at end of file + + +<%= content_for(:html_header) do %> + <%= javascript_include_tag "stupidtable" %> + +<% end %> \ No newline at end of file diff --git a/vendor/assets/javascripts/stupidtable.js b/vendor/assets/javascripts/stupidtable.js new file mode 100644 index 000000000..e376bf2a6 --- /dev/null +++ b/vendor/assets/javascripts/stupidtable.js @@ -0,0 +1,3 @@ +(function(e){e.fn.stupidtable=function(j){return this.each(function(){var d=e(this);j=j||{};j=e.extend({},{"int":function(b,a){return parseInt(b,10)-parseInt(a,10)},"float":function(b,a){return parseFloat(b)-parseFloat(a)},string:function(b,a){return ba?1:0},"string-ins":function(b,a){b=b.toLowerCase();a=a.toLowerCase();return ba?1:0}},j);d.on("click","th",function(){var b=d.children("tbody").children("tr"),a=e(this),k=0,n=e.fn.stupidtable.dir;d.find("th").slice(0,a.index()).each(function(){var a= +e(this).attr("colspan")||1;k+=parseInt(a,10)});var m=a.data("sort-dir")===n.ASC?n.DESC:n.ASC,p=m==n.DESC?a.data("sort-desc")||a.data("sort")||null:a.data("sort")||null;null!==p&&(d.trigger("beforetablesort",{column:k,direction:m}),d.css("display"),setTimeout(function(){var l=[],c=j[p];b.each(function(a,b){var c=e(b).children().eq(k),d=c.data("sort-value"),c="undefined"!==typeof d?d:c.text();l.push(c)});var f=[],g=0;if(a.data("sort-dir")&&!a.data("sort-desc"))for(c=l.length-1;0<=c;c--)f.push(c);else for(var h= +l.slice(0).sort(c),c=0;c