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