Files
danbooru/app/presenters/user_presenter.rb
evazion f38c38f26e search: split tag_match into user_tag_match / system_tag_match.
When doing a tag search, we have to be careful about which user we're
running the search as because the results depend on the current user.
Specifically, things like private favorites, private favorite groups,
post votes, saved searches, and flagger names depend on the user's
permissions, and whether non-safe or deleted posts are filtered out
depend on whether the user has safe mode on or the hide deleted posts
setting enabled.

* Refactor internal searches to explicitly state whether they're
  running as the system user (DanbooruBot) or as the current user.
* Explicitly pass in the current user to PostQueryBuilder instead of
  implicitly relying on the CurrentUser global.
* Get rid of CurrentUser.admin_mode? (used to ignore the hide deleted
  post setting) and CurrentUser.without_safe_mode (used to ignore safe
  mode).
* Change the /counts/posts.json endpoint to ignore safe mode and the
  hide deleted posts settings when counting posts.
* Fix searches not correctly overriding the hide deleted posts setting
  when multiple status: metatags were used (e.g. `status:banned status:active`)
* Fix fast_count not respecting the hide deleted posts setting when the
  status:banned metatag was used.
2020-05-07 03:29:44 -05:00

150 lines
4.2 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 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
permissions.join(", ")
end
def posts_for_saved_search_category(category)
Post.user_tag_match("search:#{category}").limit(10)
end
def uploads
Post.user_tag_match("user:#{user.name}").limit(6)
end
def has_uploads?
user.post_upload_count > 0
end
def favorites
Post.user_tag_match("ordfav:#{user.name}").limit(6)
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(user.posts.deleted.count, template.posts_path(:tags => "status:deleted user:#{user.name}"))
end
def favorite_count(template)
template.link_to(user.favorite_count, template.posts_path(tags: "ordfav:#{user.name}"))
end
def favorite_group_count(template)
template.link_to(user.favorite_group_count, template.favorite_groups_path(search: { creator_name: user.name }))
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 = PostQueryBuilder.new("commenter:#{user.name}", User.system).fast_count
count = "?" if count.nil?
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(: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 = PostQueryBuilder.new("noteupdater:#{user.name}", User.system).fast_count
count = "?" if count.nil?
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 PoolVersion.enabled?
template.link_to(user.pool_version_count, template.pool_versions_path(:search => {:updater_id => user.id}))
else
"N/A"
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
end