# HG changeset patch # Parent 0822d34489f2d6782b88eba36657f9d9ea2b6bf2 # User Toshi MARUYAMA [mq]: issue-13400-trunk-r9702.diff diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -35,3 +35,4 @@ vendor/rails Gemfile.lock Gemfile.local +*.orig diff --git a/app/models/issue.rb b/app/models/issue.rb --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -49,7 +49,7 @@ class Issue < ActiveRecord::Base acts_as_activity_provider :find_options => {:include => [:project, :author, :tracker]}, :author_key => :author_id - DONE_RATIO_OPTIONS = %w(issue_field issue_status) + DONE_RATIO_OPTIONS = %w(issue_field issue_status logged_time) attr_reader :current_journal @@ -75,7 +75,7 @@ class Issue < ActiveRecord::Base :conditions => ["#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"] before_create :default_assign - before_save :close_duplicates, :update_done_ratio_from_issue_status + before_save :close_duplicates, :update_done_ratio after_save {|issue| issue.send :after_project_change if !issue.id_changed? && issue.project_id_changed?} after_save :reschedule_following_issues, :update_nested_set_attributes, :update_parent_attributes, :create_journal after_destroy :update_parent_attributes @@ -355,8 +355,15 @@ class Issue < ActiveRecord::Base end def done_ratio - if Issue.use_status_for_done_ratio? && status && status.default_done_ratio + if use_status_for_done_ratio? status.default_done_ratio + elsif use_time_for_done_ratio? + if estimated_hours && estimated_hours.to_f > 0 + ratio = (total_spent_hours.to_f / estimated_hours.to_f) * 100 + [ratio, 100].min.to_i + else + 0.0 + end else read_attribute(:done_ratio) end @@ -365,10 +372,23 @@ class Issue < ActiveRecord::Base def self.use_status_for_done_ratio? Setting.issue_done_ratio == 'issue_status' end + def use_status_for_done_ratio? + Issue.use_status_for_done_ratio? && status && status.default_done_ratio + end + + def self.use_time_for_done_ratio? + Setting.issue_done_ratio == 'logged_time' + end + def use_time_for_done_ratio? + Issue.use_time_for_done_ratio? + end def self.use_field_for_done_ratio? Setting.issue_done_ratio == 'issue_field' end + def use_field_for_done_ratio? + !(use_status_for_done_ratio? || use_time_for_done_ratio?) + end def validate_issue if self.due_date.nil? && @attributes['due_date'] && !@attributes['due_date'].empty? @@ -417,12 +437,18 @@ class Issue < ActiveRecord::Base # Set the done_ratio using the status if that setting is set. This will keep the done_ratios # even if the user turns off the setting later - 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 + def update_done_ratio + unless use_field_for_done_ratio? + self.done_ratio = self.done_ratio end end + def update_done_ratio! + self.init_journal(User.current, "") + self.update_done_ratio + self.save + end + def init_journal(user, notes = "") @current_journal ||= Journal.new(:journalized => self, :user => user, :notes => notes) if new_record? @@ -904,7 +930,7 @@ class Issue < ActiveRecord::Base end # done ratio = weighted average ratio of leaves - unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio + if p.use_field_for_done_ratio leaves_count = p.leaves.count if leaves_count > 0 average = p.leaves.average(:estimated_hours).to_f diff --git a/app/models/time_entry.rb b/app/models/time_entry.rb --- a/app/models/time_entry.rb +++ b/app/models/time_entry.rb @@ -40,6 +40,8 @@ class TimeEntry < ActiveRecord::Base validates_numericality_of :hours, :allow_nil => true, :message => :invalid validates_length_of :comments, :maximum => 255, :allow_nil => true before_validation :set_project_if_nil + after_save :update_done_ratio + after_destroy :update_done_ratio validate :validate_time_entry scope :visible, lambda {|*args| { @@ -88,6 +90,12 @@ class TimeEntry < ActiveRecord::Base errors.add :issue_id, :invalid if (issue_id && !issue) || (issue && project!=issue.project) end + def update_done_ratio + if issue && Issue.use_time_for_done_ratio? + issue.update_done_ratio! + end + end + def hours=(h) write_attribute :hours, (h.is_a?(String) ? (h.to_hours || h) : h) end diff --git a/config/locales/de.yml b/config/locales/de.yml --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -369,6 +369,7 @@ de: setting_start_of_week: Wochenanfang setting_rest_api_enabled: REST-Schnittstelle aktivieren setting_cache_formatted_text: Formatierten Text im Cache speichern + setting_issue_done_ratio_logged_time: Geschätzter und gebuchter Zeit permission_add_project: Projekt erstellen permission_add_subprojects: Unterprojekte erstellen diff --git a/config/locales/en.yml b/config/locales/en.yml --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -374,6 +374,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_logged_time: Use the logged and estimated time setting_start_of_week: Start calendars on setting_rest_api_enabled: Enable REST web service setting_cache_formatted_text: Cache formatted text diff --git a/test/unit/issue_test.rb b/test/unit/issue_test.rb --- a/test/unit/issue_test.rb +++ b/test/unit/issue_test.rb @@ -1104,7 +1104,7 @@ class IssueTest < ActiveSupport::TestCas end end - context "#update_done_ratio_from_issue_status" do + context "#update_done_ratio" do setup do @issue = Issue.find(1) @issue_status = IssueStatus.find(1) @@ -1120,8 +1120,8 @@ class IssueTest < ActiveSupport::TestCas end should "not change the issue" do - @issue.update_done_ratio_from_issue_status - @issue2.update_done_ratio_from_issue_status + @issue.update_done_ratio + @issue2.update_done_ratio assert_equal 0, @issue.read_attribute(:done_ratio) assert_equal 30, @issue2.read_attribute(:done_ratio) @@ -1134,8 +1134,8 @@ class IssueTest < ActiveSupport::TestCas end should "change the issue's done ratio" do - @issue.update_done_ratio_from_issue_status - @issue2.update_done_ratio_from_issue_status + @issue.update_done_ratio + @issue2.update_done_ratio assert_equal 50, @issue.read_attribute(:done_ratio) assert_equal 0, @issue2.read_attribute(:done_ratio)