##// END OF EJS Templates
REST API for retrieving wiki pages (#7082)....
Jean-Philippe Lang -
r10504:9e3130872057
parent child
Show More
@@ -0,0 +1,13
1 api.array :wiki_pages do
2 @pages.each do |page|
3 api.wiki_page do
4 api.title page.title
5 if page.parent
6 api.parent :title => page.parent.title
7 end
8 api.version page.version
9 api.created_on page.created_on
10 api.updated_on page.updated_on
11 end
12 end
13 end
@@ -0,0 +1,11
1 api.wiki_page do
2 api.title @page.title
3 if @page.parent
4 api.parent :title => @page.parent.title
5 end
6 api.text @content.text
7 api.version @content.version
8 api.author(:id => @content.author_id, :name => @content.author.name)
9 api.created_on @page.created_on
10 api.updated_on @content.updated_on
11 end
@@ -0,0 +1,85
1 # Redmine - project management software
2 # Copyright (C) 2006-2012 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 require File.expand_path('../../../test_helper', __FILE__)
19
20 class ApiTest::WikiPagesTest < ActionController::IntegrationTest
21 fixtures :projects, :users, :roles, :members, :member_roles,
22 :enabled_modules, :wikis, :wiki_pages, :wiki_contents,
23 :wiki_content_versions, :attachments
24
25 def setup
26 Setting.rest_api_enabled = '1'
27 end
28
29 test "GET /projects/:project_id/wiki/index.xml should return wiki pages" do
30 get '/projects/ecookbook/wiki/index.xml'
31 assert_response :success
32 assert_equal 'application/xml', response.content_type
33 assert_select 'wiki_pages[type=array]' do
34 assert_select 'wiki_page', :count => Wiki.find(1).pages.count
35 assert_select 'wiki_page' do
36 assert_select 'title', :text => 'CookBook_documentation'
37 assert_select 'version', :text => '3'
38 assert_select 'created_on'
39 assert_select 'updated_on'
40 end
41 end
42 end
43
44 test "GET /projects/:project_id/wiki/:title.xml should return wiki page" do
45 get '/projects/ecookbook/wiki/CookBook_documentation.xml'
46 assert_response :success
47 assert_equal 'application/xml', response.content_type
48 assert_select 'wiki_page' do
49 assert_select 'title', :text => 'CookBook_documentation'
50 assert_select 'version', :text => '3'
51 assert_select 'text'
52 assert_select 'author'
53 assert_select 'created_on'
54 assert_select 'updated_on'
55 end
56 end
57
58 test "GET /projects/:project_id/wiki/:title.xml with unknown title and edit permission should respond with 404" do
59 get '/projects/ecookbook/wiki/Invalid_Page.xml', {}, credentials('jsmith')
60 assert_response 404
61 assert_equal 'application/xml', response.content_type
62 end
63
64 test "GET /projects/:project_id/wiki/:title/:version.xml should return wiki page version" do
65 get '/projects/ecookbook/wiki/CookBook_documentation/2.xml'
66 assert_response :success
67 assert_equal 'application/xml', response.content_type
68 assert_select 'wiki_page' do
69 assert_select 'title', :text => 'CookBook_documentation'
70 assert_select 'version', :text => '2'
71 assert_select 'text'
72 assert_select 'author'
73 assert_select 'created_on'
74 assert_select 'updated_on'
75 end
76 end
77
78 test "GET /projects/:project_id/wiki/:title/:version.xml without permission should be denied" do
79 Role.anonymous.remove_permission! :view_wiki_edits
80
81 get '/projects/ecookbook/wiki/CookBook_documentation/2.xml'
82 assert_response 401
83 assert_equal 'application/xml', response.content_type
84 end
85 end
@@ -36,6 +36,7 class WikiController < ApplicationController
36 before_filter :find_wiki, :authorize
36 before_filter :find_wiki, :authorize
37 before_filter :find_existing_or_new_page, :only => [:show, :edit, :update]
37 before_filter :find_existing_or_new_page, :only => [:show, :edit, :update]
38 before_filter :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy, :destroy_version]
38 before_filter :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy, :destroy_version]
39 accept_api_auth :index, :show
39
40
40 helper :attachments
41 helper :attachments
41 include AttachmentsHelper
42 include AttachmentsHelper
@@ -45,7 +46,13 class WikiController < ApplicationController
45 # List of pages, sorted alphabetically and by parent (hierarchy)
46 # List of pages, sorted alphabetically and by parent (hierarchy)
46 def index
47 def index
47 load_pages_for_index
48 load_pages_for_index
48 @pages_by_parent_id = @pages.group_by(&:parent_id)
49
50 respond_to do |format|
51 format.html {
52 @pages_by_parent_id = @pages.group_by(&:parent_id)
53 }
54 format.api
55 end
49 end
56 end
50
57
51 # List of page, by last update
58 # List of page, by last update
@@ -57,7 +64,7 class WikiController < ApplicationController
57 # display a page (in editing mode if it doesn't exist)
64 # display a page (in editing mode if it doesn't exist)
58 def show
65 def show
59 if @page.new_record?
66 if @page.new_record?
60 if User.current.allowed_to?(:edit_wiki_pages, @project) && editable?
67 if User.current.allowed_to?(:edit_wiki_pages, @project) && editable? && !api_request?
61 edit
68 edit
62 render :action => 'edit'
69 render :action => 'edit'
63 else
70 else
@@ -66,8 +73,7 class WikiController < ApplicationController
66 return
73 return
67 end
74 end
68 if params[:version] && !User.current.allowed_to?(:view_wiki_edits, @project)
75 if params[:version] && !User.current.allowed_to?(:view_wiki_edits, @project)
69 # Redirects user to the current version if he's not allowed to view previous versions
76 deny_access
70 redirect_to :version => nil
71 return
77 return
72 end
78 end
73 @content = @page.content_for_version(params[:version])
79 @content = @page.content_for_version(params[:version])
@@ -89,7 +95,10 class WikiController < ApplicationController
89 @content.current_version? &&
95 @content.current_version? &&
90 Redmine::WikiFormatting.supports_section_edit?
96 Redmine::WikiFormatting.supports_section_edit?
91
97
92 render :action => 'show'
98 respond_to do |format|
99 format.html
100 format.api
101 end
93 end
102 end
94
103
95 # edit an existing page or a new one
104 # edit an existing page or a new one
@@ -321,6 +330,6 private
321 end
330 end
322
331
323 def load_pages_for_index
332 def load_pages_for_index
324 @pages = @wiki.pages.with_updated_on.all(:order => 'title', :include => {:wiki => :project})
333 @pages = @wiki.pages.with_updated_on.order("#{WikiPage.table_name}.title").includes(:wiki => :project).includes(:parent).all
325 end
334 end
326 end
335 end
@@ -50,7 +50,7 class WikiPage < ActiveRecord::Base
50
50
51 # eager load information about last updates, without loading text
51 # eager load information about last updates, without loading text
52 scope :with_updated_on, {
52 scope :with_updated_on, {
53 :select => "#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on",
53 :select => "#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on, #{WikiContent.table_name}.version",
54 :joins => "LEFT JOIN #{WikiContent.table_name} ON #{WikiContent.table_name}.page_id = #{WikiPage.table_name}.id"
54 :joins => "LEFT JOIN #{WikiContent.table_name} ON #{WikiContent.table_name}.page_id = #{WikiPage.table_name}.id"
55 }
55 }
56
56
@@ -75,6 +75,13 class WikiControllerTest < ActionController::TestCase
75 assert_select 'a[href=?]', '/projects/ecookbook/wiki/CookBook_documentation', :text => /Current version/
75 assert_select 'a[href=?]', '/projects/ecookbook/wiki/CookBook_documentation', :text => /Current version/
76 end
76 end
77
77
78 def test_show_old_version_without_permission_should_be_denied
79 Role.anonymous.remove_permission! :view_wiki_edits
80
81 get :show, :project_id => 'ecookbook', :id => 'CookBook_documentation', :version => '2'
82 assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Fprojects%2Fecookbook%2Fwiki%2FCookBook_documentation%2F2'
83 end
84
78 def test_show_first_version
85 def test_show_first_version
79 get :show, :project_id => 'ecookbook', :id => 'CookBook_documentation', :version => '1'
86 get :show, :project_id => 'ecookbook', :id => 'CookBook_documentation', :version => '1'
80 assert_response :success
87 assert_response :success
@@ -34,6 +34,16 class RoutingWikiTest < ActionController::IntegrationTest
34 :id => 'lalala', :format => 'pdf' }
34 :id => 'lalala', :format => 'pdf' }
35 )
35 )
36 assert_routing(
36 assert_routing(
37 { :method => 'get', :path => "/projects/567/wiki/lalala.xml" },
38 { :controller => 'wiki', :action => 'show', :project_id => '567',
39 :id => 'lalala', :format => 'xml' }
40 )
41 assert_routing(
42 { :method => 'get', :path => "/projects/567/wiki/lalala.json" },
43 { :controller => 'wiki', :action => 'show', :project_id => '567',
44 :id => 'lalala', :format => 'json' }
45 )
46 assert_routing(
37 { :method => 'get', :path => "/projects/1/wiki/CookBook_documentation/diff" },
47 { :method => 'get', :path => "/projects/1/wiki/CookBook_documentation/diff" },
38 { :controller => 'wiki', :action => 'diff', :project_id => '1',
48 { :controller => 'wiki', :action => 'diff', :project_id => '1',
39 :id => 'CookBook_documentation' }
49 :id => 'CookBook_documentation' }
@@ -44,6 +54,16 class RoutingWikiTest < ActionController::IntegrationTest
44 :id => 'CookBook_documentation', :version => '2' }
54 :id => 'CookBook_documentation', :version => '2' }
45 )
55 )
46 assert_routing(
56 assert_routing(
57 { :method => 'get', :path => "/projects/1/wiki/CookBook_documentation/2.xml" },
58 { :controller => 'wiki', :action => 'show', :project_id => '1',
59 :id => 'CookBook_documentation', :version => '2', :format => 'xml' }
60 )
61 assert_routing(
62 { :method => 'get', :path => "/projects/1/wiki/CookBook_documentation/2.json" },
63 { :controller => 'wiki', :action => 'show', :project_id => '1',
64 :id => 'CookBook_documentation', :version => '2', :format => 'json' }
65 )
66 assert_routing(
47 { :method => 'get', :path => "/projects/1/wiki/CookBook_documentation/2/diff" },
67 { :method => 'get', :path => "/projects/1/wiki/CookBook_documentation/2/diff" },
48 { :controller => 'wiki', :action => 'diff', :project_id => '1',
68 { :controller => 'wiki', :action => 'diff', :project_id => '1',
49 :id => 'CookBook_documentation', :version => '2' }
69 :id => 'CookBook_documentation', :version => '2' }
@@ -72,6 +92,14 class RoutingWikiTest < ActionController::IntegrationTest
72 { :method => 'get', :path => "/projects/567/wiki/index" },
92 { :method => 'get', :path => "/projects/567/wiki/index" },
73 { :controller => 'wiki', :action => 'index', :project_id => '567' }
93 { :controller => 'wiki', :action => 'index', :project_id => '567' }
74 )
94 )
95 assert_routing(
96 { :method => 'get', :path => "/projects/567/wiki/index.xml" },
97 { :controller => 'wiki', :action => 'index', :project_id => '567', :format => 'xml' }
98 )
99 assert_routing(
100 { :method => 'get', :path => "/projects/567/wiki/index.json" },
101 { :controller => 'wiki', :action => 'index', :project_id => '567', :format => 'json' }
102 )
75 end
103 end
76
104
77 def test_wiki_resources
105 def test_wiki_resources
@@ -130,6 +130,7 class WikiPageTest < ActiveSupport::TestCase
130 assert_not_nil page.read_attribute(:updated_on)
130 assert_not_nil page.read_attribute(:updated_on)
131 assert_equal Time.gm(2007, 3, 6, 23, 10, 51), page.content.updated_on
131 assert_equal Time.gm(2007, 3, 6, 23, 10, 51), page.content.updated_on
132 assert_equal page.content.updated_on, page.updated_on
132 assert_equal page.content.updated_on, page.updated_on
133 assert_not_nil page.read_attribute(:version)
133 end
134 end
134
135
135 def test_descendants
136 def test_descendants
General Comments 0
You need to be logged in to leave comments. Login now