forked from e621ng/e621ng
[WikiPages] Prevent renaming wiki pages for help pages (#666)
This commit is contained in:
parent
1425332c0b
commit
80f12710e6
@ -7,6 +7,7 @@ class HelpPage < ApplicationRecord
|
||||
validate :wiki_page_exists
|
||||
after_destroy :invalidate_cache
|
||||
after_save :invalidate_cache
|
||||
belongs_to :wiki, class_name: "WikiPage", foreign_key: "wiki_page", primary_key: "title"
|
||||
|
||||
def invalidate_cache
|
||||
Cache.delete("help_index")
|
||||
@ -14,7 +15,7 @@ class HelpPage < ApplicationRecord
|
||||
end
|
||||
|
||||
def wiki_page_exists
|
||||
errors.add(:wiki_page, "must exist") if WikiPage.find_by(title: wiki_page).blank?
|
||||
errors.add(:wiki_page, "must exist") if wiki.blank?
|
||||
end
|
||||
|
||||
def pretty_title
|
||||
|
@ -19,6 +19,7 @@ class WikiPage < ApplicationRecord
|
||||
before_destroy :validate_not_used_as_help_page
|
||||
before_destroy :log_destroy
|
||||
before_save :log_changes
|
||||
after_save :update_help_page, if: :saved_change_to_title?
|
||||
|
||||
attr_accessor :skip_secondary_validations, :edit_reason
|
||||
array_attribute :other_names
|
||||
@ -27,13 +28,7 @@ class WikiPage < ApplicationRecord
|
||||
has_one :tag, foreign_key: "name", primary_key: "title"
|
||||
has_one :artist, foreign_key: "name", primary_key: "title"
|
||||
has_many :versions, -> { order("wiki_page_versions.id ASC") }, class_name: "WikiPageVersion", dependent: :destroy
|
||||
|
||||
def validate_not_used_as_help_page
|
||||
if HelpPage.find_by(wiki_page: title).present?
|
||||
errors.add(:wiki_page, "is used by a help page")
|
||||
throw :abort
|
||||
end
|
||||
end
|
||||
has_one :help_page, foreign_key: "wiki_page", primary_key: "title"
|
||||
|
||||
def log_destroy
|
||||
ModAction.log(:wiki_page_delete, {wiki_page: title, wiki_page_id: id})
|
||||
@ -127,8 +122,22 @@ class WikiPage < ApplicationRecord
|
||||
end
|
||||
end
|
||||
|
||||
module HelpPageMethods
|
||||
def validate_not_used_as_help_page
|
||||
if help_page.present?
|
||||
errors.add(:wiki_page, "is used by a help page")
|
||||
throw :abort
|
||||
end
|
||||
end
|
||||
|
||||
def update_help_page
|
||||
HelpPage.find_by(wiki_page: title_before_last_save)&.update(wiki_page: title)
|
||||
end
|
||||
end
|
||||
|
||||
extend SearchMethods
|
||||
include ApiMethods
|
||||
include HelpPageMethods
|
||||
|
||||
def user_not_limited
|
||||
allowed = CurrentUser.can_wiki_edit_with_reason
|
||||
@ -147,7 +156,12 @@ class WikiPage < ApplicationRecord
|
||||
end
|
||||
|
||||
def validate_rename
|
||||
return if !will_save_change_to_title? || skip_secondary_validations
|
||||
return unless will_save_change_to_title?
|
||||
if !CurrentUser.user.is_admin? && HelpPage.find_by(wiki_page: title_was).present?
|
||||
errors.add(:title, "is used as a help page and cannot be changed")
|
||||
return
|
||||
end
|
||||
return if skip_secondary_validations
|
||||
|
||||
tag_was = Tag.find_by_name(Tag.normalize_name(title_was))
|
||||
if tag_was.present? && tag_was.post_count > 0
|
||||
|
8
test/factories/help_page.rb
Normal file
8
test/factories/help_page.rb
Normal file
@ -0,0 +1,8 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
FactoryBot.define do
|
||||
factory(:help_page) do
|
||||
sequence(:name) { |n| "help_page_#{n}" }
|
||||
association :wiki, factory: :wiki_page
|
||||
end
|
||||
end
|
@ -97,5 +97,43 @@ class WikiPageTest < ActiveSupport::TestCase
|
||||
assert_not_equal(@wiki_page.creator_id, version.updater_id)
|
||||
end
|
||||
end
|
||||
|
||||
context "for a help page" do
|
||||
setup do
|
||||
@janitor = create(:janitor_user)
|
||||
@admin = create(:admin_user)
|
||||
as(@admin) do
|
||||
@help = create(:help_page)
|
||||
@wiki = @help.wiki
|
||||
end
|
||||
end
|
||||
|
||||
should "not allow the title to be changed by janitors" do
|
||||
as(@janitor) do
|
||||
@title = @wiki.title
|
||||
@wiki.update(title: "new_title")
|
||||
assert_equal(["Title is used as a help page and cannot be changed"], @wiki.errors.full_messages)
|
||||
assert_equal(@title, @wiki.reload.title)
|
||||
assert_equal(@title, @help.reload.wiki_page)
|
||||
end
|
||||
end
|
||||
|
||||
should "allow the title to be changed by admins" do
|
||||
as(@admin) do
|
||||
@wiki.update(title: "new_title")
|
||||
assert_equal([], @wiki.errors.full_messages)
|
||||
assert_equal("new_title", @wiki.reload.title)
|
||||
assert_equal("new_title", @help.reload.wiki_page)
|
||||
end
|
||||
end
|
||||
|
||||
should "not allow deleting the wiki page" do
|
||||
as(@admin) do
|
||||
@wiki.destroy
|
||||
assert_equal(["Wiki page is used by a help page"], @wiki.errors.full_messages)
|
||||
assert_not_nil(WikiPage.find_by(id: @wiki.id))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user