Browse Source

Do not lose submitted content when attempting to update a wiki page that has been renamed in the meantime (#31334).

Patch by Jens Krämer.


git-svn-id: http://svn.redmine.org/redmine/trunk@18165 e93f8b46-1217-0410-a6f0-8f06a7374b81
tags/4.1.0
Go MAEDA 5 years ago
parent
commit
8eb5f2c605
2 changed files with 59 additions and 1 deletions
  1. 3
    1
      app/controllers/wiki_controller.rb
  2. 56
    0
      test/integration/wiki_test.rb

+ 3
- 1
app/controllers/wiki_controller.rb View File

@@ -34,7 +34,7 @@
class WikiController < ApplicationController
default_search_scope :wiki_pages
before_action :find_wiki, :authorize
before_action :find_existing_or_new_page, :only => [:show, :edit, :update]
before_action :find_existing_or_new_page, :only => [:show, :edit]
before_action :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy, :destroy_version]
before_action :find_attachments, :only => [:preview]
accept_api_auth :index, :show, :update, :destroy
@@ -152,6 +152,8 @@ class WikiController < ApplicationController

# Creates a new page or updates an existing one
def update
@page = @wiki.find_or_new_page(params[:id])

return render_403 unless editable?
was_new_page = @page.new_record?
@page.safe_attributes = params[:wiki_page]

+ 56
- 0
test/integration/wiki_test.rb View File

@@ -0,0 +1,56 @@
require File.expand_path('../../test_helper', __FILE__)

class WikiIntegrationTest < Redmine::IntegrationTest
fixtures :projects,
:users, :email_addresses,
:roles,
:members,
:member_roles,
:trackers,
:projects_trackers,
:enabled_modules,
:wikis,
:wiki_pages,
:wiki_contents

def test_updating_a_renamed_page
log_user('jsmith', 'jsmith')

get '/projects/ecookbook/wiki'
assert_response :success

get '/projects/ecookbook/wiki/Wiki/edit'
assert_response :success

# this update should not end up with a loss of content
put '/projects/ecookbook/wiki/Wiki', params: {
content: {
text: "# Wiki\r\n\r\ncontent", comments:""
},
wiki_page: { parent_id: "" }
}
assert_redirected_to "/projects/ecookbook/wiki/Wiki"
follow_redirect!
assert_select 'div', /content/
assert content = WikiContent.last

# Let's assume somebody else, or the same user in another tab, renames the
# page while it is being edited.
post '/projects/ecookbook/wiki/Wiki/rename', params: { wiki_page: { title: "NewTitle" } }
assert_redirected_to "/projects/ecookbook/wiki/NewTitle"

# this update should not end up with a loss of content
put '/projects/ecookbook/wiki/Wiki', params: {
content: {
version: content.version, text: "# Wiki\r\n\r\nnew content", comments:""
},
wiki_page: { parent_id: "" }
}

assert_redirected_to "/projects/ecookbook/wiki/NewTitle"
follow_redirect!
assert_select 'div', /new content/
end

end


Loading…
Cancel
Save