Patch #13400 » issue-13400-trunk-r9702.diff
.hgignore | ||
---|---|---|
35 | 35 |
Gemfile.lock |
36 | 36 |
Gemfile.local |
37 | 37 | |
38 |
*.orig |
app/models/issue.rb | ||
---|---|---|
49 | 49 |
acts_as_activity_provider :find_options => {:include => [:project, :author, :tracker]}, |
50 | 50 |
:author_key => :author_id |
51 | 51 | |
52 |
DONE_RATIO_OPTIONS = %w(issue_field issue_status) |
|
52 |
DONE_RATIO_OPTIONS = %w(issue_field issue_status logged_time)
|
|
53 | 53 | |
54 | 54 |
attr_reader :current_journal |
55 | 55 | |
... | ... | |
75 | 75 |
:conditions => ["#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"] |
76 | 76 | |
77 | 77 |
before_create :default_assign |
78 |
before_save :close_duplicates, :update_done_ratio_from_issue_status
|
|
78 |
before_save :close_duplicates, :update_done_ratio |
|
79 | 79 |
after_save {|issue| issue.send :after_project_change if !issue.id_changed? && issue.project_id_changed?} |
80 | 80 |
after_save :reschedule_following_issues, :update_nested_set_attributes, :update_parent_attributes, :create_journal |
81 | 81 |
after_destroy :update_parent_attributes |
... | ... | |
355 | 355 |
end |
356 | 356 | |
357 | 357 |
def done_ratio |
358 |
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio
|
|
358 |
if use_status_for_done_ratio?
|
|
359 | 359 |
status.default_done_ratio |
360 |
elsif use_time_for_done_ratio? |
|
361 |
if estimated_hours && estimated_hours.to_f > 0 |
|
362 |
ratio = (total_spent_hours.to_f / estimated_hours.to_f) * 100 |
|
363 |
[ratio, 100].min.to_i |
|
364 |
else |
|
365 |
0.0 |
|
366 |
end |
|
360 | 367 |
else |
361 | 368 |
read_attribute(:done_ratio) |
362 | 369 |
end |
... | ... | |
365 | 372 |
def self.use_status_for_done_ratio? |
366 | 373 |
Setting.issue_done_ratio == 'issue_status' |
367 | 374 |
end |
375 |
def use_status_for_done_ratio? |
|
376 |
Issue.use_status_for_done_ratio? && status && status.default_done_ratio |
|
377 |
end |
|
378 | ||
379 |
def self.use_time_for_done_ratio? |
|
380 |
Setting.issue_done_ratio == 'logged_time' |
|
381 |
end |
|
382 |
def use_time_for_done_ratio? |
|
383 |
Issue.use_time_for_done_ratio? |
|
384 |
end |
|
368 | 385 | |
369 | 386 |
def self.use_field_for_done_ratio? |
370 | 387 |
Setting.issue_done_ratio == 'issue_field' |
371 | 388 |
end |
389 |
def use_field_for_done_ratio? |
|
390 |
!(use_status_for_done_ratio? || use_time_for_done_ratio?) |
|
391 |
end |
|
372 | 392 | |
373 | 393 |
def validate_issue |
374 | 394 |
if self.due_date.nil? && @attributes['due_date'] && !@attributes['due_date'].empty? |
... | ... | |
417 | 437 | |
418 | 438 |
# Set the done_ratio using the status if that setting is set. This will keep the done_ratios |
419 | 439 |
# even if the user turns off the setting later |
420 |
def update_done_ratio_from_issue_status
|
|
421 |
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio
|
|
422 |
self.done_ratio = status.default_done_ratio
|
|
440 |
def update_done_ratio |
|
441 |
unless use_field_for_done_ratio?
|
|
442 |
self.done_ratio = self.done_ratio
|
|
423 | 443 |
end |
424 | 444 |
end |
425 | 445 | |
446 |
def update_done_ratio! |
|
447 |
self.init_journal(User.current, "") |
|
448 |
self.update_done_ratio |
|
449 |
self.save |
|
450 |
end |
|
451 | ||
426 | 452 |
def init_journal(user, notes = "") |
427 | 453 |
@current_journal ||= Journal.new(:journalized => self, :user => user, :notes => notes) |
428 | 454 |
if new_record? |
... | ... | |
904 | 930 |
end |
905 | 931 | |
906 | 932 |
# done ratio = weighted average ratio of leaves |
907 |
unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio
|
|
933 |
if p.use_field_for_done_ratio
|
|
908 | 934 |
leaves_count = p.leaves.count |
909 | 935 |
if leaves_count > 0 |
910 | 936 |
average = p.leaves.average(:estimated_hours).to_f |
app/models/time_entry.rb | ||
---|---|---|
40 | 40 |
validates_numericality_of :hours, :allow_nil => true, :message => :invalid |
41 | 41 |
validates_length_of :comments, :maximum => 255, :allow_nil => true |
42 | 42 |
before_validation :set_project_if_nil |
43 |
after_save :update_done_ratio |
|
44 |
after_destroy :update_done_ratio |
|
43 | 45 |
validate :validate_time_entry |
44 | 46 | |
45 | 47 |
scope :visible, lambda {|*args| { |
... | ... | |
88 | 90 |
errors.add :issue_id, :invalid if (issue_id && !issue) || (issue && project!=issue.project) |
89 | 91 |
end |
90 | 92 | |
93 |
def update_done_ratio |
|
94 |
if issue && Issue.use_time_for_done_ratio? |
|
95 |
issue.update_done_ratio! |
|
96 |
end |
|
97 |
end |
|
98 | ||
91 | 99 |
def hours=(h) |
92 | 100 |
write_attribute :hours, (h.is_a?(String) ? (h.to_hours || h) : h) |
93 | 101 |
end |
config/locales/de.yml | ||
---|---|---|
369 | 369 |
setting_start_of_week: Wochenanfang |
370 | 370 |
setting_rest_api_enabled: REST-Schnittstelle aktivieren |
371 | 371 |
setting_cache_formatted_text: Formatierten Text im Cache speichern |
372 |
setting_issue_done_ratio_logged_time: Geschätzter und gebuchter Zeit |
|
372 | 373 | |
373 | 374 |
permission_add_project: Projekt erstellen |
374 | 375 |
permission_add_subprojects: Unterprojekte erstellen |
config/locales/en.yml | ||
---|---|---|
374 | 374 |
setting_issue_done_ratio: Calculate the issue done ratio with |
375 | 375 |
setting_issue_done_ratio_issue_field: Use the issue field |
376 | 376 |
setting_issue_done_ratio_issue_status: Use the issue status |
377 |
setting_issue_done_ratio_logged_time: Use the logged and estimated time |
|
377 | 378 |
setting_start_of_week: Start calendars on |
378 | 379 |
setting_rest_api_enabled: Enable REST web service |
379 | 380 |
setting_cache_formatted_text: Cache formatted text |
test/unit/issue_test.rb | ||
---|---|---|
1104 | 1104 |
end |
1105 | 1105 |
end |
1106 | 1106 | |
1107 |
context "#update_done_ratio_from_issue_status" do
|
|
1107 |
context "#update_done_ratio" do |
|
1108 | 1108 |
setup do |
1109 | 1109 |
@issue = Issue.find(1) |
1110 | 1110 |
@issue_status = IssueStatus.find(1) |
... | ... | |
1120 | 1120 |
end |
1121 | 1121 | |
1122 | 1122 |
should "not change the issue" do |
1123 |
@issue.update_done_ratio_from_issue_status
|
|
1124 |
@issue2.update_done_ratio_from_issue_status
|
|
1123 |
@issue.update_done_ratio |
|
1124 |
@issue2.update_done_ratio |
|
1125 | 1125 | |
1126 | 1126 |
assert_equal 0, @issue.read_attribute(:done_ratio) |
1127 | 1127 |
assert_equal 30, @issue2.read_attribute(:done_ratio) |
... | ... | |
1134 | 1134 |
end |
1135 | 1135 | |
1136 | 1136 |
should "change the issue's done ratio" do |
1137 |
@issue.update_done_ratio_from_issue_status
|
|
1138 |
@issue2.update_done_ratio_from_issue_status
|
|
1137 |
@issue.update_done_ratio |
|
1138 |
@issue2.update_done_ratio |
|
1139 | 1139 | |
1140 | 1140 |
assert_equal 50, @issue.read_attribute(:done_ratio) |
1141 | 1141 |
assert_equal 0, @issue2.read_attribute(:done_ratio) |