diff --git a/app/models/post.rb b/app/models/post.rb index 135ba0654..93944b4a9 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -791,7 +791,7 @@ class Post < ApplicationRecord def filter_metatags(tags) @pre_metatags, tags = tags.partition {|x| x =~ /\A(?:rating|parent|-parent|-?locked):/i} tags = apply_categorization_metatags(tags) - @post_metatags, tags = tags.partition {|x| x =~ /\A(?:-pool|pool|newpool|fav|-fav|child|-favgroup|favgroup|upvote|downvote):/i} + @post_metatags, tags = tags.partition {|x| x =~ /\A(?:-pool|pool|newpool|fav|-fav|child|-child|-favgroup|favgroup|upvote|downvote):/i} apply_pre_metatags return tags end @@ -841,10 +841,20 @@ class Post < ApplicationRecord when /^(up|down)vote:(.+)$/i vote!($1) + when /^child:none$/i + children.each do |post| + post.update!(parent_id: nil) + end + + when /^-child:(.+)$/i + children.numeric_attribute_matches(:id, $1).each do |post| + post.update!(parent_id: nil) + end + when /^child:(.+)$/i - child = Post.find($1) - child.parent_id = id - child.save + Post.numeric_attribute_matches(:id, $1).where.not(id: id).limit(10).each do |post| + post.update!(parent_id: id) + end when /^-favgroup:(\d+)$/i favgroup = FavoriteGroup.where("id = ?", $1.to_i).for_creator(CurrentUser.user.id).first diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index d2bdadc3a..91e41a302 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -954,16 +954,26 @@ class PostTest < ActiveSupport::TestCase end context "for a child" do - setup do - @child = FactoryBot.create(:post) - end + should "add and remove children" do + @children = FactoryBot.create_list(:post, 3, parent_id: nil) - should "update the parent relationships for both posts" do - @post.update_attributes(:tag_string => "aaa child:#{@child.id}") - @post.reload - @child.reload - assert_equal(@post.id, @child.parent_id) - assert(@post.has_children?) + @post.update(tag_string: "aaa child:#{@children.first.id}..#{@children.last.id}") + assert_equal(true, @post.reload.has_children?) + assert_equal(@post.id, @children[0].reload.parent_id) + assert_equal(@post.id, @children[1].reload.parent_id) + assert_equal(@post.id, @children[2].reload.parent_id) + + @post.update(tag_string: "aaa -child:#{@children.first.id}") + assert_equal(true, @post.reload.has_children?) + assert_nil(@children[0].reload.parent_id) + assert_equal(@post.id, @children[1].reload.parent_id) + assert_equal(@post.id, @children[2].reload.parent_id) + + @post.update(tag_string: "aaa child:none") + assert_equal(false, @post.reload.has_children?) + assert_nil(@children[0].reload.parent_id) + assert_nil(@children[1].reload.parent_id) + assert_nil(@children[2].reload.parent_id) end end