Feature #34258 ยป 34258-copy-tracker.patch
| app/controllers/trackers_controller.rb | ||
|---|---|---|
| 36 | 36 |
def new |
| 37 | 37 |
@tracker ||= Tracker.new(:default_status => IssueStatus.sorted.first) |
| 38 | 38 |
@tracker.safe_attributes = params[:tracker] |
| 39 |
if params[:copy].present? && @copy_from = Tracker.find_by_id(params[:copy]) |
|
| 40 |
@tracker.copy_from(@copy_from) |
|
| 41 |
end |
|
| 39 | 42 |
@trackers = Tracker.sorted.to_a |
| 40 | 43 |
@projects = Project.all |
| 41 | 44 |
end |
| app/models/tracker.rb | ||
|---|---|---|
| 76 | 76 |
'project_ids', |
| 77 | 77 |
'description') |
| 78 | 78 | |
| 79 |
def copy_from(arg, options={})
|
|
| 80 |
return unless arg.present? |
|
| 81 | ||
| 82 |
tracker = arg.is_a?(Tracker) ? arg : Tracker.find_by_id(arg.to_s) |
|
| 83 |
self.attributes = tracker.attributes.dup.except("id", "name", "position")
|
|
| 84 |
self.custom_field_ids = tracker.custom_field_ids.dup |
|
| 85 |
self.project_ids = tracker.project_ids.dup |
|
| 86 |
self |
|
| 87 |
end |
|
| 88 | ||
| 79 | 89 |
def to_s; name end |
| 80 | 90 | |
| 81 | 91 |
def <=>(tracker) |
| app/views/trackers/_form.html.erb | ||
|---|---|---|
| 39 | 39 | |
| 40 | 40 |
<% if @tracker.new_record? && @trackers.any? %> |
| 41 | 41 |
<p><label for="copy_workflow_from"><%= l(:label_copy_workflow_from) %></label> |
| 42 |
<%= select_tag(:copy_workflow_from, content_tag("option") + options_from_collection_for_select(@trackers, :id, :name)) %></p>
|
|
| 42 |
<%= select_tag(:copy_workflow_from, content_tag("option") + options_from_collection_for_select(@trackers, :id, :name, @copy_from.try(:id))) %></p>
|
|
| 43 | 43 |
<% end %> |
| 44 | 44 |
<!--[eoform:tracker]--> |
| 45 | 45 |
</div> |
| app/views/trackers/index.html.erb | ||
|---|---|---|
| 28 | 28 |
</td> |
| 29 | 29 |
<td class="buttons"> |
| 30 | 30 |
<%= reorder_handle(tracker) %> |
| 31 |
<%= link_to l(:button_copy), new_tracker_path(:copy => tracker), :class => 'icon icon-copy' %> |
|
| 31 | 32 |
<%= delete_link tracker_path(tracker) %> |
| 32 | 33 |
</td> |
| 33 | 34 |
</tr> |
| test/functional/trackers_controller_test.rb | ||
|---|---|---|
| 54 | 54 |
end |
| 55 | 55 |
end |
| 56 | 56 | |
| 57 |
def test_new_with_copy |
|
| 58 |
core_fields = ["assigned_to_id", "category_id", "fixed_version_id", "parent_issue_id", "start_date", "due_date"] |
|
| 59 |
custom_field_ids = custom_field_ids = [1, 2, 6] |
|
| 60 |
project_ids = [1, 3, 5] |
|
| 61 | ||
| 62 |
copy_from = Tracker.find(1) |
|
| 63 |
copy_from.core_fields = core_fields |
|
| 64 |
copy_from.custom_field_ids = custom_field_ids |
|
| 65 |
copy_from.project_ids = project_ids |
|
| 66 |
copy_from.save |
|
| 67 | ||
| 68 |
get :new, :params => {:copy => copy_from.id.to_s}
|
|
| 69 |
assert_response :success |
|
| 70 |
assert_select 'input[name=?]', 'tracker[name]' |
|
| 71 | ||
| 72 |
assert_select 'form' do |
|
| 73 |
# blank name |
|
| 74 |
assert_select 'input[name=?][value=""]', 'tracker[name]' |
|
| 75 |
# core field checked |
|
| 76 |
copy_from.core_fields.each do |core_field| |
|
| 77 |
assert_select "input[type=checkbox][name=?][value=#{core_field}][checked=checked]", 'tracker[core_fields][]'
|
|
| 78 |
end |
|
| 79 |
# core field not checked |
|
| 80 |
copy_from.disabled_core_fields do |core_field| |
|
| 81 |
assert_select "input[type=checkbox][name=?][value=#{core_field}]", 'tracker[core_fields][]'
|
|
| 82 |
end |
|
| 83 |
# custom field checked |
|
| 84 |
custom_field_ids.each do |custom_field_id| |
|
| 85 |
assert_select "input[type=checkbox][name=?][value=#{custom_field_id}][checked=checked]", 'tracker[custom_field_ids][]'
|
|
| 86 |
end |
|
| 87 |
# custom field not checked |
|
| 88 |
(IssueCustomField.sorted.pluck(:id) - custom_field_ids).each do |custom_field_id| |
|
| 89 |
assert_select "input[type=checkbox][name=?][value=#{custom_field_id}]", 'tracker[custom_field_ids][]'
|
|
| 90 |
end |
|
| 91 |
# project checked |
|
| 92 |
project_ids.each do |project_id| |
|
| 93 |
assert_select "input[type=checkbox][name=?][value=#{project_id}][checked=checked]", 'tracker[project_ids][]'
|
|
| 94 |
end |
|
| 95 |
# project not checked |
|
| 96 |
(Project.all.pluck(:id) - project_ids).each do |project_id| |
|
| 97 |
assert_select "input[type=checkbox][name=?][value=#{project_id}]", 'tracker[project_ids][]'
|
|
| 98 |
end |
|
| 99 |
# workflow copy selected |
|
| 100 |
assert_select 'select[name=?]', 'copy_workflow_from' do |
|
| 101 |
assert_select 'option[value="1"][selected=selected]' |
|
| 102 |
end |
|
| 103 |
end |
|
| 104 |
end |
|
| 105 | ||
| 57 | 106 |
def test_create |
| 58 | 107 |
assert_difference 'Tracker.count' do |
| 59 | 108 |
post :create, :params => {
|
| test/unit/tracker_test.rb | ||
|---|---|---|
| 46 | 46 |
assert_equal [2], project.rolled_up_trackers(false).visible(user).map(&:id) |
| 47 | 47 |
end |
| 48 | 48 | |
| 49 |
def test_copy_from |
|
| 50 |
tracker = Tracker.find(1) |
|
| 51 |
copy = Tracker.new.copy_from(tracker) |
|
| 52 | ||
| 53 |
assert_nil copy.id |
|
| 54 |
assert_nil copy.position |
|
| 55 |
assert_equal '', copy.name |
|
| 56 |
assert_equal tracker.default_status_id, copy.default_status_id |
|
| 57 |
assert_equal tracker.is_in_roadmap, copy.is_in_roadmap |
|
| 58 |
assert_equal tracker.core_fields, copy.core_fields |
|
| 59 |
assert_equal tracker.description, copy.description |
|
| 60 | ||
| 61 |
copy.name = 'Copy' |
|
| 62 |
assert copy.save |
|
| 63 |
end |
|
| 64 | ||
| 65 |
def test_copy_from_should_copy_custom_fields |
|
| 66 |
tracker = Tracker.generate!(:custom_field_ids => [1, 2, 6]) |
|
| 67 |
copy = Tracker.new.copy_from(tracker) |
|
| 68 |
assert_equal [1, 2, 6], copy.custom_field_ids.sort |
|
| 69 |
end |
|
| 70 | ||
| 71 |
def test_copy_from_should_copy_projects |
|
| 72 |
tracker = Tracker.generate!(:project_ids => [1, 2, 3, 4, 5, 6]) |
|
| 73 |
copy = Tracker.new.copy_from(tracker) |
|
| 74 |
assert_equal [1, 2, 3, 4, 5, 6], copy.project_ids.sort |
|
| 75 |
end |
|
| 76 | ||
| 49 | 77 |
def test_copy_workflows |
| 50 | 78 |
source = Tracker.find(1) |
| 51 | 79 |
rules_count = source.workflow_rules.count |