fixes #2454: Add a new popular posts page for view counts
This commit is contained in:
@@ -299,7 +299,13 @@
|
|||||||
Danbooru.Post.initialize_title_for = function(post) {
|
Danbooru.Post.initialize_title_for = function(post) {
|
||||||
var $post = $(post);
|
var $post = $(post);
|
||||||
var $img = $post.find("img");
|
var $img = $post.find("img");
|
||||||
$img.attr("title", $post.attr("data-tags") + " user:" + $post.attr("data-uploader") + " rating:" + $post.data("rating") + " score:" + $post.data("score"));
|
var score = null;
|
||||||
|
if ($post.data("views")) {
|
||||||
|
score = " views:" + $post.data("views");
|
||||||
|
} else {
|
||||||
|
score = " score:" + $post.data("score");
|
||||||
|
}
|
||||||
|
$img.attr("title", $post.attr("data-tags") + " user:" + $post.attr("data-uploader") + " rating:" + $post.data("rating") + score);
|
||||||
}
|
}
|
||||||
|
|
||||||
Danbooru.Post.initialize_post_image_resize_links = function() {
|
Danbooru.Post.initialize_post_image_resize_links = function() {
|
||||||
|
|||||||
@@ -8,6 +8,12 @@ module Explore
|
|||||||
respond_with(@posts)
|
respond_with(@posts)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def popular_view
|
||||||
|
@post_set = PostSets::PopularView.new(params[:date], params[:scale])
|
||||||
|
@posts = @post_set.posts
|
||||||
|
respond_with(@posts)
|
||||||
|
end
|
||||||
|
|
||||||
def intro
|
def intro
|
||||||
@presenter = IntroPresenter.new
|
@presenter = IntroPresenter.new
|
||||||
render :layout => "blank"
|
render :layout => "blank"
|
||||||
|
|||||||
73
app/logical/post_sets/popular_view.rb
Normal file
73
app/logical/post_sets/popular_view.rb
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
module PostSets
|
||||||
|
class PopularView < PostSets::Base
|
||||||
|
attr_reader :date, :scale
|
||||||
|
|
||||||
|
def initialize(date, scale)
|
||||||
|
@date = date.blank? ? Time.zone.now : Time.zone.parse(date)
|
||||||
|
@scale = scale || "Day"
|
||||||
|
end
|
||||||
|
|
||||||
|
def posts
|
||||||
|
@posts ||= begin
|
||||||
|
array = fetch_data.scan(/\S+/).in_groups_of(2)
|
||||||
|
post_ids = array.map(&:first)
|
||||||
|
posts = ::Post.where(id: post_ids).order(arbitrary_sql_order_clause(post_ids, "posts"))
|
||||||
|
posts.each.with_index do |post, i|
|
||||||
|
post.view_count = array[i][1].to_i
|
||||||
|
end
|
||||||
|
posts
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def min_date
|
||||||
|
case scale
|
||||||
|
when "week"
|
||||||
|
date.beginning_of_week
|
||||||
|
|
||||||
|
when "month"
|
||||||
|
date.beginning_of_month
|
||||||
|
|
||||||
|
else
|
||||||
|
date
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def max_date
|
||||||
|
case scale
|
||||||
|
when "week"
|
||||||
|
date.end_of_week
|
||||||
|
|
||||||
|
when "month"
|
||||||
|
date.end_of_month
|
||||||
|
|
||||||
|
else
|
||||||
|
date
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def source
|
||||||
|
"popular_by_#{scale.downcase}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def fetch_data
|
||||||
|
dates = date.strftime('%Y-%m-%d')
|
||||||
|
Cache.get("pv-#{scale}-#{dates}", 1.minute) do
|
||||||
|
url = URI.parse("#{Danbooru.config.report_server}/hits/#{source}?date=#{dates}")
|
||||||
|
response = []
|
||||||
|
Net::HTTP.start(url.host, url.port, :use_ssl => url.is_a?(URI::HTTPS)) do |http|
|
||||||
|
http.read_timeout = 1
|
||||||
|
http.request_get(url.request_uri) do |res|
|
||||||
|
if res.is_a?(Net::HTTPSuccess)
|
||||||
|
response = res.body
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
response
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def presenter
|
||||||
|
::PostSetPresenters::Popular.new(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -7,7 +7,7 @@ class Post < ActiveRecord::Base
|
|||||||
:has_embedded_notes => 0x0001
|
:has_embedded_notes => 0x0001
|
||||||
}
|
}
|
||||||
|
|
||||||
attr_accessor :old_tag_string, :old_parent_id, :old_source, :old_rating, :has_constraints, :disable_versioning
|
attr_accessor :old_tag_string, :old_parent_id, :old_source, :old_rating, :has_constraints, :disable_versioning, :view_count
|
||||||
after_destroy :delete_files
|
after_destroy :delete_files
|
||||||
after_destroy :delete_remote_files
|
after_destroy :delete_remote_files
|
||||||
after_save :create_version
|
after_save :create_version
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ class PostPresenter < Presenter
|
|||||||
data-parent-id="#{post.parent_id}"
|
data-parent-id="#{post.parent_id}"
|
||||||
data-has-children="#{post.has_children?}"
|
data-has-children="#{post.has_children?}"
|
||||||
data-score="#{post.score}"
|
data-score="#{post.score}"
|
||||||
|
data-views="#{post.view_count}"
|
||||||
data-fav-count="#{post.fav_count}"
|
data-fav-count="#{post.fav_count}"
|
||||||
data-pixiv-id="#{post.pixiv_id}"
|
data-pixiv-id="#{post.pixiv_id}"
|
||||||
data-md5="#{post.md5}"
|
data-md5="#{post.md5}"
|
||||||
|
|||||||
38
app/presenters/post_set_presenters/popular_view.rb
Normal file
38
app/presenters/post_set_presenters/popular_view.rb
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
module PostSetPresenters
|
||||||
|
class PopularView < Popular
|
||||||
|
def initialize(post_set)
|
||||||
|
@post_set = post_set
|
||||||
|
end
|
||||||
|
|
||||||
|
def nav_links_for_scale(template, scale)
|
||||||
|
html = []
|
||||||
|
html << '<span class="period">'
|
||||||
|
html << template.link_to(
|
||||||
|
"«prev".html_safe,
|
||||||
|
template.popular_explore_post_views_path(
|
||||||
|
:date => prev_date_for_scale(scale),
|
||||||
|
:scale => scale.downcase
|
||||||
|
),
|
||||||
|
:rel => (link_rel_for_scale?(template, scale.downcase) ? "prev" : nil)
|
||||||
|
)
|
||||||
|
html << template.link_to(
|
||||||
|
scale,
|
||||||
|
template.popular_explore_post_views_path(
|
||||||
|
:date => date,
|
||||||
|
:scale => scale.downcase
|
||||||
|
),
|
||||||
|
:class => "desc"
|
||||||
|
)
|
||||||
|
html << template.link_to(
|
||||||
|
"next»".html_safe,
|
||||||
|
template.popular_explore_post_views_path(
|
||||||
|
:date => next_date_for_scale(scale),
|
||||||
|
:scale => scale.downcase
|
||||||
|
),
|
||||||
|
:rel => (link_rel_for_scale?(template, scale.downcase) ? "next" : nil)
|
||||||
|
)
|
||||||
|
html << '</span>'
|
||||||
|
html.join("\n").html_safe
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
17
app/views/explore/posts/popular_view.html.erb
Normal file
17
app/views/explore/posts/popular_view.html.erb
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<div id="c-explore-posts">
|
||||||
|
<div id="a-index">
|
||||||
|
<h1>Popular (by views): <%= @post_set.presenter.range_text %></h1>
|
||||||
|
|
||||||
|
<%= @post_set.presenter.nav_links(self) %>
|
||||||
|
|
||||||
|
<%= render "posts/partials/common/inline_blacklist" %>
|
||||||
|
|
||||||
|
<%= @post_set.presenter.post_previews_html(self) %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%= render "posts/partials/common/secondary_links" %>
|
||||||
|
|
||||||
|
<% content_for(:page_title) do %>
|
||||||
|
Popular (by views) - <%= Danbooru.config.app_name %>
|
||||||
|
<% end %>
|
||||||
@@ -42,9 +42,10 @@ Rails.application.routes.draw do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
namespace :explore do
|
namespace :explore do
|
||||||
resources :posts, :only => [:popular, :hot] do
|
resources :posts do
|
||||||
collection do
|
collection do
|
||||||
get :popular
|
get :popular
|
||||||
|
get :popular_view
|
||||||
get :hot
|
get :hot
|
||||||
get :intro
|
get :intro
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user