Skip to content

Update done_ratio to 100% when issue is closed #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion app/models/issue.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ class Issue < ActiveRecord::Base

acts_as_mentionable :attributes => ['description']

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

attr_reader :transition_warning
attr_writer :deleted_attachment_ids
Expand Down Expand Up @@ -735,6 +735,8 @@ def workflow_rule_by_attribute(user=nil)
def done_ratio
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio
status.default_done_ratio
elsif Issue.use_issue_field_and_closed_status_for_done_ratio? && status && status.is_closed?
100
else
read_attribute(:done_ratio)
end
Expand All @@ -748,6 +750,14 @@ def self.use_field_for_done_ratio?
Setting.issue_done_ratio == 'issue_field'
end

def self.use_issue_field_and_closed_status_for_done_ratio?
Setting.issue_done_ratio == 'issue_field_and_closed_status'
end

def self.done_ratio_editable?
use_field_for_done_ratio? || use_issue_field_and_closed_status_for_done_ratio?
end

def validate_issue
if due_date && start_date && (start_date_changed? || due_date_changed?) && due_date < start_date
errors.add :due_date, :greater_than_start_date
Expand Down Expand Up @@ -860,6 +870,8 @@ def validate_custom_field_values
def update_done_ratio_from_issue_status
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio
self.done_ratio = status.default_done_ratio
elsif Issue.use_issue_field_and_closed_status_for_done_ratio? && status && status.is_closed?
self.done_ratio = 100
end
end

Expand Down
2 changes: 1 addition & 1 deletion app/views/issues/_attributes.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@
<p><%= f.hours_field :estimated_hours, :size => 3, :required => @issue.required_attribute?('estimated_hours') %> <%= l(:field_hours) %></p>
<% end %>

<% if @issue.safe_attribute?('done_ratio') && Issue.use_field_for_done_ratio? %>
<% if @issue.safe_attribute?('done_ratio') && Issue.done_ratio_editable? %>
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }), :required => @issue.required_attribute?('done_ratio') %></p>
<% end %>
</div>
Expand Down
2 changes: 1 addition & 1 deletion app/views/issues/bulk_edit.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@
</p>
<% end %>

<% if @safe_attributes.include?('done_ratio') && Issue.use_field_for_done_ratio? %>
<% if @safe_attributes.include?('done_ratio') && Issue.done_ratio_editable? %>
<p>
<label for='issue_done_ratio'><%= l(:field_done_ratio) %></label>
<%= 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]) %>
Expand Down
1 change: 1 addition & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,7 @@ en:
setting_issue_done_ratio: Calculate the issue done ratio with
setting_issue_done_ratio_issue_field: Use the issue field
setting_issue_done_ratio_issue_status: Use the issue status
setting_issue_done_ratio_issue_field_and_closed_status: Use the issue field (100% if closed)
setting_start_of_week: Start calendars on
setting_rest_api_enabled: Enable REST web service
setting_cache_formatted_text: Cache formatted text
Expand Down
1 change: 1 addition & 0 deletions config/locales/ja.yml
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,7 @@ ja:
setting_issue_done_ratio: 進捗率の算出方法
setting_issue_done_ratio_issue_field: チケットのフィールドを使用
setting_issue_done_ratio_issue_status: チケットのステータスに連動
setting_issue_done_ratio_issue_field_and_closed_status: チケットのフィールドを使用(終了したチケットは100%)
setting_start_of_week: 週の開始曜日
setting_rest_api_enabled: RESTによるWebサービスを有効にする
setting_default_notification_option: デフォルトのメール通知オプション
Expand Down
53 changes: 53 additions & 0 deletions test/unit/issue_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2921,6 +2921,59 @@ def test_saving_twice_should_not_duplicate_journal_details
end
end

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

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

assert_equal 30, issue.done_ratio
assert_equal 30, issue.read_attribute(:done_ratio)
end

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

assert_equal 90, issue.done_ratio
assert_equal 90, issue.read_attribute(:done_ratio)
end

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

assert_equal 100, issue.done_ratio
assert_equal 100, issue.read_attribute(:done_ratio)
end
end

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

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

with_settings :issue_done_ratio => 'issue_status' do
assert_equal 90, issue.done_ratio
assert_equal 30, issue.read_attribute(:done_ratio)
end

with_settings :issue_done_ratio => 'issue_field_and_closed_status' do
assert_equal 100, issue.done_ratio
assert_equal 30, issue.read_attribute(:done_ratio)
end

with_settings :issue_done_ratio => 'issue_field' do
assert_equal 30, issue.done_ratio
assert_equal 30, issue.read_attribute(:done_ratio)
end
end

test "#by_tracker" do
User.current = User.find(2)
groups = Issue.by_tracker(Project.find(1))
Expand Down