From bf3101da489ea88ecaafd59fd31da3ec05443f1a Mon Sep 17 00:00:00 2001 From: evazion Date: Thu, 10 Aug 2017 21:20:10 -0500 Subject: [PATCH] upload limits: show how upload limits are calculated in profiles. * Allow mousing over the upload limit on profile pages to show the full formula for the upload limit calculation. In particular, show how the upload limit multiplier is derived from the deletion confidence. * Refactor to avoid duplicating upload limit calculations in the presenter, as much as possible. --- app/models/user.rb | 41 +++++++++++++++------------- app/presenters/user_presenter.rb | 13 +++++---- app/views/users/_statistics.html.erb | 2 +- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 3a85606b5..57ac132fb 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -549,6 +549,28 @@ class User < ApplicationRecord is_moderator? || flagger_id == id end + def upload_limit + @upload_limit ||= [max_upload_limit - used_upload_slots, 0].max + end + + def used_upload_slots + uploaded_count = Post.for_user(id).where("created_at >= ?", 24.hours.ago).count + uploaded_comic_count = Post.for_user(id).tag_match("comic").where("created_at >= ?", 24.hours.ago).count / 3 + uploaded_count - uploaded_comic_count + end + + def max_upload_limit + [(base_upload_limit * upload_limit_multiplier).ceil, 10].max + end + + def upload_limit_multiplier + (1 - (adjusted_deletion_confidence / 15.0)) + end + + def adjusted_deletion_confidence + [deletion_confidence(60), 15].min + end + def base_upload_limit if created_at >= 1.month.ago 10 @@ -563,25 +585,6 @@ class User < ApplicationRecord end end - def max_upload_limit - dcon = [deletion_confidence(60), 15].min - [(base_upload_limit * (1 - (dcon / 15.0))).ceil, 10].max - end - - def upload_limit - @upload_limit ||= begin - uploaded_count = Post.for_user(id).where("created_at >= ?", 24.hours.ago).count - uploaded_comic_count = Post.for_user(id).tag_match("comic").where("created_at >= ?", 24.hours.ago).count / 3 - limit = max_upload_limit - (uploaded_count - uploaded_comic_count) - - if limit < 0 - limit = 0 - end - - limit - end - end - def tag_query_limit if is_platinum? Danbooru.config.base_tag_query_limit * 2 diff --git a/app/presenters/user_presenter.rb b/app/presenters/user_presenter.rb index 808da1fa0..b5bea4e0a 100644 --- a/app/presenters/user_presenter.rb +++ b/app/presenters/user_presenter.rb @@ -68,13 +68,14 @@ class UserPresenter return "none" end - dcon = [user.deletion_confidence(60), 15].min - multiplier = (1 - (dcon / 15.0)) - max_count = [(user.base_upload_limit * multiplier).ceil, 5].max - uploaded_count = Post.for_user(user.id).where("created_at >= ?", 24.hours.ago).count - uploaded_comic_count = Post.for_user(user.id).tag_match("comic").where("created_at >= ?", 24.hours.ago).count / 3 + limit_tooltip = <<-EOS.strip_heredoc + Base: #{user.base_upload_limit} + Del. Rate: #{"%.2f" % user.adjusted_deletion_confidence} + Multiplier: (1 - (#{"%.2f" % user.adjusted_deletion_confidence} / 15)) = #{user.upload_limit_multiplier} + Upload Limit: #{user.base_upload_limit} * #{"%.2f" % user.upload_limit_multiplier} = #{user.max_upload_limit} + EOS - "(#{user.base_upload_limit} * #{'%0.2f' % multiplier}) - #{uploaded_count - uploaded_comic_count} = #{user.upload_limit}" + %{#{user.used_upload_slots} / #{user.upload_limit}}.html_safe end def uploads diff --git a/app/views/users/_statistics.html.erb b/app/views/users/_statistics.html.erb index 25d63d60c..c5deecb12 100644 --- a/app/views/users/_statistics.html.erb +++ b/app/views/users/_statistics.html.erb @@ -31,7 +31,7 @@ Upload Limit - <%= presenter.upload_limit %> + <%= presenter.upload_limit %> (<%= link_to "help", wiki_pages_path(title: "about:upload_limits") %>)