Merge pull request #3780 from r888888888/recommended-posts
Recommend posts on /posts/show based on voting patterns
This commit is contained in:
6
.env
6
.env
@@ -80,8 +80,8 @@
|
|||||||
# export DANBOORU_AWS_SQS_REGION=
|
# export DANBOORU_AWS_SQS_REGION=
|
||||||
# export DANBOORU_IQDBS_AUTH_KEY=
|
# export DANBOORU_IQDBS_AUTH_KEY=
|
||||||
# export DANBOORU_IQDBS_SERVER=
|
# export DANBOORU_IQDBS_SERVER=
|
||||||
# export DANBOORU_CCS_SERVER=
|
|
||||||
# export DANBOORU_CCS_KEY=
|
|
||||||
# export DANBOORU_CLOUDFLARE_KEY=
|
# export DANBOORU_CLOUDFLARE_KEY=
|
||||||
# export DANBOORU_CLOUDFLARE_EMAIL=
|
# export DANBOORU_CLOUDFLARE_EMAIL=
|
||||||
# export DANBOORU_CLOUDFLARE_ZONE=
|
# export DANBOORU_CLOUDFLARE_ZONE=
|
||||||
|
# export DANBOORU_RECOMMENDER_KEY=
|
||||||
|
# export DANBOORU_RECOMMENDER_SERVER=
|
||||||
|
|||||||
@@ -324,6 +324,10 @@ div#c-posts {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.similar-posts {
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
#add-fav-button, #remove-fav-button {
|
#add-fav-button, #remove-fav-button {
|
||||||
margin-top: 1em;
|
margin-top: 1em;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ class WikiPagesController < ApplicationController
|
|||||||
before_action :normalize_search_params, :only => [:index]
|
before_action :normalize_search_params, :only => [:index]
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@wiki_page = WikiPage.new(wiki_page_params)
|
@wiki_page = WikiPage.new(wiki_page_create_params)
|
||||||
respond_with(@wiki_page)
|
respond_with(@wiki_page)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
20
app/logical/post_sets/similar.rb
Normal file
20
app/logical/post_sets/similar.rb
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
module PostSets
|
||||||
|
class Similar < PostSets::Post
|
||||||
|
def initialize(post)
|
||||||
|
super("")
|
||||||
|
@post = post
|
||||||
|
end
|
||||||
|
|
||||||
|
def posts
|
||||||
|
@posts ||= begin
|
||||||
|
response = RecommenderService.similar(@post)
|
||||||
|
post_ids = response.reject {|x| x[0] == @post.id}.slice(0, 5).map {|x| x[0]}
|
||||||
|
::Post.find(post_ids)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def presenter
|
||||||
|
::PostSetPresenters::Post.new(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
26
app/models/recommender_service.rb
Normal file
26
app/models/recommender_service.rb
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
module RecommenderService
|
||||||
|
extend self
|
||||||
|
|
||||||
|
def enabled?
|
||||||
|
Danbooru.config.recommender_server.present?
|
||||||
|
end
|
||||||
|
|
||||||
|
def available?(post)
|
||||||
|
enabled? && CurrentUser.id == 1 && post.created_at > 6.months.ago && post.score >= 10
|
||||||
|
end
|
||||||
|
|
||||||
|
def similar(post)
|
||||||
|
Cache.get("rss:#{post.id}", 1.day) do
|
||||||
|
resp = HTTParty.get(
|
||||||
|
"#{Danbooru.config.recommender_server}/similar/#{post.id}",
|
||||||
|
Danbooru.config.httparty_options.merge(
|
||||||
|
basic_auth: {
|
||||||
|
username: "danbooru",
|
||||||
|
password: Danbooru.config.recommender_key
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
JSON.parse(resp.body)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
7
app/views/posts/partials/index/_similar.html.erb
Normal file
7
app/views/posts/partials/index/_similar.html.erb
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<div class="similar-posts">
|
||||||
|
<p><em>You might also like:</em></p>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<%= PostSets::Similar.new(post).presenter.post_previews_html(self) %>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
@@ -82,6 +82,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<% if RecommenderService.available?(@post) %>
|
||||||
|
<%= render "posts/partials/index/similar", post: @post %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<% if @post.presenter.has_nav_links?(self) %>
|
<% if @post.presenter.has_nav_links?(self) %>
|
||||||
<%= render "posts/partials/show/nav_links", :post => @post, :position => "bottom" %>
|
<%= render "posts/partials/show/nav_links", :post => @post, :position => "bottom" %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -783,6 +783,12 @@ module Danbooru
|
|||||||
|
|
||||||
def cloudflare_key
|
def cloudflare_key
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def recommender_server
|
||||||
|
end
|
||||||
|
|
||||||
|
def recommender_key
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class EnvironmentConfiguration
|
class EnvironmentConfiguration
|
||||||
|
|||||||
@@ -115,6 +115,22 @@ class PostsControllerTest < ActionDispatch::IntegrationTest
|
|||||||
get post_path(@post), params: {:id => @post.id}
|
get post_path(@post), params: {:id => @post.id}
|
||||||
assert_response :success
|
assert_response :success
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "when the recommend service is enabled" do
|
||||||
|
setup do
|
||||||
|
@post2 = create(:post)
|
||||||
|
RecommenderService.stubs(:enabled?).returns(true)
|
||||||
|
RecommenderService.stubs(:available?).returns(true)
|
||||||
|
RecommenderService.stubs(:similar).returns([[@post.id, "1.0"], [@post2.id, "0.01"]])
|
||||||
|
end
|
||||||
|
|
||||||
|
should "render a section for similar posts" do
|
||||||
|
get_auth post_path(@post), @user
|
||||||
|
assert_response :success
|
||||||
|
assert_select ".similar-posts"
|
||||||
|
assert_select ".similar-posts #post_#{@post2.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "update action" do
|
context "update action" do
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ class WikiPagesControllerTest < ActionDispatch::IntegrationTest
|
|||||||
end
|
end
|
||||||
|
|
||||||
should "rename a wiki page with a non-empty tag if secondary validations are skipped" do
|
should "rename a wiki page with a non-empty tag if secondary validations are skipped" do
|
||||||
put_auth wiki_page_path(@wiki_page), @user, params: {:wiki_page => {:title => "bar", :skip_secondary_validations => "1"}}
|
put_auth wiki_page_path(@wiki_page), @mod, params: {:wiki_page => {:title => "bar", :skip_secondary_validations => "1"}}
|
||||||
assert_equal("bar", @wiki_page.reload.title)
|
assert_equal("bar", @wiki_page.reload.title)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user