Project

General

Profile

Feature #31518 » 0001-Add-default-due-date-for-new-issues-with-configurabl.patch

Go MAEDA, 2026-04-17 10:23

View differences:

app/controllers/issues_controller.rb
618 618
    end
619 619
    @issue.author ||= User.current
620 620
    @issue.start_date ||= User.current.today if Setting.default_issue_start_date_to_creation_date?
621
    offset = Setting.default_issue_due_date_offset_in_days
622
    @issue.due_date ||= User.current.today + offset if offset
621 623

  
622 624
    attrs = (params[:issue] || {}).deep_dup
623 625
    if action_name == 'new' && params[:was_default_status] == attrs[:status_id]
app/controllers/settings_controller.rb
36 36
  def edit
37 37
    @notifiables = Redmine::Notifiable.all
38 38
    if request.post?
39
      errors = Setting.set_all_from_params(params[:settings].to_unsafe_hash)
39
      settings = params[:settings].to_unsafe_hash
40
      if settings['default_issue_due_date_offset_enabled'] == '0'
41
        settings['default_issue_due_date_offset'] = ''
42
      end
43
      errors = Setting.set_all_from_params(settings)
40 44
      if errors.blank?
41 45
        flash[:notice] = l(:notice_successful_update)
42 46
        redirect_to settings_path(:tab => params[:tab])
app/models/mail_handler.rb
214 214
    end
215 215
    issue.description = cleaned_up_text_body
216 216
    issue.start_date ||= User.current.today if Setting.default_issue_start_date_to_creation_date?
217
    offset = Setting.default_issue_due_date_offset_in_days
218
    issue.due_date ||= User.current.today + offset if offset
217 219
    if handler_options[:issue][:is_private] == '1'
218 220
      issue.is_private = true
219 221
    end
app/models/setting.rb
192 192
        messages << [:mail_from, l('activerecord.errors.messages.invalid')]
193 193
      end
194 194
    end
195
    if settings.key?(:default_issue_due_date_offset)
196
      value = settings[:default_issue_due_date_offset].to_s.strip
197
      unless value.blank?
198
        begin
199
          offset = Integer(value, 10)
200
          if offset < 0
201
            messages << [
202
              :default_issue_due_date_offset,
203
              l('activerecord.errors.messages.greater_than_or_equal_to', :count => 0)
204
            ]
205
          end
206
        rescue ArgumentError
207
          messages << [:default_issue_due_date_offset, l('activerecord.errors.messages.not_a_number')]
208
        end
209
      end
210
    end
195 211
    messages
196 212
  end
197 213

  
......
238 254
    params
239 255
  end
240 256

  
257
  def self.default_issue_due_date_offset_from_params(params)
258
    params.to_s.strip
259
  end
260

  
261
  def self.default_issue_due_date_offset_in_days
262
    value = default_issue_due_date_offset.to_s.strip
263
    return nil if value.blank? || !value.match?(/\A\d+\z/)
264

  
265
    value.to_i
266
  end
267

  
241 268
  def self.twofa_required?
242 269
    twofa == '2'
243 270
  end
app/views/settings/_issues.html.erb
15 15

  
16 16
<p><%= setting_check_box :default_issue_start_date_to_creation_date %></p>
17 17

  
18
<%
19
  default_due_date_offset_enabled =
20
    if params[:settings]
21
      params[:settings][:default_issue_due_date_offset_enabled].to_s != '0'
22
    else
23
      Setting.default_issue_due_date_offset.present?
24
    end
25
%>
26
<p>
27
  <label for="settings_default_issue_due_date_offset_enabled">
28
    <%= l(:text_enable_default_issue_due_date_offset) %>
29
  </label>
30
  <%= hidden_field_tag 'settings[default_issue_due_date_offset_enabled]', 0, :id => nil %>
31
  <%= check_box_tag 'settings[default_issue_due_date_offset_enabled]', 1,
32
                    default_due_date_offset_enabled,
33
                    :id => 'settings_default_issue_due_date_offset_enabled',
34
                    :data => {:enables => '#settings_default_issue_due_date_offset'} %>
35
</p>
36
<p>
37
  <label>&nbsp;</label>
38
  <%= setting_text_field :default_issue_due_date_offset,
39
                         :label => false,
40
                         :size => 6,
41
                         :disabled => !default_due_date_offset_enabled %>
42
  <%= l(:text_default_issue_due_date_offset_from_today) %>
43
</p>
44

  
18 45
<p><%= setting_check_box :display_subprojects_issues %></p>
19 46

  
20 47
<p><%= setting_select :issue_done_ratio, Issue::DONE_RATIO_OPTIONS.collect {|i| [l("setting_issue_done_ratio_#{i}"), i]} %></p>
config/locales/en.yml
498 498
  setting_gantt_months_limit: Maximum number of months displayed on the gantt chart
499 499
  setting_issue_group_assignment: Allow issue assignment to groups
500 500
  setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
501
  text_enable_default_issue_due_date_offset: Enable default due date for new issues
502
  text_default_issue_due_date_offset_from_today: days from today
501 503
  setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
502 504
  setting_unsubscribe: Allow users to delete their own account
503 505
  setting_session_lifetime: Session maximum lifetime
config/settings.yml
198 198
  default: 0
199 199
default_issue_start_date_to_creation_date:
200 200
  default: 0
201
default_issue_due_date_offset:
202
  default: ''
201 203
notified_events:
202 204
  serialized: true
203 205
  default:
test/functional/issues_controller_test.rb
3860 3860
    end
3861 3861
  end
3862 3862

  
3863
  def test_get_new_with_default_due_date_offset
3864
    with_settings :default_issue_due_date_offset => '7' do
3865
      @request.session[:user_id] = 2
3866
      get(
3867
        :new,
3868
        :params => {
3869
          :project_id => 1,
3870
          :tracker_id => 1
3871
        }
3872
      )
3873
      assert_response :success
3874
      assert_select 'input[name=?][value=?]', 'issue[due_date]', (Date.today + 7.days).to_s
3875
    end
3876
  end
3877

  
3863 3878
  def test_get_new_form_should_allow_attachment_upload
3864 3879
    @request.session[:user_id] = 2
3865 3880
    get(
......
4392 4407
    end
4393 4408
  end
4394 4409

  
4410
  def test_post_create_without_due_date_and_default_due_date_offset
4411
    with_settings :default_issue_due_date_offset => '5' do
4412
      @request.session[:user_id] = 2
4413
      assert_difference 'Issue.count' do
4414
        post(
4415
          :create,
4416
          :params => {
4417
            :project_id => 1,
4418
            :issue => {
4419
              :tracker_id => 3,
4420
              :status_id => 2,
4421
              :subject => 'This is the test_new issue with default due date',
4422
              :description => 'This is the description',
4423
              :priority_id => 5,
4424
              :estimated_hours => '',
4425
              :custom_field_values => {
4426
                '2' => 'Value for field 2'
4427
              }
4428
            }
4429
          }
4430
        )
4431
      end
4432
      issue = Issue.find_by_subject('This is the test_new issue with default due date')
4433
      assert_not_nil issue
4434
      assert_equal Date.today + 5, issue.due_date
4435
    end
4436
  end
4437

  
4395 4438
  def test_post_create_and_continue
4396 4439
    @request.session[:user_id] = 2
4397 4440
    assert_difference 'Issue.count' do
test/functional/settings_controller_test.rb
141 141
    )
142 142
  end
143 143

  
144
  def test_post_edit_should_clear_default_due_date_offset_when_disabled
145
    with_settings :default_issue_due_date_offset => '5' do
146
      post :edit, :params => {
147
        :tab => 'issues',
148
        :settings => {
149
          :default_issue_due_date_offset_enabled => '0',
150
          :default_issue_due_date_offset => '7'
151
        }
152
      }
153
      assert_redirected_to '/settings?tab=issues'
154
      assert_equal '', Setting.default_issue_due_date_offset
155
    end
156
  end
157

  
144 158
  def test_post_edit_with_invalid_setting_should_not_error
145 159
    post :edit, :params => {
146 160
      :settings => {
test/unit/mail_handler_test.rb
291 291
    end
292 292
  end
293 293

  
294
  def test_add_issue_should_set_default_due_date
295
    with_settings :default_issue_due_date_offset => '5' do
296
      issue = submit_email('ticket_with_cc.eml', :issue => {:project => 'ecookbook'})
297
      assert issue.is_a?(Issue)
298
      assert_equal Date.today + 5, issue.due_date
299
    end
300
  end
301

  
294 302
  def test_add_issue_should_add_cc_as_watchers
295 303
    user = User.find_by_mail('dlopper@somenet.foo')
296 304
    issue = submit_email('ticket_with_cc.eml', :issue => {:project => 'ecookbook'})
test/unit/setting_test.rb
135 135
    end
136 136
  end
137 137

  
138
  def test_default_issue_due_date_offset_should_validate_values
139
    with_locale 'en' do
140
      assert_nil Setting.set_all_from_params(:default_issue_due_date_offset => '')
141
      assert_nil Setting.set_all_from_params(:default_issue_due_date_offset => '0')
142
      assert_nil Setting.set_all_from_params(:default_issue_due_date_offset => '5')
143

  
144
      errors = Setting.set_all_from_params(:default_issue_due_date_offset => 'foo')
145
      assert_includes errors, [:default_issue_due_date_offset, 'is not a number']
146

  
147
      errors = Setting.set_all_from_params(:default_issue_due_date_offset => '-1')
148
      assert_includes errors, [:default_issue_due_date_offset, 'must be greater than or equal to 0']
149
    end
150
  end
151

  
138 152
  def test_default_text_formatting_for_new_installations_is_common_mark
139 153
    assert_equal 'common_mark', Setting.text_formatting
140 154
  end
(2-2/2)