From 588c83df008ac6ccc08a08ea39ed53cdd2ef1e65 Mon Sep 17 00:00:00 2001
From: MAEDA Go
<%= f.check_box :private_by_default %>
<%= f.check_box :is_in_roadmap %>
<%= f.textarea :description, :rows => 4 %>
diff --git a/config/locales/en.yml b/config/locales/en.yml index 789694d67..3f5bbbdeb 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -326,6 +326,7 @@ en: field_is_public: Public field_parent: Subproject of field_is_in_roadmap: Issues displayed in roadmap + field_private_by_default: Private by default field_login: Login field_mail_notification: Email notifications field_admin: Administrator diff --git a/db/migrate/20260510000000_add_private_by_default_to_trackers.rb b/db/migrate/20260510000000_add_private_by_default_to_trackers.rb new file mode 100644 index 000000000..e98078141 --- /dev/null +++ b/db/migrate/20260510000000_add_private_by_default_to_trackers.rb @@ -0,0 +1,5 @@ +class AddPrivateByDefaultToTrackers < ActiveRecord::Migration[8.1] + def change + add_column :trackers, :private_by_default, :boolean, :default => false, :null => false + end +end diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index e02fd8ce8..f7b083a05 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -4241,6 +4241,60 @@ class IssuesControllerTest < Redmine::ControllerTest end end + def test_new_should_check_private_if_tracker_is_private_by_default + Tracker.find(1).update! :private_by_default => true + @request.session[:user_id] = 2 + get(:new, :params => {:project_id => 1}) + assert_response :success + + assert_select 'input[name=?][checked=checked]', 'issue[is_private]' + end + + def test_update_form_for_new_issue_should_apply_private_by_default_when_submitted_private_is_unchecked + Tracker.find(2).update! :private_by_default => true + @request.session[:user_id] = 2 + # Simulates switching from an unchecked tracker to a tracker that is private by default. + post( + :new, + :params => { + :project_id => 1, + :issue => { + :tracker_id => 2, + :is_private => '0' + }, + :form_update_triggered_by => 'issue_tracker_id' + } + ) + assert_response :success + + assert_select 'select[name=?]', 'issue[tracker_id]' do + assert_select 'option[value=?][selected=selected]', '2' + end + assert_select 'input[name=?][checked=checked]', 'issue[is_private]' + end + + def test_update_form_for_new_issue_should_keep_submitted_private_when_checked + @request.session[:user_id] = 2 + # Simulates keeping the user's checked private value when switching trackers. + post( + :new, + :params => { + :project_id => 1, + :issue => { + :tracker_id => 2, + :is_private => '1' + }, + :form_update_triggered_by => 'issue_tracker_id' + } + ) + assert_response :success + + assert_select 'select[name=?]', 'issue[tracker_id]' do + assert_select 'option[value=?][selected=selected]', '2' + end + assert_select 'input[name=?][checked=checked]', 'issue[is_private]' + end + def test_update_form_for_new_issue_should_ignore_version_when_changing_project version = Version.generate!(:project_id => 1) Project.find(1).update_attribute :default_version_id, version.id @@ -4902,6 +4956,66 @@ class IssuesControllerTest < Redmine::ControllerTest assert issue.is_private? end + def test_post_create_should_respect_private_by_default_per_tracker_setting + @request.session[:user_id] = 2 + tracker = Tracker.find(1) + tracker.update! :private_by_default => true + + assert_difference 'Issue.count' do + post( + :create, + :params => { + :project_id => 1, + :issue => { + :tracker_id => tracker.id, + :subject => 'This is a private issue by default' + } + } + ) + end + issue = Issue.order(id: :desc).first + assert issue.is_private? + + assert_difference 'Issue.count' do + post( + :create, + :params => { + :project_id => 1, + :issue => { + :tracker_id => tracker.id, + :subject => 'This is a public issue', + :is_private => '0' + } + } + ) + end + issue = Issue.order(id: :desc).first + assert_not issue.is_private? + end + + def test_post_create_should_not_apply_private_by_default_without_permission + role = Role.find(1) + role.remove_permission! :set_issues_private + role.remove_permission! :set_own_issues_private + Tracker.find(1).update! :private_by_default => true + @request.session[:user_id] = 2 + + assert_difference 'Issue.count' do + post( + :create, + :params => { + :project_id => 1, + :issue => { + :tracker_id => 1, + :subject => 'This is a public issue' + } + } + ) + end + issue = Issue.order(id: :desc).first + assert_not issue.is_private? + end + def test_create_without_project_id @request.session[:user_id] = 2 assert_difference 'Issue.count' do diff --git a/test/functional/trackers_controller_test.rb b/test/functional/trackers_controller_test.rb index a4a741791..e55d8ffc8 100644 --- a/test/functional/trackers_controller_test.rb +++ b/test/functional/trackers_controller_test.rb @@ -121,6 +121,7 @@ class TrackersControllerTest < Redmine::ControllerTest :tracker => { :name => 'New tracker', :default_status_id => 1, + :private_by_default => '1', :project_ids => ['1', '', ''], :custom_field_ids => ['1', '6', ''] } @@ -129,6 +130,7 @@ class TrackersControllerTest < Redmine::ControllerTest assert_redirected_to :action => 'index' tracker = Tracker.order(id: :desc).first assert_equal 'New tracker', tracker.name + assert tracker.private_by_default? assert_equal [1], tracker.project_ids.sort assert_equal Tracker::CORE_FIELDS, tracker.core_fields assert_equal [1, 6], tracker.custom_field_ids.sort diff --git a/test/integration/api_test/issues_test.rb b/test/integration/api_test/issues_test.rb index b8f676a43..cadadc1ec 100644 --- a/test/integration/api_test/issues_test.rb +++ b/test/integration/api_test/issues_test.rb @@ -728,6 +728,18 @@ class Redmine::ApiTest::IssuesTest < Redmine::ApiTest::Base assert_response :unprocessable_content end + test "POST /issues.json should use the tracker private_by_default setting" do + Tracker.find(1).update! :private_by_default => true + + issue = new_record(Issue) do + post( + '/issues.json', + :params => {:issue => {:project_id => 1, :tracker_id => 1, :subject => 'API'}}, + :headers => credentials('jsmith')) + end + assert issue.is_private? + end + test "PUT /issues/:id.xml" do assert_difference('Journal.count') do put( -- 2.50.1