From feccaf8a17bc83d3fa4456599f23ce66e13cdee1 Mon Sep 17 00:00:00 2001 From: Marius BALTEANU Date: Wed, 19 Jun 2019 21:31:44 +0000 Subject: [PATCH 1/2] Display new issue link in version page --- app/helpers/versions_helper.rb | 22 ++++++++++++ app/views/versions/show.html.erb | 1 + test/functional/versions_controller_test.rb | 8 +++++ test/helpers/version_helper_test.rb | 56 +++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+) diff --git a/app/helpers/versions_helper.rb b/app/helpers/versions_helper.rb index ca93abd..f785258 100644 --- a/app/helpers/versions_helper.rb +++ b/app/helpers/versions_helper.rb @@ -73,4 +73,26 @@ module VersionsHelper def status_by_options_for_select(value) options_for_select(STATUS_BY_CRITERIAS.collect {|criteria| [l("field_#{criteria}".to_sym), criteria]}, value) end + + def link_to_new_issue(version, project) + if version.open? && User.current.allowed_to?(:add_issues, project) + trackers = Issue.allowed_target_trackers(project) + + unless trackers.empty? + issue = Issue.new(:project => project) + new_issue_tracker = trackers.detect do |tracker| + issue.tracker = tracker + issue.safe_attribute?('fixed_version_id') + end + end + + if new_issue_tracker + attrs = { + :tracker_id => new_issue_tracker, + :fixed_version_id => version.id + } + link_to l(:label_issue_new), new_project_issue_path(project, :issue => attrs), :class => 'icon icon-add' + end + end + end end diff --git a/app/views/versions/show.html.erb b/app/views/versions/show.html.erb index e1b27ee..d73485a 100644 --- a/app/views/versions/show.html.erb +++ b/app/views/versions/show.html.erb @@ -2,6 +2,7 @@ <%= link_to(l(:button_edit), edit_version_path(@version), :class => 'icon icon-edit') if User.current.allowed_to?(:manage_versions, @version.project) %> <%= link_to_if_authorized(l(:button_edit_associated_wikipage, :page_title => @version.wiki_page_title), {:controller => 'wiki', :action => 'edit', :project_id => @version.project, :id => Wiki.titleize(@version.wiki_page_title)}, :class => 'icon icon-edit') unless @version.wiki_page_title.blank? || @version.project.wiki.nil? %> <%= delete_link version_path(@version, :back_url => url_for(:controller => 'versions', :action => 'index', :project_id => @version.project)) if User.current.allowed_to?(:manage_versions, @version.project) %> +<%= link_to_new_issue(@version, @project) %> <%= call_hook(:view_versions_show_contextual, { :version => @version, :project => @project }) %> diff --git a/test/functional/versions_controller_test.rb b/test/functional/versions_controller_test.rb index 358b6f8..a5b0f0b 100644 --- a/test/functional/versions_controller_test.rb +++ b/test/functional/versions_controller_test.rb @@ -206,6 +206,14 @@ class VersionsControllerTest < Redmine::ControllerTest end end + def test_show_should_display_link_to_new_issue + @request.session[:user_id] = 1 + get :show, :params => {:id => 3} + + assert_response :success + assert_select 'a.icon.icon-add', :text => 'New issue' + end + def test_new @request.session[:user_id] = 2 get :new, :params => {:project_id => '1'} diff --git a/test/helpers/version_helper_test.rb b/test/helpers/version_helper_test.rb index e1c83e2..9bdb497 100644 --- a/test/helpers/version_helper_test.rb +++ b/test/helpers/version_helper_test.rb @@ -53,4 +53,60 @@ class VersionsHelperTest < Redmine::HelperTest version.project = Project.find(5) assert_match /^\/issues\?/, version_filtered_issues_path(version) end + + def test_link_to_new_issue_should_return_link_to_add_issue + version = Version.find(3) + project = Project.find(1) + User.current = User.find(1) + + # href should contain the following params: + # fixed_version_id=3 + # tracker_id=1 + assert_select_in link_to_new_issue(version, project), '[href=?]', '/projects/ecookbook/issues/new?issue%5Bfixed_version_id%5D=3&issue%5Btracker_id%5D=1', :text => 'New issue' + end + + def test_link_to_new_issue_should_return_nil_if_version_status_is_not_open + # locked version + version = Version.find(2) + project = Project.find(1) + User.current = User.find(1) + + assert_nil link_to_new_issue(version, project) + end + + def test_link_to_new_issue_should_return_nil_if_user_does_not_have_permission_to_add_issue + Role.find(1).remove_permission! :add_issues + version = Version.find(3) + project = Project.find(1) + User.current = User.find(2) + + assert_nil link_to_new_issue(version, project) + end + + def test_link_to_new_issue_should_return_nil_if_no_tracker_is_available_for_project + trackers = Tracker::CORE_FIELDS - %w(fixed_version_id) + # disable fixed_version_id field for all trackers + Tracker.all.each do |tracker| + tracker.core_fields = trackers + tracker.save! + end + + version = Version.find(3) + project = Project.find(1) + User.current = User.find(2) + + assert_nil link_to_new_issue(version, project) + end + + def test_link_to_new_issue_should_take_into_account_user_permissions_on_fixed_version_id_field + WorkflowPermission.delete_all + WorkflowPermission.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :field_name => 'fixed_version_id', :rule => 'readonly') + + version = Version.find(3) + project = Project.find(1) + User.current = User.find(2) + + # href should contain param tracker_id=2 because for tracker_id 1, user has only readonly permissions on fixed_version_id + assert_select_in link_to_new_issue(version, project), '[href=?]', '/projects/ecookbook/issues/new?issue%5Bfixed_version_id%5D=3&issue%5Btracker_id%5D=2' + end end -- 2.1.4