Files
danbooru/app/presenters/user_presenter.rb
evazion bf3101da48 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.
2017-08-10 23:48:50 -05:00

215 lines
5.8 KiB
Ruby

class UserPresenter
attr_reader :user
def initialize(user)
@user = user
end
def name
user.pretty_name
end
def join_date
user.created_at.strftime("%Y-%m-%d")
end
def level
user.level_string
end
def ban_reason
if user.is_banned?
"#{user.recent_ban.reason}; expires #{user.recent_ban.expires_at} (#{user.bans.count} bans total)"
else
nil
end
end
def permissions
permissions = []
if user.can_approve_posts?
permissions << "approve posts"
end
if user.can_upload_free?
permissions << "unrestricted uploads"
end
if user.is_super_voter?
permissions << "super voter"
end
permissions.join(", ")
end
def posts_for_saved_search_category(category)
if !SavedSearch.enabled?
return Post.where("false")
end
ids = SavedSearch.post_ids(CurrentUser.user.id, category)
if ids.any?
arel = Post.where("id in (?)", ids.map(&:to_i)).order("id desc").limit(10)
if CurrentUser.user.hide_deleted_posts?
arel = arel.undeleted
end
arel
else
Post.where("false")
end
end
def upload_limit
if user.can_upload_free?
return "none"
end
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.used_upload_slots} / <abbr title="#{limit_tooltip}">#{user.upload_limit}</abbr>}.html_safe
end
def uploads
@uploads ||= begin
arel = Post.where("uploader_id = ?", user.id).order("id desc").limit(6)
if CurrentUser.user.hide_deleted_posts?
arel = arel.undeleted
end
arel
end
end
def has_uploads?
user.post_upload_count > 0
end
def favorites
@favorites ||= begin
arel = user.favorites.limit(6).joins(:post).reorder("favorites.id desc")
if CurrentUser.user.hide_deleted_posts?
arel = arel.where("posts.is_deleted = false")
end
arel.map(&:post).compact
end
end
def has_favorites?
user.favorite_count > 0
end
def upload_count(template)
template.link_to(user.post_upload_count, template.posts_path(:tags => "user:#{user.name}"))
end
def deleted_upload_count(template)
template.link_to(Post.for_user(user.id).deleted.count, template.posts_path(:tags => "status:deleted user:#{user.name}"))
end
def favorite_count(template)
template.link_to(user.favorite_count, template.favorites_path(:user_id => user.id))
end
def favorite_group_count(template)
template.link_to(user.favorite_group_count, template.favorite_groups_path(:search => {:creator_id => user.id}))
end
def comment_count(template)
template.link_to(user.comment_count, template.comments_path(:search => {:creator_id => user.id}, :group_by => "comment"))
end
def commented_posts_count(template)
count = CurrentUser.without_safe_mode { Post.fast_count("commenter:#{user.name}") }
template.link_to(count, template.posts_path(:tags => "commenter:#{user.name} order:comment_bumped"))
end
def post_version_count(template)
template.link_to(user.post_update_count, template.post_versions_path(:lr => user.id, :search => {:updater_id => user.id}))
end
def note_version_count(template)
template.link_to(user.note_update_count, template.note_versions_path(:search => {:updater_id => user.id}))
end
def noted_posts_count(template)
count = CurrentUser.without_safe_mode { Post.fast_count("noteupdater:#{user.name}") }
template.link_to(count, template.posts_path(:tags => "noteupdater:#{user.name} order:note"))
end
def wiki_page_version_count(template)
template.link_to(user.wiki_page_version_count, template.wiki_page_versions_path(:search => {:updater_id => user.id}))
end
def artist_version_count(template)
template.link_to(user.artist_version_count, template.artist_versions_path(:search => {:updater_id => user.id}))
end
def artist_commentary_version_count(template)
template.link_to(user.artist_commentary_version_count, template.artist_commentary_versions_path(:search => {:updater_id => user.id}))
end
def forum_post_count(template)
template.link_to(user.forum_post_count, template.forum_posts_path(:search => {:creator_id => user.id}))
end
def pool_version_count(template)
if PoolArchive.enabled?
template.link_to(user.pool_version_count, template.pool_versions_path(:search => {:updater_id => user.id}))
else
"N/A"
end
end
def inviter(template)
if user.inviter_id
template.link_to_user(user.inviter)
else
"None"
end
end
def appeal_count(template)
template.link_to(user.appeal_count, template.post_appeals_path(:search => {:creator_name => user.name}))
end
def flag_count(template)
template.link_to(user.flag_count, template.post_flags_path(:search => {:creator_name => user.name}))
end
def approval_count(template)
template.link_to(Post.where("approver_id = ?", user.id).count, template.posts_path(:tags => "approver:#{user.name}"))
end
def feedbacks(template)
positive = user.positive_feedback_count
neutral = user.neutral_feedback_count
negative = user.negative_feedback_count
template.link_to("positive:#{positive} neutral:#{neutral} negative:#{negative}", template.user_feedbacks_path(:search => {:user_id => user.id}))
end
def saved_search_labels
if CurrentUser.user.id == user.id
SavedSearch.labels_for(CurrentUser.user.id)
else
[]
end
end
def previous_names(template)
user.user_name_change_requests.map { |req| template.link_to req.original_name, req }.join(", ").html_safe
end
end