Feature #1330 » 1330-copy-wiki-page-with-childs.patch
app/controllers/wiki_controller.rb | ||
---|---|---|
36 | 36 |
before_action :find_wiki, :authorize |
37 | 37 |
before_action :find_existing_or_new_page, :only => [:show, :edit] |
38 | 38 |
before_action :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy, :destroy_version] |
39 |
before_action :find_copy_from, :only => [:show, :update] |
|
39 | 40 |
before_action :find_attachments, :only => [:preview] |
40 | 41 |
accept_api_auth :index, :show, :update, :destroy |
41 | 42 | |
... | ... | |
63 | 64 |
end |
64 | 65 | |
65 | 66 |
def new |
66 |
@page = WikiPage.new(:wiki => @wiki, :title => params[:title]) |
|
67 |
@page = if params[:copy_to_project_id] |
|
68 |
WikiPage.new(:wiki => Project.find(params[:copy_to_project_id]).wiki, :title => (params[:title] || params[:copy_from])) |
|
69 |
else |
|
70 |
WikiPage.new(:wiki => @wiki, :title => (params[:title] || params[:copy_from])) |
|
71 |
end |
|
67 | 72 |
unless User.current.allowed_to?(:edit_wiki_pages, @project) |
68 | 73 |
render_403 |
69 | 74 |
return |
... | ... | |
72 | 77 |
@page.title = '' unless editable? |
73 | 78 |
@page.validate |
74 | 79 |
if @page.errors[:title].blank? |
75 |
path = project_wiki_page_path(@project, @page.title, :parent => params[:parent]) |
|
80 |
if params[:copy_from] |
|
81 |
copy_to_project = Project.find(params[:copy_to_project_id]) |
|
82 |
path = project_wiki_page_path(copy_to_project, @page.title, :parent => params[:parent], :copy_from => params[:copy_from], :copy_from_project_id => @project.id) |
|
83 |
else |
|
84 |
path = project_wiki_page_path(@project, @page.title, :parent => params[:parent]) |
|
85 |
end |
|
76 | 86 |
respond_to do |format| |
77 | 87 |
format.html {redirect_to path} |
78 | 88 |
format.js {render :js => "window.location = #{path.to_json}"} |
79 | 89 |
end |
80 | 90 |
end |
91 |
else |
|
92 |
if params[:copy_from] |
|
93 |
@page = @page.copy |
|
94 |
end |
|
81 | 95 |
end |
82 | 96 |
end |
83 | 97 | |
... | ... | |
136 | 150 | |
137 | 151 |
@content = @page.content_for_version(params[:version]) |
138 | 152 |
@content ||= WikiContent.new(:page => @page) |
153 |
if @copy_from |
|
154 |
@content.text = @copy_from.content.try(:text) |
|
155 |
end |
|
139 | 156 |
@content.text = initial_page_content(@page) if @content.text.blank? |
140 | 157 |
# don't keep previous comment |
141 | 158 |
@content.comments = nil |
... | ... | |
178 | 195 |
end |
179 | 196 |
@content.author = User.current |
180 | 197 | |
181 |
if @page.save_with_content(@content) |
|
198 |
if @page.save_with_content(@content, :copy_from => @copy_from, :copy_attachments => params[:copy_attachments], :copy_child_pages => params[:copy_child_pages])
|
|
182 | 199 |
attachments = Attachment.attach_files(@page, params[:attachments] || (params[:wiki_page] && params[:wiki_page][:uploads])) |
183 | 200 |
render_attachment_warning_if_needed(@page) |
184 | 201 |
call_hook(:controller_wiki_edit_after_save, {:params => params, :page => @page}) |
... | ... | |
373 | 390 |
end |
374 | 391 |
end |
375 | 392 | |
393 |
def find_copy_from |
|
394 |
@copy_from = if params[:copy_from_project_id] && params[:copy_from] |
|
395 |
Project.find(params[:copy_from_project_id]).wiki.try(:find_page, params[:copy_from]) rescue nil |
|
396 |
else |
|
397 |
nil |
|
398 |
end |
|
399 |
end |
|
400 | ||
376 | 401 |
def redirect_to_page(page) |
377 | 402 |
if page.project && page.project.visible? |
378 | 403 |
redirect_to :action => action_name, :project_id => page.project, :id => page.title |
app/helpers/wiki_helper.rb | ||
---|---|---|
46 | 46 |
end |
47 | 47 |
end |
48 | 48 | |
49 |
def wiki_page_project_options_for_select(page) |
|
50 |
projects = Project.allowed_to(:add_wiki_pages).joins(:wiki).preload(:wiki).to_a |
|
51 |
projects.select! {|p| p.enabled_module_names.include?('wiki') } |
|
52 |
projects << page.project unless projects.include?(page.project) |
|
53 | ||
54 |
project_tree_options_for_select(projects, :selected => page.project) |
|
55 |
end |
|
56 | ||
49 | 57 |
def wiki_page_breadcrumb(page) |
50 | 58 |
breadcrumb( |
51 | 59 |
page.ancestors.reverse.collect do |parent| |
app/models/wiki_page.rb | ||
---|---|---|
243 | 243 | |
244 | 244 |
# Saves the page and its content if text was changed |
245 | 245 |
# Return true if the page was saved |
246 |
def save_with_content(content) |
|
246 |
def save_with_content(content, options={ :copy_from => nil, :copy_attachments => false, :copy_child_pages => false})
|
|
247 | 247 |
ret = nil |
248 | 248 |
transaction do |
249 | 249 |
ret = save |
250 | 250 |
if content.text_changed? |
251 | 251 |
begin |
252 | 252 |
self.content = content |
253 |
copy_from, copy_attachments, copy_child_pages = options.values_at(:copy_from, :copy_attachments, :copy_child_pages) |
|
254 |
if copy_from && copy_attachments |
|
255 |
self.attachments = copy_from.attachments.collect do |attachment| |
|
256 |
attachment.copy(:container => self) |
|
257 |
end |
|
258 |
end |
|
259 |
if copy_from && copy_child_pages |
|
260 |
self.children = copy_from.children.collect do |child_page| |
|
261 |
page = child_page.copy(:parent => self) |
|
262 |
unless page.save_with_content(child_page.content.try(:dup), |
|
263 |
:copy_from => child_page, |
|
264 |
:copy_attachments => copy_attachments, |
|
265 |
:copy_child_pages => copy_child_pages) |
|
266 |
page.errors.full_messages.each do |message| |
|
267 |
self.errors.add :base, message |
|
268 |
end |
|
269 |
raise ActiveRecord::RecordNotSaved |
|
270 |
end |
|
271 |
page |
|
272 |
end |
|
273 |
end |
|
253 | 274 |
rescue ActiveRecord::RecordNotSaved |
254 | 275 |
ret = false |
255 | 276 |
end |
... | ... | |
259 | 280 |
ret |
260 | 281 |
end |
261 | 282 | |
283 |
def copy(options={ :parent => nil }) |
|
284 |
wiki_page = self.class.new |
|
285 |
wiki_page.parent = options[:parent] |
|
286 |
wiki_page.wiki = options[:parent].try(:wiki) || self.wiki |
|
287 |
wiki_page.title = self.title |
|
288 |
wiki_page.content = self.content.try(:dup) |
|
289 |
suffix = 1 |
|
290 |
while wiki_page.validate == false && wiki_page.errors[:title].present? |
|
291 |
wiki_page.title = self.title + "_#{suffix}" |
|
292 |
suffix += 1 |
|
293 |
end |
|
294 |
wiki_page |
|
295 |
end |
|
296 | ||
297 |
def has_attachments?(options={ :include_childrens => false }) |
|
298 |
if self.children && options[:include_childrens] |
|
299 |
self.attachments.any? || self.children.any? { |c| c.has_attachments?(options) } |
|
300 |
else |
|
301 |
self.attachments.any? |
|
302 |
end |
|
303 |
end |
|
304 | ||
262 | 305 |
def deleted_attachment_ids |
263 | 306 |
Array(@deleted_attachment_ids).map(&:to_i) |
264 | 307 |
end |
app/views/wiki/_copy_modal.html.erb | ||
---|---|---|
1 |
<h3 class="title"><%=l(:label_wiki_page_copy)%></h3> |
|
2 | ||
3 |
<%= labelled_form_for :page, @page, |
|
4 |
:url => project_copy_wiki_page_path(@project), |
|
5 |
:method => 'post', |
|
6 |
:remote => true do |f| %> |
|
7 | ||
8 |
<%= render_error_messages @page.errors.full_messages_for(:title) %> |
|
9 |
<%= hidden_field_tag 'copy_from_project_id', @project.id %> |
|
10 |
<%= hidden_field_tag 'copy_from', params[:copy_from] %> |
|
11 | ||
12 |
<div class="box tabular"> |
|
13 |
<p> |
|
14 |
<label for="copy_to_project_id"><%=l(:label_project)%><span class="required"> *</span></label> |
|
15 |
<%= select_tag :copy_to_project_id, wiki_page_project_options_for_select(@page), :label => :label_project %></p> |
|
16 |
<p> |
|
17 |
<%= f.text_field :title, :name => 'title', :size => 60, :required => true %> |
|
18 |
<em class="info"><%= l(:text_unallowed_characters) %>: , . / ? ; : |</em> |
|
19 |
</p> |
|
20 |
<% if params[:parent].present? %> |
|
21 |
<p id="copy_parent_page"> |
|
22 |
<label class="inline"> |
|
23 |
<%= check_box_tag 'parent', params[:parent], true %> |
|
24 |
<%= l(:field_parent_title) %>: <%= params[:parent] %> |
|
25 |
</label> |
|
26 |
</p> |
|
27 |
<% end %> |
|
28 |
</div> |
|
29 |
<p class="buttons"> |
|
30 |
<%= submit_tag l(:label_next), :name => nil %> |
|
31 |
<%= submit_tag l(:button_cancel), :name => nil, :onclick => "hideModal(this);", :type => 'button' %> |
|
32 |
</p> |
|
33 |
<% end %> |
|
34 |
<%= javascript_tag do %> |
|
35 |
$('#copy_to_project_id').change(function() { |
|
36 |
if ($('#copy_from_project_id').val()==$(this).val()) { |
|
37 |
$('#copy_parent_page').show(); |
|
38 |
}else{ |
|
39 |
$('#copy_parent_page').hide(); |
|
40 |
} |
|
41 |
}); |
|
42 |
<% end %> |
app/views/wiki/edit.html.erb | ||
---|---|---|
1 | 1 |
<%= wiki_page_breadcrumb(@page) %> |
2 | 2 | |
3 |
<%= error_messages_for 'page' %> |
|
4 | ||
3 | 5 |
<h2><%= @page.pretty_title %></h2> |
4 | 6 | |
5 | 7 |
<%= form_for @content, :as => :content, |
... | ... | |
11 | 13 |
<%= hidden_field_tag 'section_hash', @section_hash %> |
12 | 14 |
<% end %> |
13 | 15 |
<%= error_messages_for 'content' %> |
16 |
<%= hidden_field_tag 'copy_from_project_id', params[:copy_from_project_id] if params[:copy_from_project_id] %> |
|
17 |
<%= hidden_field_tag 'copy_from', params[:copy_from] if params[:copy_from] %> |
|
14 | 18 | |
15 | 19 |
<div class="box tabular"> |
16 | 20 |
<%= text_area_tag 'content[text]', @text, :cols => 100, :rows => 25, :accesskey => accesskey(:edit), |
... | ... | |
34 | 38 |
<% end %> |
35 | 39 | |
36 | 40 |
<p><label><%= l(:field_comments) %></label><%= f.text_field :comments, :size => 120, :maxlength => 1024 %></p> |
41 |
<% if @copy_from && @copy_from.has_attachments?(:include_childrens => true) %> |
|
42 |
<p> |
|
43 |
<label for="copy_attachments"><%= l(:label_copy_attachments) %></label> |
|
44 |
<%= check_box_tag 'copy_attachments', '1', true %> |
|
45 |
</p> |
|
46 |
<% end %> |
|
47 |
<% if @copy_from && @copy_from.children.any? %> |
|
48 |
<p> |
|
49 |
<label for="copy_child_pages"><%= l(:label_copy_child_pages) %></label> |
|
50 |
<%= check_box_tag 'copy_child_pages', '1', true %> |
|
51 |
</p> |
|
52 |
<% end %> |
|
37 | 53 |
<fieldset> |
38 | 54 |
<legend><%=l(:label_attachment_plural)%></legend> |
39 | 55 |
<% if @page.attachments.any? && @page.safe_attribute?('deleted_attachment_ids') %> |
app/views/wiki/new.js.erb | ||
---|---|---|
1 |
$('#ajax-modal').html('<%= escape_javascript(render :partial => 'wiki/new_modal') %>'); |
|
1 |
$('#ajax-modal').html('<%= escape_javascript(render :partial => params['copy_from'] ? 'wiki/copy_modal' : 'wiki/new_modal') %>');
|
|
2 | 2 |
showModal('ajax-modal', '600px'); |
app/views/wiki/show.html.erb | ||
---|---|---|
23 | 23 | |
24 | 24 |
<% if User.current.allowed_to?(:edit_wiki_pages, @project) %> |
25 | 25 |
<%= link_to l(:label_wiki_page_new), new_project_wiki_page_path(@project, :parent => @page.title), :remote => true, :class => 'icon icon-add' %> |
26 |
<%= link_to l(:button_copy), project_copy_wiki_page_path(@project, :copy_from => @page.title, :parent => @page.parent.try(:title)), :remote => true, :class => 'icon icon-copy' %> |
|
26 | 27 |
<% end %> |
27 | 28 |
<% end %> |
28 | 29 |
</div> |
config/locales/en.yml | ||
---|---|---|
857 | 857 |
label_wiki_page: Wiki page |
858 | 858 |
label_wiki_page_plural: Wiki pages |
859 | 859 |
label_wiki_page_new: New wiki page |
860 |
label_wiki_page_copy: Copy wiki page |
|
860 | 861 |
label_index_by_title: Index by title |
861 | 862 |
label_index_by_date: Index by date |
862 | 863 |
label_current_version: Current version |
... | ... | |
1022 | 1023 |
label_export_options: "%{export_format} export options" |
1023 | 1024 |
label_copy_attachments: Copy attachments |
1024 | 1025 |
label_copy_subtasks: Copy subtasks |
1026 |
label_copy_child_pages: Copy child pages |
|
1025 | 1027 |
label_item_position: "%{position} of %{count}" |
1026 | 1028 |
label_completed_versions: Completed versions |
1027 | 1029 |
label_search_for_watchers: Search for watchers to add |
config/locales/ja.yml | ||
---|---|---|
1063 | 1063 |
label_attribute_of_assigned_to: 担当者の %{name} |
1064 | 1064 |
label_attribute_of_fixed_version: 対象バージョンの %{name} |
1065 | 1065 |
label_copy_subtasks: 子チケットをコピー |
1066 |
label_copy_child_pages: 子ページをコピー |
|
1066 | 1067 |
label_copied_to: コピー先 |
1067 | 1068 |
label_copied_from: コピー元 |
1068 | 1069 |
label_any_issues_in_project: 次のプロジェクト内のチケット |
... | ... | |
1199 | 1200 |
mail_body_settings_updated: ! '下記の設定が変更されました:' |
1200 | 1201 |
field_remote_ip: IPアドレス |
1201 | 1202 |
label_wiki_page_new: 新しいWikiページ |
1203 |
label_wiki_page_copy: Wikiページのコピー |
|
1202 | 1204 |
label_relations: 関係 |
1203 | 1205 |
button_filter: フィルタ |
1204 | 1206 |
mail_body_password_updated: パスワードが変更されました。 |
config/routes.rb | ||
---|---|---|
190 | 190 |
end |
191 | 191 | |
192 | 192 |
match 'wiki/index', :controller => 'wiki', :action => 'index', :via => :get |
193 |
match 'wiki/:copy_from/copy', :to => 'wiki#new', :as => 'copy_wiki_page', via: [:get, :post] |
|
193 | 194 |
resources :wiki, :except => [:index, :create], :as => 'wiki_page' do |
194 | 195 |
member do |
195 | 196 |
get 'rename' |
test/functional/wiki_controller_test.rb | ||
---|---|---|
1279 | 1279 |
assert_response :success |
1280 | 1280 |
assert_select 'head>meta[name="robots"]', false |
1281 | 1281 |
end |
1282 | ||
1283 |
def test_get_new_with_copy_from |
|
1284 |
@request.session[:user_id] = 2 |
|
1285 | ||
1286 |
get :new, :params => {:project_id => 'ecookbook', :copy_from => 'CookBook_documentation'} |
|
1287 |
assert_response :success |
|
1288 |
assert_select 'input[name=?][value=?]', 'title', 'CookBook_documentation_1' |
|
1289 |
end |
|
1290 | ||
1291 |
def test_post_new_with_copy_from_should_redirect_to_edit_wity_copy_params |
|
1292 |
@request.session[:user_id] = 2 |
|
1293 | ||
1294 |
post :new, :params => {:project_id => 'ecookbook', :title => 'CookBook documentation 1', :copy_from => 'CookBook_documentation', :copy_to_project_id => 'ecookbook'} |
|
1295 |
assert_redirected_to '/projects/ecookbook/wiki/CookBook_documentation_1?copy_from=CookBook_documentation©_from_project_id=1' |
|
1296 |
end |
|
1297 | ||
1298 |
def test_show_with_copy_from_should_copy_content |
|
1299 |
@request.session[:user_id] = 2 |
|
1300 | ||
1301 |
get :show, :params => {:project_id => 1, :id => 'CookBook_documentation_1', :copy_from => 'CookBook_documentation', :copy_from_project_id => 1} |
|
1302 |
assert_response :success |
|
1303 |
assert_select 'textarea[name=?]', 'content[text]', :text => /h1. CookBook documentation/ |
|
1304 |
assert_select 'textarea[name=?]', 'content[text]', :text => /{{child_pages}}/ |
|
1305 |
assert_select 'textarea[name=?]', 'content[text]', :text => /Some updated \[\[documentation\]\] here with gzipped history/ |
|
1306 |
end |
|
1307 | ||
1308 |
def test_update_with_copy_from_and_copy_attachments_should_copy_attachments |
|
1309 |
@request.session[:user_id] = 2 |
|
1310 | ||
1311 |
assert_difference 'WikiPage.count', 1 do |
|
1312 |
assert_difference 'WikiContent.count', 1 do |
|
1313 |
assert_difference 'Attachment.count', 2 do |
|
1314 |
post :update, :params => { |
|
1315 |
:project_id => 1, |
|
1316 |
:id => 'CookBook_documentation_1', |
|
1317 |
:content => { |
|
1318 |
:comments => 'Copy Wiki Page', |
|
1319 |
:text => 'h1. CookBook documentation', |
|
1320 |
:varsion => 0 |
|
1321 |
}, |
|
1322 |
:copy_from => 'CookBook_documentation', |
|
1323 |
:copy_from_project_id => 1, |
|
1324 |
:copy_attachments => '1' |
|
1325 |
} |
|
1326 |
end |
|
1327 |
end |
|
1328 |
end |
|
1329 |
end |
|
1330 | ||
1331 |
def test_update_with_copy_from_and_copy_child_pages |
|
1332 |
@request.session[:user_id] = 2 |
|
1333 | ||
1334 |
assert_difference 'WikiPage.count', 4 do |
|
1335 |
assert_difference 'WikiContent.count', 4 do |
|
1336 |
post :update, :params => { |
|
1337 |
:project_id => 1, |
|
1338 |
:id => 'Another_page_1', |
|
1339 |
:content => { |
|
1340 |
:comments => 'Copy Wiki Page', |
|
1341 |
:text => 'h1. Another page', |
|
1342 |
:varsion => 0 |
|
1343 |
}, |
|
1344 |
:copy_from => 'Another_page', |
|
1345 |
:copy_from_project_id => 1, |
|
1346 |
:copy_child_pages => '1' |
|
1347 |
} |
|
1348 |
end |
|
1349 |
end |
|
1350 |
end |
|
1282 | 1351 |
end |
test/unit/wiki_page_test.rb | ||
---|---|---|
20 | 20 |
require_relative '../test_helper' |
21 | 21 | |
22 | 22 |
class WikiPageTest < ActiveSupport::TestCase |
23 |
fixtures :projects, :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions |
|
23 |
fixtures :projects, :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions, :users
|
|
24 | 24 | |
25 | 25 |
def setup |
26 | 26 |
User.current = nil |
... | ... | |
207 | 207 |
assert_equal 3, diff.content_to.version |
208 | 208 |
assert_equal 1, diff.content_from.version |
209 | 209 |
end |
210 | ||
211 |
def test_copy |
|
212 |
page = WikiPage.create!(:wiki => @wiki, :title => 'CopyFrom') |
|
213 |
page.content = WikiContent.new(:text => '#h1 Copy From', :comments => 'test') |
|
214 | ||
215 |
copy_page_1 = page.copy |
|
216 |
assert_equal page.wiki, copy_page_1.wiki |
|
217 |
assert_equal '#h1 Copy From', copy_page_1.content.text |
|
218 |
assert_equal 'CopyFrom_1', copy_page_1.title |
|
219 |
copy_page_1.save |
|
220 | ||
221 |
copy_page_2 = page.copy |
|
222 |
assert_equal page.wiki, copy_page_2.wiki |
|
223 |
assert_equal '#h1 Copy From', copy_page_2.content.text |
|
224 |
assert_equal 'CopyFrom_2', copy_page_2.title |
|
225 |
end |
|
226 | ||
227 |
def test_copy_spacify_parent |
|
228 |
parent_page = WikiPage.create!(:wiki => @wiki, :title => 'CopyFrom Parent') |
|
229 |
parent_page.content = WikiContent.new(:text => '#h1 Copy From Parent', :comments => 'test') |
|
230 |
page = WikiPage.create!(:wiki => @wiki, :title => 'CopyFrom', :parent => parent_page) |
|
231 |
page.content = WikiContent.new(:text => '#h1 Copy From', :comments => 'test') |
|
232 |
assert_equal parent_page, page.parent |
|
233 |
assert_equal 1, parent_page.children.count |
|
234 | ||
235 |
copy_page_1 = page.copy(:parent => parent_page) |
|
236 |
assert_equal page.wiki, copy_page_1.wiki |
|
237 |
assert_equal '#h1 Copy From', copy_page_1.content.text |
|
238 |
assert_equal 'CopyFrom_1', copy_page_1.title |
|
239 |
assert_equal parent_page, copy_page_1.parent |
|
240 |
copy_page_1.save |
|
241 |
assert_equal 2, parent_page.children.count |
|
242 | ||
243 |
copy_page_2 = page.copy(:parent => nil) |
|
244 |
assert_equal page.wiki, copy_page_2.wiki |
|
245 |
assert_equal '#h1 Copy From', copy_page_2.content.text |
|
246 |
assert_equal 'CopyFrom_2', copy_page_2.title |
|
247 |
assert_nil copy_page_2.parent |
|
248 |
copy_page_2.save |
|
249 |
assert_equal 2, parent_page.children.count |
|
250 |
end |
|
251 | ||
252 |
def test_has_attachments |
|
253 |
page = WikiPage.create!(:wiki => @wiki, :title => 'Parent') |
|
254 |
child1 = WikiPage.create!(:wiki => @wiki, :title => 'Child1', :parent => page) |
|
255 |
child11 = WikiPage.create!(:wiki => @wiki, :title => 'Child11', :parent => child1) |
|
256 |
Attachment.generate!(:container => child11, :filename => 'test.txt') |
|
257 |
page.reload |
|
258 | ||
259 |
assert_equal true, page.has_attachments?(:include_childrens => true) |
|
260 |
assert_equal false, page.has_attachments?(:include_childrens => false) |
|
261 |
assert_equal false, page.has_attachments? |
|
262 |
assert_equal false, child1.has_attachments?(:include_childrens => true) |
|
263 |
assert_equal false, child1.has_attachments?(:include_childrens => false) |
|
264 |
assert_equal false, child1.has_attachments? |
|
265 |
assert_equal true, child11.has_attachments?(:include_childrens => true) |
|
266 |
assert_equal true, child11.has_attachments?(:include_childrens => false) |
|
267 |
assert_equal true, child11.has_attachments? |
|
268 |
end |
|
269 | ||
270 |
def test_save_with_content_with_copy_options |
|
271 |
page = WikiPage.create!(:wiki => @wiki, :title => 'Parent') |
|
272 |
page.content = WikiContent.new(:text => '#h1 Copy From Content', :comments => 'test') |
|
273 |
page.save |
|
274 |
child1 = WikiPage.create!(:wiki => @wiki, :title => 'Child1', :parent => page) |
|
275 |
child1.content = WikiContent.new(:text => '#h1 Copy From Child Content', :comments => 'test') |
|
276 |
Attachment.generate!(:container => child1, :filename => 'test.txt') |
|
277 |
page.reload |
|
278 | ||
279 |
new_page = WikiPage.new(:wiki => @wiki, :title => 'Parent_1') |
|
280 |
content = page.content.dup |
|
281 |
content.text = '#h1 Copy to Content' |
|
282 |
assert new_page.save_with_content(content, :copy_from => page, :copy_attachments => true, :copy_child_pages => true) |
|
283 |
assert_equal '#h1 Copy to Content', new_page.content.text |
|
284 |
assert_equal 1, new_page.children.count |
|
285 |
assert_equal 'Child1_1', new_page.children.first.title |
|
286 |
assert_equal 1, new_page.children.first.attachments.count |
|
287 |
end |
|
210 | 288 |
end |