From: Jean-Baptiste Barth Date: Mon, 20 Jun 2011 19:39:59 +0000 (+0000) Subject: Merged r6098 from trunk. X-Git-Tag: 1.2.1~34 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=16ba6bcb77736ccbc5ec22ecec7942a44e2ec040;p=redmine.git Merged r6098 from trunk. Added Project#enable_module! and Project#disable_module! git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6104 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- diff --git a/app/models/attachment.rb b/app/models/attachment.rb index ff434d8f2..92eb9157a 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -43,7 +43,7 @@ class Attachment < ActiveRecord::Base "LEFT JOIN #{Project.table_name} ON #{Document.table_name}.project_id = #{Project.table_name}.id"} cattr_accessor :storage_path - @@storage_path = Redmine::Configuration['attachments_storage_path'] || "#{RAILS_ROOT}/files" + @@storage_path = Redmine::Configuration['attachments_storage_path'] || "#{Rails.root}/files" def validate if self.filesize > Setting.attachment_max_size.to_i.kilobytes diff --git a/app/models/project.rb b/app/models/project.rb index ab345be4f..c9d00e9b7 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -544,7 +544,27 @@ class Project < ActiveRecord::Base def enabled_module_names enabled_modules.collect(&:name) end - + + # Enable a specific module + # + # Examples: + # project.enable_module!(:issue_tracking) + # project.enable_module!("issue_tracking") + def enable_module!(name) + enabled_modules << EnabledModule.new(:name => name.to_s) unless module_enabled?(name) + end + + # Disable a module if it exists + # + # Examples: + # project.disable_module!(:issue_tracking) + # project.disable_module!("issue_tracking") + # project.disable_module!(project.enabled_modules.first) + def disable_module!(target) + target = enabled_modules.detect{|mod| target.to_s == mod.name} unless enabled_modules.include?(target) + target.destroy unless target.blank? + end + safe_attributes 'name', 'description', 'homepage', diff --git a/app/models/setting.rb b/app/models/setting.rb index 80e084e9c..12b186fe8 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -75,7 +75,7 @@ class Setting < ActiveRecord::Base TIS-620) cattr_accessor :available_settings - @@available_settings = YAML::load(File.open("#{RAILS_ROOT}/config/settings.yml")) + @@available_settings = YAML::load(File.open("#{Rails.root}/config/settings.yml")) Redmine::Plugin.all.each do |plugin| next unless plugin.settings @@available_settings["plugin_#{plugin.id}"] = {'default' => plugin.settings[:default], 'serialized' => true} diff --git a/lib/generators/redmine_plugin_controller/redmine_plugin_controller_generator.rb b/lib/generators/redmine_plugin_controller/redmine_plugin_controller_generator.rb index 7f3f3f68e..24d3af8e4 100644 --- a/lib/generators/redmine_plugin_controller/redmine_plugin_controller_generator.rb +++ b/lib/generators/redmine_plugin_controller/redmine_plugin_controller_generator.rb @@ -14,7 +14,7 @@ class RedminePluginControllerGenerator < ControllerGenerator end def destination_root - File.join(RAILS_ROOT, plugin_path) + File.join(Rails.root, plugin_path) end def manifest diff --git a/lib/generators/redmine_plugin_model/redmine_plugin_model_generator.rb b/lib/generators/redmine_plugin_model/redmine_plugin_model_generator.rb index 1c34439aa..be231a91c 100644 --- a/lib/generators/redmine_plugin_model/redmine_plugin_model_generator.rb +++ b/lib/generators/redmine_plugin_model/redmine_plugin_model_generator.rb @@ -14,7 +14,7 @@ class RedminePluginModelGenerator < ModelGenerator end def destination_root - File.join(RAILS_ROOT, plugin_path) + File.join(Rails.root, plugin_path) end def manifest diff --git a/lib/redmine/i18n.rb b/lib/redmine/i18n.rb index f0cc529b0..29ff3281b 100644 --- a/lib/redmine/i18n.rb +++ b/lib/redmine/i18n.rb @@ -56,11 +56,11 @@ module Redmine def month_name(month) ::I18n.t('date.month_names')[month] end - + def valid_languages - @@valid_languages ||= Dir.glob(File.join(RAILS_ROOT, 'config', 'locales', '*.yml')).collect {|f| File.basename(f).split('.').first}.collect(&:to_sym) + @@valid_languages ||= Dir.glob(File.join(Rails.root, 'config', 'locales', '*.yml')).collect {|f| File.basename(f).split('.').first}.collect(&:to_sym) end - + def find_language(lang) @@languages_lookup = valid_languages.inject({}) {|k, v| k[v.to_s.downcase] = v; k } @@languages_lookup[lang.to_s.downcase] diff --git a/lib/redmine/plugin.rb b/lib/redmine/plugin.rb index f30277ad1..e4066a105 100644 --- a/lib/redmine/plugin.rb +++ b/lib/redmine/plugin.rb @@ -1,16 +1,16 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +# 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. @@ -69,7 +69,7 @@ module Redmine #:nodoc: p.name(id.to_s.humanize) if p.name.nil? # Adds plugin locales if any # YAML translation files should be found under /config/locales/ - ::I18n.load_path += Dir.glob(File.join(RAILS_ROOT, 'vendor', 'plugins', id.to_s, 'config', 'locales', '*.yml')) + ::I18n.load_path += Dir.glob(File.join(Rails.root, 'vendor', 'plugins', id.to_s, 'config', 'locales', '*.yml')) registered_plugins[id] = p end diff --git a/lib/redmine/scm/adapters/abstract_adapter.rb b/lib/redmine/scm/adapters/abstract_adapter.rb index bb0161152..6dc416064 100644 --- a/lib/redmine/scm/adapters/abstract_adapter.rb +++ b/lib/redmine/scm/adapters/abstract_adapter.rb @@ -204,7 +204,7 @@ module Redmine end if Rails.env == 'development' # Capture stderr when running in dev environment - cmd = "#{cmd} 2>>#{RAILS_ROOT}/log/scm.stderr.log" + cmd = "#{cmd} 2>>#{Rails.root}/log/scm.stderr.log" end begin if RUBY_VERSION < '1.9' diff --git a/lib/redmine/version.rb b/lib/redmine/version.rb index 2da94757d..13c292f10 100644 --- a/lib/redmine/version.rb +++ b/lib/redmine/version.rb @@ -14,7 +14,7 @@ module Redmine def self.revision revision = nil - entries_path = "#{RAILS_ROOT}/.svn/entries" + entries_path = "#{Rails.root}/.svn/entries" if File.readable?(entries_path) begin f = File.open(entries_path, 'r') diff --git a/lib/redmine/views/my_page/block.rb b/lib/redmine/views/my_page/block.rb index b6ca29f97..06f532dde 100644 --- a/lib/redmine/views/my_page/block.rb +++ b/lib/redmine/views/my_page/block.rb @@ -1,16 +1,16 @@ # Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +# 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. @@ -20,7 +20,7 @@ module Redmine module MyPage module Block def self.additional_blocks - @@additional_blocks ||= Dir.glob("#{RAILS_ROOT}/vendor/plugins/*/app/views/my/blocks/_*.{rhtml,erb}").inject({}) do |h,file| + @@additional_blocks ||= Dir.glob("#{Rails.root}/vendor/plugins/*/app/views/my/blocks/_*.{rhtml,erb}").inject({}) do |h,file| name = File.basename(file).split('.').first.gsub(/^_/, '') h[name] = name.to_sym h diff --git a/lib/tasks/extract_fixtures.rake b/lib/tasks/extract_fixtures.rake index 604091ba3..d2dbf091e 100644 --- a/lib/tasks/extract_fixtures.rake +++ b/lib/tasks/extract_fixtures.rake @@ -7,7 +7,7 @@ task :extract_fixtures => :environment do ActiveRecord::Base.establish_connection (ActiveRecord::Base.connection.tables - skip_tables).each do |table_name| i = "000" - File.open("#{RAILS_ROOT}/#{table_name}.yml", 'w' ) do |file| + File.open("#{Rails.root}/#{table_name}.yml", 'w' ) do |file| data = ActiveRecord::Base.connection.select_all(sql % table_name) file.write data.inject({}) { |hash, record| # cast extracted values @@ -19,4 +19,5 @@ task :extract_fixtures => :environment do }.to_yaml end end -end +end + diff --git a/lib/tasks/initializers.rake b/lib/tasks/initializers.rake index 3d4a40205..fa20f09b5 100644 --- a/lib/tasks/initializers.rake +++ b/lib/tasks/initializers.rake @@ -1,7 +1,7 @@ desc 'Generates a configuration file for cookie store sessions.' file 'config/initializers/session_store.rb' do - path = File.join(RAILS_ROOT, 'config', 'initializers', 'session_store.rb') + path = File.join(Rails.root, 'config', 'initializers', 'session_store.rb') secret = ActiveSupport::SecureRandom.hex(40) File.open(path, 'w') do |f| f.write <<"EOF" diff --git a/test/fixtures/repositories.yml b/test/fixtures/repositories.yml index c55105897..61930f395 100644 --- a/test/fixtures/repositories.yml +++ b/test/fixtures/repositories.yml @@ -1,9 +1,9 @@ --- repositories_001: project_id: 1 - url: file:///<%= RAILS_ROOT.gsub(%r{config\/\.\.}, '') %>/tmp/test/subversion_repository + url: file:///<%= Rails.root %>/tmp/test/subversion_repository id: 10 - root_url: file:///<%= RAILS_ROOT.gsub(%r{config\/\.\.}, '') %>/tmp/test/subversion_repository + root_url: file:///<%= Rails.root %>/tmp/test/subversion_repository password: "" login: "" type: Subversion diff --git a/test/functional/application_controller_test.rb b/test/functional/application_controller_test.rb index 57f3e091c..5cc7901f1 100644 --- a/test/functional/application_controller_test.rb +++ b/test/functional/application_controller_test.rb @@ -32,7 +32,7 @@ class ApplicationControllerTest < ActionController::TestCase # check that all language files are valid def test_localization - lang_files_count = Dir["#{RAILS_ROOT}/config/locales/*.yml"].size + lang_files_count = Dir["#{Rails.root}/config/locales/*.yml"].size assert_equal lang_files_count, valid_languages.size valid_languages.each do |lang| assert set_language_if_valid(lang) diff --git a/test/functional/attachments_controller_test.rb b/test/functional/attachments_controller_test.rb index e609299c0..1f91da3b0 100644 --- a/test/functional/attachments_controller_test.rb +++ b/test/functional/attachments_controller_test.rb @@ -32,7 +32,7 @@ class AttachmentsControllerTest < ActionController::TestCase @controller = AttachmentsController.new @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new - Attachment.storage_path = "#{RAILS_ROOT}/test/fixtures/files" + Attachment.storage_path = "#{Rails.root}/test/fixtures/files" User.current = nil end diff --git a/test/test_helper.rb b/test/test_helper.rb index e8474de15..51eaae13e 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -78,11 +78,13 @@ class ActiveSupport::TestCase # Use a temporary directory for attachment related tests def set_tmp_attachments_directory - Dir.mkdir "#{RAILS_ROOT}/tmp/test" unless File.directory?("#{RAILS_ROOT}/tmp/test") - Dir.mkdir "#{RAILS_ROOT}/tmp/test/attachments" unless File.directory?("#{RAILS_ROOT}/tmp/test/attachments") - Attachment.storage_path = "#{RAILS_ROOT}/tmp/test/attachments" + Dir.mkdir "#{Rails.root}/tmp/test" unless File.directory?("#{Rails.root}/tmp/test") + unless File.directory?("#{Rails.root}/tmp/test/attachments") + Dir.mkdir "#{Rails.root}/tmp/test/attachments" + end + Attachment.storage_path = "#{Rails.root}/tmp/test/attachments" end - + def with_settings(options, &block) saved_settings = options.keys.inject({}) {|h, k| h[k] = Setting[k].dup; h} options.each {|k, v| Setting[k] = v} diff --git a/test/unit/lib/redmine/hook_test.rb b/test/unit/lib/redmine/hook_test.rb index 82f507f23..14782683a 100644 --- a/test/unit/lib/redmine/hook_test.rb +++ b/test/unit/lib/redmine/hook_test.rb @@ -1,16 +1,16 @@ -# redMine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +# 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. @@ -20,10 +20,10 @@ require File.expand_path('../../../../test_helper', __FILE__) class Redmine::Hook::ManagerTest < ActiveSupport::TestCase fixtures :issues - + # Some hooks that are manually registered in these tests class TestHook < Redmine::Hook::ViewListener; end - + class TestHook1 < TestHook def view_layouts_base_html_head(context) 'Test hook 1 listener.' @@ -35,13 +35,13 @@ class Redmine::Hook::ManagerTest < ActiveSupport::TestCase 'Test hook 2 listener.' end end - + class TestHook3 < TestHook def view_layouts_base_html_head(context) "Context keys: #{context.keys.collect(&:to_s).sort.join(', ')}." end end - + class TestLinkToHook < TestHook def view_layouts_base_html_head(context) link_to('Issues', :controller => 'issues') @@ -51,54 +51,54 @@ class Redmine::Hook::ManagerTest < ActiveSupport::TestCase class TestHookHelperController < ActionController::Base include Redmine::Hook::Helper end - + class TestHookHelperView < ActionView::Base include Redmine::Hook::Helper end - + Redmine::Hook.clear_listeners - + def setup @hook_module = Redmine::Hook end - + def teardown @hook_module.clear_listeners end - + def test_clear_listeners assert_equal 0, @hook_module.hook_listeners(:view_layouts_base_html_head).size @hook_module.add_listener(TestHook1) @hook_module.add_listener(TestHook2) assert_equal 2, @hook_module.hook_listeners(:view_layouts_base_html_head).size - + @hook_module.clear_listeners assert_equal 0, @hook_module.hook_listeners(:view_layouts_base_html_head).size end - + def test_add_listener assert_equal 0, @hook_module.hook_listeners(:view_layouts_base_html_head).size @hook_module.add_listener(TestHook1) assert_equal 1, @hook_module.hook_listeners(:view_layouts_base_html_head).size end - + def test_call_hook @hook_module.add_listener(TestHook1) assert_equal ['Test hook 1 listener.'], hook_helper.call_hook(:view_layouts_base_html_head) end - + def test_call_hook_with_context @hook_module.add_listener(TestHook3) assert_equal ['Context keys: bar, controller, foo, project, request.'], hook_helper.call_hook(:view_layouts_base_html_head, :foo => 1, :bar => 'a') end - + def test_call_hook_with_multiple_listeners @hook_module.add_listener(TestHook1) @hook_module.add_listener(TestHook2) assert_equal ['Test hook 1 listener.', 'Test hook 2 listener.'], hook_helper.call_hook(:view_layouts_base_html_head) end - + # Context: Redmine::Hook::Helper.call_hook default_url def test_call_hook_default_url_options @hook_module.add_listener(TestLinkToHook) @@ -111,27 +111,27 @@ class Redmine::Hook::ManagerTest < ActiveSupport::TestCase @hook_module.add_listener(TestHook3) assert_match /project/i, hook_helper.call_hook(:view_layouts_base_html_head)[0] end - + def test_call_hook_from_controller_with_controller_added_to_context @hook_module.add_listener(TestHook3) assert_match /controller/i, hook_helper.call_hook(:view_layouts_base_html_head)[0] end - + def test_call_hook_from_controller_with_request_added_to_context @hook_module.add_listener(TestHook3) assert_match /request/i, hook_helper.call_hook(:view_layouts_base_html_head)[0] end - + def test_call_hook_from_view_with_project_added_to_context @hook_module.add_listener(TestHook3) assert_match /project/i, view_hook_helper.call_hook(:view_layouts_base_html_head) end - + def test_call_hook_from_view_with_controller_added_to_context @hook_module.add_listener(TestHook3) assert_match /controller/i, view_hook_helper.call_hook(:view_layouts_base_html_head) end - + def test_call_hook_from_view_with_request_added_to_context @hook_module.add_listener(TestHook3) assert_match /request/i, view_hook_helper.call_hook(:view_layouts_base_html_head) @@ -146,27 +146,27 @@ class Redmine::Hook::ManagerTest < ActiveSupport::TestCase def test_call_hook_should_not_change_the_default_url_for_email_notifications issue = Issue.find(1) - + ActionMailer::Base.deliveries.clear Mailer.deliver_issue_add(issue) mail = ActionMailer::Base.deliveries.last - + @hook_module.add_listener(TestLinkToHook) hook_helper.call_hook(:view_layouts_base_html_head) - + ActionMailer::Base.deliveries.clear Mailer.deliver_issue_add(issue) mail2 = ActionMailer::Base.deliveries.last - + assert_equal mail.body, mail2.body end - + def hook_helper @hook_helper ||= TestHookHelperController.new end def view_hook_helper - @view_hook_helper ||= TestHookHelperView.new(RAILS_ROOT + '/app/views') + @view_hook_helper ||= TestHookHelperView.new(Rails.root.to_s + '/app/views') end end diff --git a/test/unit/project_test.rb b/test/unit/project_test.rb index d307500e3..1fe6f1506 100644 --- a/test/unit/project_test.rb +++ b/test/unit/project_test.rb @@ -597,6 +597,54 @@ class ProjectTest < ActiveSupport::TestCase end end + context "enabled_modules" do + setup do + @project = Project.find(1) + end + + should "define module by names and preserve ids" do + # Remove one module + modules = @project.enabled_modules.slice(0..-2) + assert modules.any? + assert_difference 'EnabledModule.count', -1 do + @project.enabled_module_names = modules.collect(&:name) + end + @project.reload + # Ids should be preserved + assert_equal @project.enabled_module_ids.sort, modules.collect(&:id).sort + end + + should "enable a module" do + @project.enabled_module_names = [] + @project.reload + assert_equal [], @project.enabled_module_names + #with string + @project.enable_module!("issue_tracking") + assert_equal ["issue_tracking"], @project.enabled_module_names + #with symbol + @project.enable_module!(:gantt) + assert_equal ["issue_tracking", "gantt"], @project.enabled_module_names + #don't add a module twice + @project.enable_module!("issue_tracking") + assert_equal ["issue_tracking", "gantt"], @project.enabled_module_names + end + + should "disable a module" do + #with string + assert @project.enabled_module_names.include?("issue_tracking") + @project.disable_module!("issue_tracking") + assert ! @project.reload.enabled_module_names.include?("issue_tracking") + #with symbol + assert @project.enabled_module_names.include?("gantt") + @project.disable_module!(:gantt) + assert ! @project.reload.enabled_module_names.include?("gantt") + #with EnabledModule object + first_module = @project.enabled_modules.first + @project.disable_module!(first_module) + assert ! @project.reload.enabled_module_names.include?(first_module.name) + end + end + def test_enabled_module_names_should_not_recreate_enabled_modules project = Project.find(1) # Remove one module