recommendations: add search form, allow searching by username.
This commit is contained in:
@@ -1,9 +1,9 @@
|
|||||||
class RecommendedPostsController < ApplicationController
|
class RecommendedPostsController < ApplicationController
|
||||||
respond_to :html, :json, :xml, :js
|
respond_to :html, :json, :xml, :js
|
||||||
|
|
||||||
def show
|
def index
|
||||||
limit = params.fetch(:limit, 100).to_i.clamp(0, 200)
|
limit = params.fetch(:limit, 100).to_i.clamp(0, 200)
|
||||||
@recs = RecommenderService.search(params).take(limit)
|
@recs = RecommenderService.search(search_params).take(limit)
|
||||||
@posts = @recs.map { |rec| rec[:post] }
|
@posts = @recs.map { |rec| rec[:post] }
|
||||||
|
|
||||||
respond_with(@recs)
|
respond_with(@recs)
|
||||||
|
|||||||
@@ -434,7 +434,7 @@ Post.initialize_post_sections = function() {
|
|||||||
$("#comments").hide();
|
$("#comments").hide();
|
||||||
$("#edit").hide();
|
$("#edit").hide();
|
||||||
$("#recommended").show();
|
$("#recommended").show();
|
||||||
$.get("/recommended_posts.js", { post_id: Utility.meta("post-id"), max_recommendations: Post.MAX_RECOMMENDATIONS });
|
$.get("/recommended_posts.js", { search: { post_id: Utility.meta("post-id") }, limit: Post.MAX_RECOMMENDATIONS });
|
||||||
} else {
|
} else {
|
||||||
$("#edit").hide();
|
$("#edit").hide();
|
||||||
$("#comments").hide();
|
$("#comments").hide();
|
||||||
|
|||||||
@@ -17,27 +17,27 @@ module RecommenderService
|
|||||||
enabled? && user.favorite_count > MIN_USER_FAVS
|
enabled? && user.favorite_count > MIN_USER_FAVS
|
||||||
end
|
end
|
||||||
|
|
||||||
def recommend_for_user(user_id, limit = 50)
|
def recommend_for_user(user, limit = 50)
|
||||||
body, status = HttpartyCache.get("#{Danbooru.config.recommender_server}/recommend/#{user_id}", params: { limit: limit }, expiry: CACHE_LIFETIME)
|
body, status = HttpartyCache.get("#{Danbooru.config.recommender_server}/recommend/#{user.id}", params: { limit: limit }, expiry: CACHE_LIFETIME)
|
||||||
return [] if status != 200
|
return [] if status != 200
|
||||||
|
|
||||||
process_recs(body, uploader_id: user_id, favoriter_id: user_id)
|
process_recs(body, uploader: user, favoriter: user)
|
||||||
end
|
end
|
||||||
|
|
||||||
def recommend_for_post(post_id, limit = 50)
|
def recommend_for_post(post, limit = 50)
|
||||||
body, status = HttpartyCache.get("#{Danbooru.config.recommender_server}/similar/#{post_id}", params: { limit: limit }, expiry: CACHE_LIFETIME)
|
body, status = HttpartyCache.get("#{Danbooru.config.recommender_server}/similar/#{post.id}", params: { limit: limit }, expiry: CACHE_LIFETIME)
|
||||||
return [] if status != 200
|
return [] if status != 200
|
||||||
|
|
||||||
process_recs(body, post_id: post_id)
|
process_recs(body, post: post)
|
||||||
end
|
end
|
||||||
|
|
||||||
def process_recs(recs, post_id: nil, uploader_id: nil, favoriter_id: nil)
|
def process_recs(recs, uploader: nil, favoriter: nil)
|
||||||
recs = JSON.parse(recs)
|
recs = JSON.parse(recs)
|
||||||
|
|
||||||
posts = Post.where(id: recs.map(&:first))
|
posts = Post.where(id: recs.map(&:first))
|
||||||
posts = posts.where.not(id: post_id) if post_id
|
posts = posts.where.not(id: post.id) if post
|
||||||
posts = posts.where.not(uploader_id: uploader_id) if uploader_id
|
posts = posts.where.not(uploader_id: uploader.id) if uploader
|
||||||
posts = posts.where.not(id: Favorite.where(user_id: favoriter_id).select(:post_id)) if favoriter_id
|
posts = posts.where.not(id: favoriter.favorites.select(:post_id)) if favoriter
|
||||||
|
|
||||||
id_to_score = recs.to_h
|
id_to_score = recs.to_h
|
||||||
recs = posts.map { |post| { score: id_to_score[post.id], post: post } }
|
recs = posts.map { |post| { score: id_to_score[post.id], post: post } }
|
||||||
@@ -46,14 +46,21 @@ module RecommenderService
|
|||||||
end
|
end
|
||||||
|
|
||||||
def search(params)
|
def search(params)
|
||||||
if params[:user_id].present?
|
if params[:user_name].present?
|
||||||
|
user = User.find_by_name(params[:user_name])
|
||||||
|
elsif params[:user_id].present?
|
||||||
user = User.find(params[:user_id])
|
user = User.find(params[:user_id])
|
||||||
|
elsif params[:post_id].present?
|
||||||
|
post = Post.find(params[:post_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
if user.present?
|
||||||
raise User::PrivilegeError if user.hide_favorites?
|
raise User::PrivilegeError if user.hide_favorites?
|
||||||
max_recommendations = params.fetch(:max_recommendations, user.favorite_count + 500).to_i.clamp(0, 50000)
|
max_recommendations = params.fetch(:max_recommendations, user.favorite_count + 500).to_i.clamp(0, 50000)
|
||||||
recs = RecommenderService.recommend_for_user(params[:user_id], max_recommendations)
|
recs = RecommenderService.recommend_for_user(user, max_recommendations)
|
||||||
elsif params[:post_id].present?
|
elsif post.present?
|
||||||
max_recommendations = params.fetch(:max_recommendations, 50).to_i.clamp(0, 200)
|
max_recommendations = params.fetch(:max_recommendations, 100).to_i.clamp(0, 1000)
|
||||||
recs = RecommenderService.recommend_for_post(params[:post_id], max_recommendations)
|
recs = RecommenderService.recommend_for_post(post, max_recommendations)
|
||||||
else
|
else
|
||||||
recs = []
|
recs = []
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<%= subnav_link_to "Upload", new_upload_path %>
|
<%= subnav_link_to "Upload", new_upload_path %>
|
||||||
<%= subnav_link_to "Hot", posts_path(:tags => "order:rank", :d => "1") %>
|
<%= subnav_link_to "Hot", posts_path(:tags => "order:rank", :d => "1") %>
|
||||||
<% if RecommenderService.available_for_user?(CurrentUser.user) %>
|
<% if RecommenderService.available_for_user?(CurrentUser.user) %>
|
||||||
<%= subnav_link_to "Recommended", recommended_posts_path(user_id: CurrentUser.id) %>
|
<%= subnav_link_to "Recommended", recommended_posts_path(search: { user_name: CurrentUser.name }) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% unless CurrentUser.is_anonymous? %>
|
<% unless CurrentUser.is_anonymous? %>
|
||||||
<%= subnav_link_to "Favorites", posts_path(tags: "ordfav:#{CurrentUser.user.name}") %>
|
<%= subnav_link_to "Favorites", posts_path(tags: "ordfav:#{CurrentUser.user.name}") %>
|
||||||
|
|||||||
9
app/views/recommended_posts/_index.html.erb
Normal file
9
app/views/recommended_posts/_index.html.erb
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<section class="recommended-posts user-disable-cropped-<%= Danbooru.config.enable_image_cropping && CurrentUser.user.disable_cropped_thumbnails? %>">
|
||||||
|
<% if @recs.empty? %>
|
||||||
|
No recommendations found.
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% @recs.each do |rec| %>
|
||||||
|
<%= PostPresenter.preview(rec[:post], recommended: 100*rec[:score]) %>
|
||||||
|
<% end %>
|
||||||
|
</section>
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<section class="recommended-posts user-disable-cropped-<%= Danbooru.config.enable_image_cropping && CurrentUser.user.disable_cropped_thumbnails? %>">
|
|
||||||
<%= PostSets::Recommended.new(@posts).presenter.post_previews_html(self) %>
|
|
||||||
</section>
|
|
||||||
20
app/views/recommended_posts/index.html.erb
Normal file
20
app/views/recommended_posts/index.html.erb
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<div id="c-recommended-posts">
|
||||||
|
<div id="a-index">
|
||||||
|
<h1>Recommended Posts</h1>
|
||||||
|
|
||||||
|
<%= search_form_for(recommended_posts_path) do |f| %>
|
||||||
|
<%= f.input :user_name, label: "User", input_html: { value: params[:search][:user_name], "data-autocomplete": "user" } %>
|
||||||
|
<%= f.input :post_id, label: "Post", input_html: { value: params[:search][:post_id] } %>
|
||||||
|
<%= f.submit "Search" %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= render "posts/partials/common/inline_blacklist" %>
|
||||||
|
<%= render partial: "index" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%= render "posts/partials/common/secondary_links" %>
|
||||||
|
|
||||||
|
<% content_for(:page_title) do %>
|
||||||
|
Recommended Posts - <%= Danbooru.config.app_name %>
|
||||||
|
<% end %>
|
||||||
1
app/views/recommended_posts/index.js.erb
Normal file
1
app/views/recommended_posts/index.js.erb
Normal file
@@ -0,0 +1 @@
|
|||||||
|
$("#recommended").html("<%= j render "recommended_posts/index" %>");
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
<div id="c-recommended-posts">
|
|
||||||
<div id="a-show">
|
|
||||||
<h1>Recommended Posts</h1>
|
|
||||||
|
|
||||||
<p>Based on your favorites, you may enjoy these posts. Favorite more posts to get more accurate results. These recommendations update every few hours.</p>
|
|
||||||
|
|
||||||
<%= render "posts/partials/common/inline_blacklist" %>
|
|
||||||
<%= render partial: "show" %>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<%= render "posts/partials/common/secondary_links" %>
|
|
||||||
|
|
||||||
<% content_for(:page_title) do %>
|
|
||||||
Recommended Posts - <%= Danbooru.config.app_name %>
|
|
||||||
<% end %>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
$("#recommended").html("<%= j render "recommended_posts/show" %>");
|
|
||||||
@@ -241,7 +241,7 @@ Rails.application.routes.draw do
|
|||||||
get "reports/upload_tags" => "reports#upload_tags"
|
get "reports/upload_tags" => "reports#upload_tags"
|
||||||
get "reports/down_voting_post" => "reports#down_voting_post"
|
get "reports/down_voting_post" => "reports#down_voting_post"
|
||||||
post "reports/down_voting_post_create" => "reports#down_voting_post_create"
|
post "reports/down_voting_post_create" => "reports#down_voting_post_create"
|
||||||
resource :recommended_posts, only: [:show]
|
resources :recommended_posts, only: [:index]
|
||||||
resources :saved_searches, :except => [:show] do
|
resources :saved_searches, :except => [:show] do
|
||||||
collection do
|
collection do
|
||||||
get :labels
|
get :labels
|
||||||
|
|||||||
Reference in New Issue
Block a user