Skip to content

Commit 548e85e

Browse files
kfischer-okarinRedmine Patch Meetup
authored andcommitted
Add WikiRedirectsController with destroy action
1 parent 8584591 commit 548e85e

File tree

4 files changed

+119
-1
lines changed

4 files changed

+119
-1
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# frozen_string_literal: true
2+
3+
# Redmine - project management software
4+
# Copyright (C) 2006-2020 Jean-Philippe Lang
5+
#
6+
# This program is free software; you can redistribute it and/or
7+
# modify it under the terms of the GNU General Public License
8+
# as published by the Free Software Foundation; either version 2
9+
# of the License, or (at your option) any later version.
10+
#
11+
# This program is distributed in the hope that it will be useful,
12+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
# GNU General Public License for more details.
15+
#
16+
# You should have received a copy of the GNU General Public License
17+
# along with this program; if not, write to the Free Software
18+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19+
20+
class WikiRedirectsController < ApplicationController
21+
before_action :find_wiki_redirect, :authorize
22+
23+
def destroy
24+
@wiki_redirect.destroy
25+
end
26+
27+
private
28+
29+
def find_wiki_redirect
30+
@project = Project.find(params[:project_id])
31+
page = Wiki.find_page(params[:wiki_page_id], project: @project)
32+
@wiki_redirect= WikiRedirect.where(redirects_to: page.title).find(params[:id])
33+
render_404 unless @wiki_redirect
34+
rescue ActiveRecord::RecordNotFound
35+
render_404
36+
end
37+
end

config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@
191191

192192
match 'wiki/index', :controller => 'wiki', :action => 'index', :via => :get
193193
resources :wiki, :except => [:index, :create], :as => 'wiki_page' do
194+
resources :redirects, controller: 'wiki_redirects', only: :destroy
194195
member do
195196
get 'rename'
196197
post 'rename'

lib/redmine/preparation.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def self.prepare
121121
map.permission :view_wiki_edits, {:wiki => [:history, :diff, :annotate]}, :read => true
122122
map.permission :export_wiki_pages, {:wiki => [:export]}, :read => true
123123
map.permission :edit_wiki_pages, :wiki => [:new, :edit, :update, :preview, :add_attachment], :attachments => :upload
124-
map.permission :rename_wiki_pages, {:wiki => :rename}, :require => :member
124+
map.permission :rename_wiki_pages, {:wiki => :rename, :wiki_redirects => :destroy}, :require => :member
125125
map.permission :delete_wiki_pages, {:wiki => [:destroy, :destroy_version]}, :require => :member
126126
map.permission :delete_wiki_pages_attachments, {}
127127
map.permission :view_wiki_page_watchers, {}, :read => true
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# frozen_string_literal: true
2+
3+
# Redmine - project management software
4+
# Copyright (C) 2006-2020 Jean-Philippe Lang
5+
#
6+
# This program is free software; you can redistribute it and/or
7+
# modify it under the terms of the GNU General Public License
8+
# as published by the Free Software Foundation; either version 2
9+
# of the License, or (at your option) any later version.
10+
#
11+
# This program is distributed in the hope that it will be useful,
12+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
# GNU General Public License for more details.
15+
#
16+
# You should have received a copy of the GNU General Public License
17+
# along with this program; if not, write to the Free Software
18+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19+
20+
require File.expand_path('../../test_helper', __FILE__)
21+
22+
class WikiRedirectsControllerTest < Redmine::ControllerTest
23+
fixtures :projects, :users, :email_addresses, :roles, :members, :member_roles,
24+
:enabled_modules, :wikis, :wiki_pages, :wiki_contents,
25+
:wiki_content_versions, :attachments,
26+
:issues, :issue_statuses, :trackers
27+
28+
def setup
29+
User.current = nil
30+
@request.session[:user_id] = 1
31+
end
32+
33+
def test_destroy
34+
wiki_page = WikiPage.find(2)
35+
old_title = wiki_page.title
36+
wiki_page.title = 'Test'
37+
wiki_page.save
38+
39+
wiki_redirect = WikiRedirect.find_by(title: old_title, redirects_to: 'Test')
40+
41+
delete :destroy, params: {id: wiki_redirect.id, project_id: wiki_page.wiki.project_id, wiki_page_id: 'Test'}
42+
43+
assert_response :success
44+
assert_not WikiRedirect.exists?(id: wiki_redirect.id)
45+
end
46+
47+
def test_destroy_without_permission
48+
@request.session[:user_id] = User.generate!.id
49+
50+
wiki_page = WikiPage.find(2)
51+
old_title = wiki_page.title
52+
wiki_page.title = 'Test'
53+
wiki_page.save
54+
55+
wiki_redirect = WikiRedirect.find_by(title: old_title, redirects_to: 'Test')
56+
57+
delete :destroy, params: {id: wiki_redirect.id, project_id: wiki_page.wiki.project_id, wiki_page_id: 'Test'}
58+
59+
assert_response :forbidden
60+
assert WikiRedirect.exists?(id: wiki_redirect.id)
61+
end
62+
63+
def test_invalid_redirect_should_respond_with_404
64+
wiki_page = WikiPage.find(1)
65+
old_title = wiki_page.title
66+
wiki_page.title = 'New_Title'
67+
wiki_page.save
68+
69+
other_wiki_page = WikiPage.find(2)
70+
other_wiki_page.title = 'Other_New_Title'
71+
other_wiki_page.save
72+
73+
wiki_redirect = WikiRedirect.find_by(title: old_title, redirects_to: 'New_Title')
74+
75+
delete :destroy, params: {id: wiki_redirect.id, project_id: other_wiki_page.wiki.project_id, wiki_page_id: 'Other_New_Title'}
76+
77+
assert_response :not_found
78+
assert WikiRedirect.exists?(id: wiki_redirect.id)
79+
end
80+
end

0 commit comments

Comments
 (0)