33894.patch

vzvu 3k6k, 2020-09-21 09:22

Download (6.74 KB)

View differences:

app/models/issue.rb
54 54
  acts_as_activity_provider :scope => preload(:project, :author, :tracker, :status),
55 55
                            :author_key => :author_id
56 56

  
57
  DONE_RATIO_OPTIONS = %w(issue_field issue_status)
57
  DONE_RATIO_OPTIONS = %w(issue_field issue_status issue_field_and_closed_status)
58 58

  
59 59
  attr_reader :transition_warning
60 60
  attr_writer :deleted_attachment_ids
......
702 702
  def done_ratio
703 703
    if Issue.use_status_for_done_ratio? && status && status.default_done_ratio
704 704
      status.default_done_ratio
705
    elsif Issue.use_issue_field_and_closed_status_for_done_ratio? && status && status.is_closed?
706
      100
705 707
    else
706 708
      read_attribute(:done_ratio)
707 709
    end
......
715 717
    Setting.issue_done_ratio == 'issue_field'
716 718
  end
717 719

  
720
  def self.use_issue_field_and_closed_status_for_done_ratio?
721
    Setting.issue_done_ratio == 'issue_field_and_closed_status'
722
  end
723

  
724
  def self.done_ratio_editable?
725
    use_status_for_done_ratio? || use_issue_field_and_closed_status_for_done_ratio?
726
  end
727

  
718 728
  def validate_issue
719 729
    if due_date && start_date && (start_date_changed? || due_date_changed?) && due_date < start_date
720 730
      errors.add :due_date, :greater_than_start_date
......
816 826
  def update_done_ratio_from_issue_status
817 827
    if Issue.use_status_for_done_ratio? && status && status.default_done_ratio
818 828
      self.done_ratio = status.default_done_ratio
829
    elsif Issue.use_issue_field_and_closed_status_for_done_ratio? && status && status.is_closed?
830
      self.done_ratio = 100
819 831
    end
820 832
  end
821 833

  
app/views/issues/_attributes.html.erb
83 83
<p><%= f.hours_field :estimated_hours, :size => 3, :required => @issue.required_attribute?('estimated_hours') %> <%= l(:field_hours) %></p>
84 84
<% end %>
85 85

  
86
<% if @issue.safe_attribute?('done_ratio') && Issue.use_field_for_done_ratio? %>
86
<% if @issue.safe_attribute?('done_ratio') && Issue.done_ratio_editable? %>
87 87
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }), :required => @issue.required_attribute?('done_ratio') %></p>
88 88
<% end %>
89 89
</div>
app/views/issues/bulk_edit.html.erb
175 175
</p>
176 176
<% end %>
177 177

  
178
<% if @safe_attributes.include?('done_ratio') && Issue.use_field_for_done_ratio? %>
178
<% if @safe_attributes.include?('done_ratio') && Issue.done_ratio_editable? %>
179 179
<p>
180 180
  <label for='issue_done_ratio'><%= l(:field_done_ratio) %></label>
181 181
  <%= select_tag 'issue[done_ratio]', options_for_select([[l(:label_no_change_option), '']] + (0..10).to_a.collect {|r| ["#{r*10} %", r*10] }, @issue_params[:done_ratio]) %>
config/locales/en.yml
463 463
  setting_issue_done_ratio: Calculate the issue done ratio with
464 464
  setting_issue_done_ratio_issue_field: Use the issue field
465 465
  setting_issue_done_ratio_issue_status: Use the issue status
466
  setting_issue_done_ratio_issue_field_and_closed_status: Use the issue field (100% if closed)
466 467
  setting_start_of_week: Start calendars on
467 468
  setting_rest_api_enabled: Enable REST web service
468 469
  setting_cache_formatted_text: Cache formatted text
config/locales/ja.yml
394 394
  setting_issue_done_ratio: 進捗率の算出方法
395 395
  setting_issue_done_ratio_issue_field: チケットのフィールドを使用
396 396
  setting_issue_done_ratio_issue_status: チケットのステータスに連動
397
  setting_issue_done_ratio_issue_field_and_closed_status: チケットのフィールドを使用(終了したチケットは100%)
397 398
  setting_start_of_week: 週の開始曜日
398 399
  setting_rest_api_enabled: RESTによるWebサービスを有効にする
399 400
  setting_default_notification_option: デフォルトのメール通知オプション
test/unit/issue_test.rb
2823 2823
    end
2824 2824
  end
2825 2825

  
2826
  # done_ratio should change to 100 when the status is closed and Setting.issue_done_ratio equal issue_field_and_closed_status
2827
  test "when updating to closed status should update done_ratio according to Setting.issue_done_ratio" do
2828
    closed_status = IssueStatus.find(5)
2829
    closed_status.update!(:default_done_ratio => 90)
2830

  
2831
    with_settings :issue_done_ratio => 'issue_field' do
2832
      issue = Issue.generate!(:status_id => 1, :done_ratio => 30)
2833
      issue.update!(:status => closed_status)
2834

  
2835
      assert_equal 30, issue.done_ratio
2836
      assert_equal 30, issue.read_attribute(:done_ratio)
2837
    end
2838

  
2839
    with_settings :issue_done_ratio => 'issue_status' do
2840
      issue = Issue.generate!(:status_id => 1, :done_ratio => 30)
2841
      issue.update!(:status => closed_status)
2842

  
2843
      assert_equal 90, issue.done_ratio
2844
      assert_equal 90, issue.read_attribute(:done_ratio)
2845
    end
2846

  
2847
    with_settings :issue_done_ratio => 'issue_field_and_closed_status' do
2848
      issue = Issue.generate!(:status_id => 1, :done_ratio => 30)
2849
      issue.update!(:status => closed_status)
2850

  
2851
      assert_equal 100, issue.done_ratio
2852
      assert_equal 100, issue.read_attribute(:done_ratio)
2853
    end
2854
  end
2855

  
2856
  test "done ratio of existing issues follows the new issue_done_ratio setting" do
2857
    closed_status = IssueStatus.find(5)
2858
    closed_status.update!(:default_done_ratio => 90)
2859

  
2860
    issue = Issue.generate!(:status_id => 1, :done_ratio => 30)
2861
    issue.update!(:status => closed_status)
2862

  
2863
    with_settings :issue_done_ratio => 'issue_status' do
2864
      assert_equal 90, issue.done_ratio
2865
      assert_equal 30, issue.read_attribute(:done_ratio)
2866
    end
2867

  
2868
    with_settings :issue_done_ratio => 'issue_field_and_closed_status' do
2869
      assert_equal 100, issue.done_ratio
2870
      assert_equal 30, issue.read_attribute(:done_ratio)
2871
    end
2872

  
2873
    with_settings :issue_done_ratio => 'issue_field' do
2874
      assert_equal 30, issue.done_ratio
2875
      assert_equal 30, issue.read_attribute(:done_ratio)
2876
    end
2877
  end
2878

  
2826 2879
  test "#by_tracker" do
2827 2880
    User.current = User.find(2)
2828 2881
    groups = Issue.by_tracker(Project.find(1))