Feature #16410 » diff-r17405.patch
| app/models/wiki_page.rb | ||
|---|---|---|
| 40 | 40 |
:permission => :view_wiki_pages, |
| 41 | 41 |
:project_key => "#{Wiki.table_name}.project_id"
|
| 42 | 42 | |
| 43 |
attr_accessor :redirect_existing_links |
|
| 43 | ||
| 44 |
attr_accessor :redirect_existing_links, :deleted_attachment_ids |
|
| 44 | 45 | |
| 45 | 46 |
validates_presence_of :title |
| 46 | 47 |
validates_format_of :title, :with => /\A[^,\.\/\?\;\|\s]*\z/ |
| ... | ... | |
| 51 | 52 |
validate :validate_parent_title |
| 52 | 53 |
before_destroy :delete_redirects |
| 53 | 54 |
before_save :handle_rename_or_move, :update_wiki_start_page |
| 54 |
after_save :handle_children_move |
|
| 55 |
after_save :handle_children_move, :delete_selected_attachments
|
|
| 55 | 56 | |
| 56 | 57 |
# eager load information about last updates, without loading text |
| 57 | 58 |
scope :with_updated_on, lambda { preload(:content_without_text) }
|
| ... | ... | |
| 65 | 66 |
safe_attributes 'is_start_page', |
| 66 | 67 |
:if => lambda {|page, user| user.allowed_to?(:manage_wiki, page.project)}
|
| 67 | 68 | |
| 68 |
def initialize(attributes=nil, *args) |
|
| 69 |
safe_attributes 'deleted_attachment_ids', |
|
| 70 |
:if => lambda {|page, user| page.attachments_deletable?(user)}
|
|
| 71 | ||
| 72 |
def initialize(attributes=nil, *args) |
|
| 69 | 73 |
super |
| 70 | 74 |
if new_record? && DEFAULT_PROTECTED_PAGES.include?(title.to_s.downcase) |
| 71 | 75 |
self.protected = true |
| ... | ... | |
| 251 | 255 |
ret |
| 252 | 256 |
end |
| 253 | 257 | |
| 258 |
def deleted_attachment_ids |
|
| 259 |
Array(@deleted_attachment_ids).map(&:to_i) |
|
| 260 |
end |
|
| 261 | ||
| 262 |
def delete_selected_attachments |
|
| 263 |
if deleted_attachment_ids.present? |
|
| 264 |
objects = attachments.where(:id => deleted_attachment_ids.map(&:to_i)) |
|
| 265 |
attachments.delete(objects) |
|
| 266 |
end |
|
| 267 |
end |
|
| 268 | ||
| 254 | 269 |
protected |
| 255 | 270 | |
| 256 | 271 |
def validate_parent_title |
| app/views/wiki/edit.html.erb | ||
|---|---|---|
| 16 | 16 |
<%= text_area_tag 'content[text]', @text, :cols => 100, :rows => 25, |
| 17 | 17 |
:class => 'wiki-edit', :accesskey => accesskey(:edit) %> |
| 18 | 18 | |
| 19 |
<fieldset class='wiki-items'> |
|
| 19 | 20 |
<% if @page.safe_attribute_names.include?('parent_id') && @wiki.pages.any? %>
|
| 20 | 21 |
<%= fields_for @page do |fp| %> |
| 21 | 22 |
<p> |
| ... | ... | |
| 30 | 31 |
<% end %> |
| 31 | 32 | |
| 32 | 33 |
<p><label><%= l(:field_comments) %></label><%= f.text_field :comments, :size => 120, :maxlength => 1024 %></p> |
| 33 |
<p><label><%=l(:label_attachment_plural)%></label><%= render :partial => 'attachments/form' %></p> |
|
| 34 |
</fieldset> |
|
| 35 |
<fieldset> |
|
| 36 |
<legend><%=l(:label_attachment_plural)%></legend> |
|
| 37 |
<% if @page.attachments.any? && @page.safe_attribute?('deleted_attachment_ids') %>
|
|
| 38 |
<div class="contextual"><%= link_to l(:label_edit_attachments), '#', :onclick => "$('#existing-attachments').toggle(); return false;" %></div>
|
|
| 39 |
<div id="existing-attachments" style="<%= @page.deleted_attachment_ids.blank? ? 'display:none;' : '' %>"> |
|
| 40 |
<% @page.attachments.each do |attachment| %> |
|
| 41 |
<span class="existing-attachment"> |
|
| 42 |
<%= text_field_tag '', attachment.filename, :class => "icon icon-attachment filename", :disabled => true %> |
|
| 43 |
<label class='inline'> |
|
| 44 |
<%= check_box_tag 'wiki_page[deleted_attachment_ids][]', |
|
| 45 |
attachment.id, |
|
| 46 |
@page.deleted_attachment_ids.include?(attachment.id), |
|
| 47 |
:id => nil, :class => "deleted_attachment" %> <%= l(:button_delete) %> |
|
| 48 |
</label> |
|
| 49 |
</span> |
|
| 50 |
<% end %> |
|
| 51 |
<hr /> |
|
| 52 |
</div> |
|
| 53 |
<% end %> |
|
| 54 |
<div id="new-attachments" style="display:inline-block;"> |
|
| 55 |
<%= render :partial => 'attachments/form' %> |
|
| 56 |
</div> |
|
| 57 |
</fieldset> |
|
| 34 | 58 |
</div> |
| 35 | 59 | |
| 36 | 60 |
<p> |
| public/stylesheets/application.css | ||
|---|---|---|
| 695 | 695 |
width: 175px; |
| 696 | 696 |
} |
| 697 | 697 | |
| 698 |
.tabular .wiki-items label {
|
|
| 699 |
margin-left: -260px; |
|
| 700 |
width: 175px; |
|
| 701 |
} |
|
| 702 | ||
| 698 | 703 |
.tabular label.floating{
|
| 699 | 704 |
font-weight: normal; |
| 700 | 705 |
margin-left: 0px; |
| test/functional/wiki_controller_test.rb | ||
|---|---|---|
| 459 | 459 |
assert_equal 1, page.content.version |
| 460 | 460 |
end |
| 461 | 461 | |
| 462 |
def test_update_with_deleted_attachment_ids |
|
| 463 |
@request.session[:user_id] = 2 |
|
| 464 |
page = WikiPage.find(4) |
|
| 465 |
attachment = page.attachments.first |
|
| 466 |
assert_difference 'Attachment.count', -1 do |
|
| 467 |
put :update, :params => {
|
|
| 468 |
:project_id => page.wiki.project.id, |
|
| 469 |
:id => page.title, |
|
| 470 |
:content => {
|
|
| 471 |
:comments => 'delete file', # failure here, comment is too long |
|
| 472 |
:text => 'edited' |
|
| 473 |
}, |
|
| 474 |
:wiki_page => {:deleted_attachment_ids => [attachment.id]}
|
|
| 475 |
} |
|
| 476 |
end |
|
| 477 |
page.reload |
|
| 478 |
refute_includes page.attachments, attachment |
|
| 479 |
end |
|
| 480 | ||
| 481 |
def test_update_with_deleted_attachment_ids_and_failure_should_preserve_selected_attachments |
|
| 482 |
@request.session[:user_id] = 2 |
|
| 483 |
page = WikiPage.find(4) |
|
| 484 |
attachment = page.attachments.first |
|
| 485 |
assert_no_difference 'Attachment.count' do |
|
| 486 |
put :update, :params => {
|
|
| 487 |
:project_id => page.wiki.project.id, |
|
| 488 |
:id => page.title, |
|
| 489 |
:content => {
|
|
| 490 |
:comments => 'a' * 1300, # failure here, comment is too long |
|
| 491 |
:text => 'edited' |
|
| 492 |
}, |
|
| 493 |
:wiki_page => {:deleted_attachment_ids => [attachment.id]}
|
|
| 494 |
} |
|
| 495 |
end |
|
| 496 |
page.reload |
|
| 497 |
assert_includes page.attachments, attachment |
|
| 498 |
end |
|
| 499 | ||
| 462 | 500 |
def test_update_stale_page_should_not_raise_an_error |
| 463 | 501 |
@request.session[:user_id] = 2 |
| 464 | 502 |
c = Wiki.find(1).find_page('Another_page').content
|