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.
This commit is contained in:
evazion
2017-08-10 21:20:10 -05:00
parent 87b0dc3ae3
commit bf3101da48
3 changed files with 30 additions and 26 deletions

View File

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

View File

@@ -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} / <abbr title="#{limit_tooltip}">#{user.upload_limit}</abbr>}.html_safe
end
def uploads

View File

@@ -31,7 +31,7 @@
<tr>
<th>Upload Limit</th>
<td><%= presenter.upload_limit %></td>
<td><%= presenter.upload_limit %> (<%= link_to "help", wiki_pages_path(title: "about:upload_limits") %>)</td>
</tr>
<tr>