Makes enumerations available through the REST API.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10664 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
fcb22595d0
commit
d62b90db73
|
@ -18,13 +18,26 @@
|
||||||
class EnumerationsController < ApplicationController
|
class EnumerationsController < ApplicationController
|
||||||
layout 'admin'
|
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 :build_new_enumeration, :only => [:new, :create]
|
||||||
before_filter :find_enumeration, :only => [:edit, :update, :destroy]
|
before_filter :find_enumeration, :only => [:edit, :update, :destroy]
|
||||||
|
accept_api_auth :index
|
||||||
|
|
||||||
helper :custom_fields
|
helper :custom_fields
|
||||||
|
|
||||||
def index
|
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
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
|
@ -33,7 +46,7 @@ class EnumerationsController < ApplicationController
|
||||||
def create
|
def create
|
||||||
if request.post? && @enumeration.save
|
if request.post? && @enumeration.save
|
||||||
flash[:notice] = l(:notice_successful_create)
|
flash[:notice] = l(:notice_successful_create)
|
||||||
redirect_to :action => 'index', :type => @enumeration.type
|
redirect_to :action => 'index'
|
||||||
else
|
else
|
||||||
render :action => 'new'
|
render :action => 'new'
|
||||||
end
|
end
|
||||||
|
@ -45,7 +58,7 @@ class EnumerationsController < ApplicationController
|
||||||
def update
|
def update
|
||||||
if request.put? && @enumeration.update_attributes(params[:enumeration])
|
if request.put? && @enumeration.update_attributes(params[:enumeration])
|
||||||
flash[:notice] = l(:notice_successful_update)
|
flash[:notice] = l(:notice_successful_update)
|
||||||
redirect_to :action => 'index', :type => @enumeration.type
|
redirect_to :action => 'index'
|
||||||
else
|
else
|
||||||
render :action => 'edit'
|
render :action => 'edit'
|
||||||
end
|
end
|
||||||
|
|
|
@ -36,6 +36,7 @@ class Enumeration < ActiveRecord::Base
|
||||||
validates_length_of :name, :maximum => 30
|
validates_length_of :name, :maximum => 30
|
||||||
|
|
||||||
scope :shared, where(:project_id => nil)
|
scope :shared, where(:project_id => nil)
|
||||||
|
scope :sorted, order("#{table_name}.position ASC")
|
||||||
scope :active, where(:active => true)
|
scope :active, where(:active => true)
|
||||||
scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}
|
scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
@ -98,7 +98,7 @@ RedmineApp::Application.routes.draw do
|
||||||
match 'copy', :via => [:get, :post]
|
match 'copy', :via => [:get, :post]
|
||||||
end
|
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
|
collection do
|
||||||
get 'autocomplete'
|
get 'autocomplete'
|
||||||
end
|
end
|
||||||
|
@ -295,6 +295,7 @@ RedmineApp::Application.routes.draw do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
resources :enumerations, :except => :show
|
resources :enumerations, :except => :show
|
||||||
|
match 'enumerations/:type', :to => 'enumerations#index', :via => :get
|
||||||
|
|
||||||
get 'projects/:id/search', :controller => 'search', :action => 'index'
|
get 'projects/:id/search', :controller => 'search', :action => 'index'
|
||||||
get 'search', :controller => 'search', :action => 'index'
|
get 'search', :controller => 'search', :action => 'index'
|
||||||
|
|
|
@ -22,8 +22,7 @@ module Redmine
|
||||||
end
|
end
|
||||||
|
|
||||||
module ClassMethods
|
module ClassMethods
|
||||||
# Returns an instance of the given subclass name
|
def get_subclass(class_name)
|
||||||
def new_subclass_instance(class_name, *args)
|
|
||||||
klass = nil
|
klass = nil
|
||||||
begin
|
begin
|
||||||
klass = class_name.to_s.classify.constantize
|
klass = class_name.to_s.classify.constantize
|
||||||
|
@ -33,6 +32,12 @@ module Redmine
|
||||||
unless subclasses.include? klass
|
unless subclasses.include? klass
|
||||||
klass = nil
|
klass = nil
|
||||||
end
|
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
|
if klass
|
||||||
klass.new(*args)
|
klass.new(*args)
|
||||||
end
|
end
|
||||||
|
|
|
@ -30,6 +30,12 @@ class EnumerationsControllerTest < ActionController::TestCase
|
||||||
assert_template 'index'
|
assert_template 'index'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_index_should_require_admin
|
||||||
|
@request.session[:user_id] = nil
|
||||||
|
get :index
|
||||||
|
assert_response 302
|
||||||
|
end
|
||||||
|
|
||||||
def test_new
|
def test_new
|
||||||
get :new, :type => 'IssuePriority'
|
get :new, :type => 'IssuePriority'
|
||||||
assert_response :success
|
assert_response :success
|
||||||
|
@ -48,7 +54,7 @@ class EnumerationsControllerTest < ActionController::TestCase
|
||||||
assert_difference 'IssuePriority.count' do
|
assert_difference 'IssuePriority.count' do
|
||||||
post :create, :enumeration => {:type => 'IssuePriority', :name => 'Lowest'}
|
post :create, :enumeration => {:type => 'IssuePriority', :name => 'Lowest'}
|
||||||
end
|
end
|
||||||
assert_redirected_to '/enumerations?type=IssuePriority'
|
assert_redirected_to '/enumerations'
|
||||||
e = IssuePriority.find_by_name('Lowest')
|
e = IssuePriority.find_by_name('Lowest')
|
||||||
assert_not_nil e
|
assert_not_nil e
|
||||||
end
|
end
|
||||||
|
@ -77,7 +83,7 @@ class EnumerationsControllerTest < ActionController::TestCase
|
||||||
assert_no_difference 'IssuePriority.count' do
|
assert_no_difference 'IssuePriority.count' do
|
||||||
put :update, :id => 6, :enumeration => {:type => 'IssuePriority', :name => 'New name'}
|
put :update, :id => 6, :enumeration => {:type => 'IssuePriority', :name => 'New name'}
|
||||||
end
|
end
|
||||||
assert_redirected_to '/enumerations?type=IssuePriority'
|
assert_redirected_to '/enumerations'
|
||||||
e = IssuePriority.find(6)
|
e = IssuePriority.find(6)
|
||||||
assert_equal 'New name', e.name
|
assert_equal 'New name', e.name
|
||||||
end
|
end
|
||||||
|
|
|
@ -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
|
|
@ -43,5 +43,9 @@ class RoutingEnumerationsTest < ActionController::IntegrationTest
|
||||||
{ :method => 'delete', :path => "/enumerations/2" },
|
{ :method => 'delete', :path => "/enumerations/2" },
|
||||||
{ :controller => 'enumerations', :action => 'destroy', :id => '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
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue