summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2012-10-17 17:29:27 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2012-10-17 17:29:27 +0000
commitd62b90db7327be488007d382f84c469f9fbe4ffe (patch)
tree153cfe41553b040154ecc89605b797864a76f3c1
parentfcb22595d0e87a2d04fb0210c775efdab6cfffa6 (diff)
downloadredmine-d62b90db7327be488007d382f84c469f9fbe4ffe.tar.gz
redmine-d62b90db7327be488007d382f84c469f9fbe4ffe.zip
Makes enumerations available through the REST API.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10664 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/controllers/enumerations_controller.rb19
-rw-r--r--app/models/enumeration.rb1
-rw-r--r--app/views/enumerations/index.api.rsb9
-rw-r--r--config/routes.rb3
-rw-r--r--lib/redmine/subclass_factory.rb9
-rw-r--r--test/functional/enumerations_controller_test.rb10
-rw-r--r--test/integration/api_test/enumerations_test.rb44
-rw-r--r--test/integration/routing/enumerations_test.rb4
8 files changed, 91 insertions, 8 deletions
diff --git a/app/controllers/enumerations_controller.rb b/app/controllers/enumerations_controller.rb
index 73a6ebd79..6eddff738 100644
--- a/app/controllers/enumerations_controller.rb
+++ b/app/controllers/enumerations_controller.rb
@@ -18,13 +18,26 @@
class EnumerationsController < ApplicationController
layout 'admin'
- before_filter :require_admin
+ before_filter :require_admin, :except => :index
+ before_filter :require_admin_or_api_request, :only => :index
before_filter :build_new_enumeration, :only => [:new, :create]
before_filter :find_enumeration, :only => [:edit, :update, :destroy]
+ accept_api_auth :index
helper :custom_fields
def index
+ respond_to do |format|
+ format.html
+ format.api {
+ @klass = Enumeration.get_subclass(params[:type])
+ if @klass
+ @enumerations = @klass.shared.sorted.all
+ else
+ render_404
+ end
+ }
+ end
end
def new
@@ -33,7 +46,7 @@ class EnumerationsController < ApplicationController
def create
if request.post? && @enumeration.save
flash[:notice] = l(:notice_successful_create)
- redirect_to :action => 'index', :type => @enumeration.type
+ redirect_to :action => 'index'
else
render :action => 'new'
end
@@ -45,7 +58,7 @@ class EnumerationsController < ApplicationController
def update
if request.put? && @enumeration.update_attributes(params[:enumeration])
flash[:notice] = l(:notice_successful_update)
- redirect_to :action => 'index', :type => @enumeration.type
+ redirect_to :action => 'index'
else
render :action => 'edit'
end
diff --git a/app/models/enumeration.rb b/app/models/enumeration.rb
index d4564a036..d3454021f 100644
--- a/app/models/enumeration.rb
+++ b/app/models/enumeration.rb
@@ -36,6 +36,7 @@ class Enumeration < ActiveRecord::Base
validates_length_of :name, :maximum => 30
scope :shared, where(:project_id => nil)
+ scope :sorted, order("#{table_name}.position ASC")
scope :active, where(:active => true)
scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}
diff --git a/app/views/enumerations/index.api.rsb b/app/views/enumerations/index.api.rsb
new file mode 100644
index 000000000..2fc70b987
--- /dev/null
+++ b/app/views/enumerations/index.api.rsb
@@ -0,0 +1,9 @@
+api.array @klass.name.underscore.pluralize do
+ @enumerations.each do |enumeration|
+ api.__send__ @klass.name.underscore do
+ api.id enumeration.id
+ api.name enumeration.name
+ api.is_default enumeration.is_default
+ end
+ end
+end
diff --git a/config/routes.rb b/config/routes.rb
index 61a580097..63f779a16 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -98,7 +98,7 @@ RedmineApp::Application.routes.draw do
match 'copy', :via => [:get, :post]
end
- resources :memberships, :shallow => true, :controller => 'members', :only => [:index, :show, :create, :update, :destroy] do
+ resources :memberships, :shallow => true, :controller => 'members', :only => [:index, :show, :new, :create, :update, :destroy] do
collection do
get 'autocomplete'
end
@@ -295,6 +295,7 @@ RedmineApp::Application.routes.draw do
end
end
resources :enumerations, :except => :show
+ match 'enumerations/:type', :to => 'enumerations#index', :via => :get
get 'projects/:id/search', :controller => 'search', :action => 'index'
get 'search', :controller => 'search', :action => 'index'
diff --git a/lib/redmine/subclass_factory.rb b/lib/redmine/subclass_factory.rb
index a77026993..c494cdf35 100644
--- a/lib/redmine/subclass_factory.rb
+++ b/lib/redmine/subclass_factory.rb
@@ -22,8 +22,7 @@ module Redmine
end
module ClassMethods
- # Returns an instance of the given subclass name
- def new_subclass_instance(class_name, *args)
+ def get_subclass(class_name)
klass = nil
begin
klass = class_name.to_s.classify.constantize
@@ -33,6 +32,12 @@ module Redmine
unless subclasses.include? klass
klass = nil
end
+ klass
+ end
+
+ # Returns an instance of the given subclass name
+ def new_subclass_instance(class_name, *args)
+ klass = get_subclass(class_name)
if klass
klass.new(*args)
end
diff --git a/test/functional/enumerations_controller_test.rb b/test/functional/enumerations_controller_test.rb
index b13fc86f7..dba0720d6 100644
--- a/test/functional/enumerations_controller_test.rb
+++ b/test/functional/enumerations_controller_test.rb
@@ -30,6 +30,12 @@ class EnumerationsControllerTest < ActionController::TestCase
assert_template 'index'
end
+ def test_index_should_require_admin
+ @request.session[:user_id] = nil
+ get :index
+ assert_response 302
+ end
+
def test_new
get :new, :type => 'IssuePriority'
assert_response :success
@@ -48,7 +54,7 @@ class EnumerationsControllerTest < ActionController::TestCase
assert_difference 'IssuePriority.count' do
post :create, :enumeration => {:type => 'IssuePriority', :name => 'Lowest'}
end
- assert_redirected_to '/enumerations?type=IssuePriority'
+ assert_redirected_to '/enumerations'
e = IssuePriority.find_by_name('Lowest')
assert_not_nil e
end
@@ -77,7 +83,7 @@ class EnumerationsControllerTest < ActionController::TestCase
assert_no_difference 'IssuePriority.count' do
put :update, :id => 6, :enumeration => {:type => 'IssuePriority', :name => 'New name'}
end
- assert_redirected_to '/enumerations?type=IssuePriority'
+ assert_redirected_to '/enumerations'
e = IssuePriority.find(6)
assert_equal 'New name', e.name
end
diff --git a/test/integration/api_test/enumerations_test.rb b/test/integration/api_test/enumerations_test.rb
new file mode 100644
index 000000000..fa315596d
--- /dev/null
+++ b/test/integration/api_test/enumerations_test.rb
@@ -0,0 +1,44 @@
+# Redmine - project management software
+# Copyright (C) 2006-2012 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::EnumerationsTest < ActionController::IntegrationTest
+ fixtures :enumerations
+
+ def setup
+ Setting.rest_api_enabled = '1'
+ end
+
+ context "/enumerations/issue_priorities" do
+ context "GET" do
+
+ should "return priorities" do
+ get '/enumerations/issue_priorities.xml'
+
+ assert_response :success
+ assert_equal 'application/xml', response.content_type
+ assert_select 'issue_priorities[type=array]' do
+ assert_select 'issue_priority' do
+ assert_select 'id', :text => '6'
+ assert_select 'name', :text => 'High'
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/test/integration/routing/enumerations_test.rb b/test/integration/routing/enumerations_test.rb
index f9597205c..8f17f23ce 100644
--- a/test/integration/routing/enumerations_test.rb
+++ b/test/integration/routing/enumerations_test.rb
@@ -43,5 +43,9 @@ class RoutingEnumerationsTest < ActionController::IntegrationTest
{ :method => 'delete', :path => "/enumerations/2" },
{ :controller => 'enumerations', :action => 'destroy', :id => '2' }
)
+ assert_routing(
+ { :method => 'get', :path => "/enumerations/issue_priorities.xml" },
+ { :controller => 'enumerations', :action => 'index', :type => 'issue_priorities', :format => 'xml' }
+ )
end
end