Feature #10989 » cant_close_before_sub_issues_closed.patch
app/models/issue.rb | ||
---|---|---|
73 | 73 |
validates :estimated_hours, :numericality => {:greater_than_or_equal_to => 0, :allow_nil => true, :message => :invalid} |
74 | 74 |
validates :start_date, :date => true |
75 | 75 |
validates :due_date, :date => true |
76 |
validate :validate_issue, :validate_required_fields |
|
76 |
validate :validate_issue, :validate_required_fields, :validate_subtasks
|
|
77 | 77 |
attr_protected :id |
78 | 78 | |
79 | 79 |
scope :visible, lambda {|*args| |
... | ... | |
757 | 757 |
end |
758 | 758 |
end |
759 | 759 | |
760 |
# Validates the issue against open subtasks |
|
761 |
def validate_subtasks |
|
762 |
if closing? && descendants.open.any? |
|
763 |
errors.add :base, I18n.t(:error_can_not_close_issue_with_open_subtasks) |
|
764 |
end |
|
765 |
end |
|
766 | ||
760 | 767 |
# Set the done_ratio using the status if that setting is set. This will keep the done_ratios |
761 | 768 |
# even if the user turns off the setting later |
762 | 769 |
def update_done_ratio_from_issue_status |
config/locales/en.yml | ||
---|---|---|
215 | 215 |
error_ldap_bind_credentials: "Invalid LDAP Account/Password" |
216 | 216 |
error_no_tracker_allowed_for_new_issue_in_project: "The project doesn't have any trackers for which you can create an issue" |
217 | 217 |
error_no_projects_with_tracker_allowed_for_new_issue: "There are no projects with trackers for which you can create an issue" |
218 |
error_can_not_close_issue_with_open_subtasks: "An issue with open subtasks cannot be closed" |
|
218 | 219 | |
219 | 220 |
mail_subject_lost_password: "Your %{value} password" |
220 | 221 |
mail_body_lost_password: 'To change your password, click on the following link:' |
test/unit/issue_subtasking_test.rb | ||
---|---|---|
306 | 306 |
parent.generate_child!(:estimated_hours => 7) |
307 | 307 |
assert_equal 12, parent.reload.total_estimated_hours |
308 | 308 |
end |
309 | ||
310 |
def test_parent_with_open_subtasks_cannot_be_closed |
|
311 |
parent = Issue.generate! |
|
312 |
parent.generate_child!() |
|
313 |
parent.reload |
|
314 |
parent.status = IssueStatus.where(:is_closed => true).first |
|
315 |
parent.save |
|
316 | ||
317 |
assert_include 'An issue with open subtasks cannot be closed', parent.errors.full_messages |
|
318 |
end |
|
319 | ||
320 |
def test_parent_with_closed_subtasks_can_be_closed |
|
321 |
parent = Issue.generate! |
|
322 |
parent.generate_child!(:status => IssueStatus.where(:is_closed => true).first) |
|
323 |
parent.reload |
|
324 |
closed_status = IssueStatus.where(:is_closed => true).first |
|
325 |
parent.status = closed_status |
|
326 | ||
327 |
assert_save parent |
|
328 |
assert parent.status, closed_status |
|
329 |
end |
|
309 | 330 |
end |