FEATURE: if auto bump is enabled, do not bump solved

This commit is contained in:
Sam 2018-07-18 10:56:56 +10:00
parent 258956fefc
commit 5b81cc9293
2 changed files with 65 additions and 23 deletions

View File

@ -60,20 +60,10 @@ SQL
engine_name PLUGIN_NAME engine_name PLUGIN_NAME
isolate_namespace DiscourseSolved isolate_namespace DiscourseSolved
end end
end
require_dependency "application_controller" def self.accept_answer!(post, acting_user)
class DiscourseSolved::AnswerController < ::ApplicationController
def accept
limit_accepts
post = Post.find(params[:id].to_i)
topic = post.topic topic = post.topic
guardian.ensure_can_accept_answer!(topic)
accepted_id = topic.custom_fields["accepted_answer_post_id"].to_i accepted_id = topic.custom_fields["accepted_answer_post_id"].to_i
if accepted_id > 0 if accepted_id > 0
if p2 = Post.find_by(id: accepted_id) if p2 = Post.find_by(id: accepted_id)
@ -95,13 +85,13 @@ SQL
UserAction.log_action!( UserAction.log_action!(
action_type: UserAction::SOLVED, action_type: UserAction::SOLVED,
user_id: post.user_id, user_id: post.user_id,
acting_user_id: guardian.user.id, acting_user_id: acting_user.id,
target_post_id: post.id, target_post_id: post.id,
target_topic_id: post.topic_id target_topic_id: post.topic_id
) )
end end
unless current_user.id == post.user_id unless acting_user.id == post.user_id
Notification.create!( Notification.create!(
notification_type: Notification.types[:custom], notification_type: Notification.types[:custom],
user_id: post.user_id, user_id: post.user_id,
@ -109,7 +99,7 @@ SQL
post_number: post.post_number, post_number: post.post_number,
data: { data: {
message: 'solved.accepted_notification', message: 'solved.accepted_notification',
display_username: current_user.username, display_username: acting_user.username,
topic_title: topic.title topic_title: topic.title
}.to_json }.to_json
) )
@ -126,17 +116,9 @@ SQL
end end
DiscourseEvent.trigger(:accepted_solution, post) DiscourseEvent.trigger(:accepted_solution, post)
render json: success_json
end end
def unaccept def self.unaccept_answer!(post)
limit_accepts
post = Post.find(params[:id].to_i)
guardian.ensure_can_accept_answer!(post.topic)
post.custom_fields["is_accepted_answer"] = nil post.custom_fields["is_accepted_answer"] = nil
post.topic.custom_fields["accepted_answer_post_id"] = nil post.topic.custom_fields["accepted_answer_post_id"] = nil
post.topic.save! post.topic.save!
@ -161,7 +143,32 @@ SQL
notification.destroy if notification notification.destroy if notification
DiscourseEvent.trigger(:unaccepted_solution, post) DiscourseEvent.trigger(:unaccepted_solution, post)
end
end
require_dependency "application_controller"
class DiscourseSolved::AnswerController < ::ApplicationController
def accept
limit_accepts
post = Post.find(params[:id].to_i)
guardian.ensure_can_accept_answer!(post.topic)
DiscourseSolved.accept_answer!(post, current_user)
render json: success_json
end
def unaccept
limit_accepts
post = Post.find(params[:id].to_i)
guardian.ensure_can_accept_answer!(post.topic)
DiscourseSolved.unaccept_answer!(post)
render json: success_json render json: success_json
end end
@ -432,4 +439,14 @@ SQL
CategoryList.preloaded_topic_custom_fields << "accepted_answer_post_id" CategoryList.preloaded_topic_custom_fields << "accepted_answer_post_id"
end end
on(:filter_auto_bump_topics) do |_category, filters|
filters.push(->(r) { r.where(<<~SQL)
NOT EXISTS(
SELECT 1 FROM topic_custom_fields
WHERE topic_id = topics.id
AND name = 'accepted_answer_post_id'
)
SQL
})
end
end end

View File

@ -9,6 +9,31 @@ RSpec.describe "Managing Posts solved status" do
SiteSetting.allow_solved_on_all_topics = true SiteSetting.allow_solved_on_all_topics = true
end end
describe 'auto bump' do
it 'does not automatically bump solved topics' do
category = Fabricate(:category)
post = create_post(category: category)
post2 = create_post(category: category)
DiscourseSolved.accept_answer!(post, Discourse.system_user)
category.num_auto_bump_daily = 2
category.save!
freeze_time 1.month.from_now
expect(category.auto_bump_topic!).to eq(true)
freeze_time 13.hours.from_now
expect(category.auto_bump_topic!).to eq(false)
expect(post.topic.reload.posts_count).to eq(1)
expect(post2.topic.reload.posts_count).to eq(2)
end
end
describe 'accepting a post as the answer' do describe 'accepting a post as the answer' do
before do before do
sign_in(user) sign_in(user)