]> source.dussan.org Git - redmine.git/commitdiff
Adds API response to /trackers to get the list of all available trackers (#7181).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 20 Nov 2011 14:17:43 +0000 (14:17 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 20 Nov 2011 14:17:43 +0000 (14:17 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@7877 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/application_controller.rb
app/controllers/trackers_controller.rb
app/views/trackers/index.api.rsb [new file with mode: 0644]
config/routes.rb
test/functional/trackers_controller_test.rb
test/integration/api_test/trackers_test.rb [new file with mode: 0644]

index bf05db03459dd696064acc6c90d49e3f721ccc5f..f031ac2921e0d88e90d5a5e6c3ad45e37f13daa3 100644 (file)
@@ -314,6 +314,19 @@ class ApplicationController < ActionController::Base
       format.json { head @status }
     end
   end
+  
+  # Filter for actions that provide an API response
+  # but have no HTML representation for non admin users
+  def require_admin_or_api_request
+    return true if api_request?
+    if User.current.admin?
+      true
+    elsif User.current.logged?
+      render_error(:status => 406)
+    else
+      deny_access
+    end
+  end
 
   # Picks which layout to use based on the request
   #
index 5275b32ebb7ede9f6b6771c8b9197c39a80af92f..2f827af2e22a0296a4ec0d95640ed962a53a74b3 100644 (file)
 class TrackersController < ApplicationController
   layout 'admin'
 
-  before_filter :require_admin
+  before_filter :require_admin, :except => :index
+  before_filter :require_admin_or_api_request, :only => :index
+  accept_api_auth :index
 
   verify :method => :post, :only => :destroy, :redirect_to => { :action => :index }
 
   def index
-    @tracker_pages, @trackers = paginate :trackers, :per_page => 10, :order => 'position'
-    render :action => "index", :layout => false if request.xhr?
+    respond_to do |format|
+      format.html {
+        @tracker_pages, @trackers = paginate :trackers, :per_page => 10, :order => 'position'
+        render :action => "index", :layout => false if request.xhr?
+      }
+      format.api {
+        @trackers = Tracker.all
+      }
+    end
   end
 
   def new
diff --git a/app/views/trackers/index.api.rsb b/app/views/trackers/index.api.rsb
new file mode 100644 (file)
index 0000000..a37c552
--- /dev/null
@@ -0,0 +1,8 @@
+api.array :trackers do
+  @trackers.each do |tracker|
+    api.tracker do
+      api.id tracker.id
+      api.name tracker.name
+    end
+  end
+end
index f5814e0accd45b295712f82c7b2ff737e44a3ac9..209db1e893b27562d232505bf626939e16700940 100644 (file)
@@ -227,6 +227,7 @@ ActionController::Routing::Routes.draw do |map|
   map.resources :groups
 
   #left old routes at the bottom for backwards compat
+  map.connect 'trackers.:format', :controller => 'trackers', :action => 'index'
   map.connect 'projects/:project_id/issues/:action', :controller => 'issues'
   map.connect 'projects/:project_id/documents/:action', :controller => 'documents'
   map.connect 'projects/:project_id/boards/:action/:id', :controller => 'boards'
index 63498303fc7fc59df789fad7a97961d67217f4c7..4d9b228f146383bf0b17100b3fdaf6935658feea 100644 (file)
@@ -37,6 +37,18 @@ class TrackersControllerTest < ActionController::TestCase
     assert_response :success
     assert_template 'index'
   end
+  
+  def test_index_by_anonymous_should_redirect_to_login_form
+    @request.session[:user_id] = nil
+    get :index
+    assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Ftrackers'
+  end
+  
+  def test_index_by_user_should_respond_with_406
+    @request.session[:user_id] = 2
+    get :index
+    assert_response 406
+  end
 
   def test_get_new
     get :new
diff --git a/test/integration/api_test/trackers_test.rb b/test/integration/api_test/trackers_test.rb
new file mode 100644 (file)
index 0000000..9a92fcc
--- /dev/null
@@ -0,0 +1,51 @@
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+require File.expand_path('../../../test_helper', __FILE__)
+
+class ApiTest::TrackersTest < ActionController::IntegrationTest
+  fixtures :trackers
+
+  def setup
+    Setting.rest_api_enabled = '1'
+  end
+
+  context "/trackers" do
+    context "GET" do
+
+      should "return trackers" do
+        get '/trackers.xml'
+
+        assert_response :success
+        assert_equal 'application/xml', @response.content_type
+        assert_tag :tag => 'trackers',
+          :attributes => {:type => 'array'},
+          :child => {
+            :tag => 'tracker',
+            :child => {
+              :tag => 'id',
+              :content => '2',
+              :sibling => {
+                :tag => 'name',
+                :content => 'Feature request'
+              }
+            }
+          }
+      end
+    end
+  end
+end