Feature #34861 » 34861.patch
| app/models/news.rb | ||
|---|---|---|
| 36 | 36 |
:author_key => :author_id |
| 37 | 37 |
acts_as_watchable |
| 38 | 38 | |
| 39 |
attr_writer :deleted_attachment_ids |
|
| 40 | ||
| 39 | 41 |
after_create :add_author_as_watcher |
| 42 |
after_save :delete_selected_attachments |
|
| 40 | 43 |
after_create_commit :send_notification |
| 41 | 44 | |
| 42 | 45 |
scope :visible, (lambda do |*args| |
| ... | ... | |
| 45 | 48 |
end) |
| 46 | 49 | |
| 47 | 50 |
safe_attributes 'title', 'summary', 'description' |
| 51 |
safe_attributes( |
|
| 52 |
'deleted_attachment_ids', |
|
| 53 |
:if => |
|
| 54 |
lambda do |news, user| |
|
| 55 |
news.attachments_deletable?(user) |
|
| 56 |
end |
|
| 57 |
) |
|
| 48 | 58 | |
| 49 | 59 |
def visible?(user=User.current) |
| 50 | 60 |
!user.nil? && user.allowed_to?(:view_news, project) |
| ... | ... | |
| 85 | 95 |
visible(user).preload(:author, :project).order("#{News.table_name}.created_on DESC").limit(count).to_a
|
| 86 | 96 |
end |
| 87 | 97 | |
| 98 |
def deleted_attachment_ids |
|
| 99 |
Array(@deleted_attachment_ids).map(&:to_i) |
|
| 100 |
end |
|
| 101 | ||
| 88 | 102 |
private |
| 89 | 103 | |
| 90 | 104 |
def add_author_as_watcher |
| 91 | 105 |
Watcher.create(:watchable => self, :user => author) |
| 92 | 106 |
end |
| 93 | 107 | |
| 108 |
def delete_selected_attachments |
|
| 109 |
if deleted_attachment_ids.present? |
|
| 110 |
objects = attachments.where(:id => deleted_attachment_ids) |
|
| 111 |
attachments.delete(objects) |
|
| 112 |
end |
|
| 113 |
end |
|
| 114 | ||
| 94 | 115 |
def send_notification |
| 95 | 116 |
if Setting.notified_events.include?('news_added')
|
| 96 | 117 |
Mailer.deliver_news_added(self) |
| app/views/news/_form.html.erb | ||
|---|---|---|
| 1 | 1 |
<%= error_messages_for @news %> |
| 2 | 2 | |
| 3 |
<div class="box tabular"> |
|
| 3 |
<div class="box"> |
|
| 4 |
<div class="tabular"> |
|
| 4 | 5 |
<p><%= f.text_field :title, :required => true, :size => 60 %></p> |
| 5 | 6 |
<p><%= f.text_area :summary, :cols => 60, :rows => 2 %></p> |
| 6 | 7 |
<p><%= f.text_area :description, :required => true, :cols => 60, :rows => 15, :class => 'wiki-edit', |
| ... | ... | |
| 8 | 9 |
:auto_complete => true |
| 9 | 10 |
} |
| 10 | 11 |
%></p> |
| 11 |
<p id="attachments_form"><label><%= l(:label_attachment_plural) %></label><%= render :partial => 'attachments/form', :locals => {:container => @news} %></p>
|
|
| 12 |
</div> |
|
| 13 |
<fieldset> |
|
| 14 |
<legend><%= l(:label_attachment_plural) %></legend> |
|
| 15 |
<% if @news.attachments.any? && @news.safe_attribute?('deleted_attachment_ids') -%>
|
|
| 16 |
<div class="contextual"><%= link_to l(:label_edit_attachments), '#', :onclick => "$('#existing-attachments').toggle(); return false;" %></div>
|
|
| 17 |
<div id="existing-attachments" style="<%= 'display:none;' if @news.deleted_attachment_ids.blank? %>"> |
|
| 18 |
<% @news.attachments.each do |attachment| -%> |
|
| 19 |
<span class="existing-attachment"> |
|
| 20 |
<%= text_field_tag nil, attachment.filename, :id => nil, :class => 'icon icon-attachment filename', :disabled => true %> |
|
| 21 |
<label> |
|
| 22 |
<%= check_box_tag 'news[deleted_attachment_ids][]', |
|
| 23 |
attachment.id, |
|
| 24 |
@news.deleted_attachment_ids.include?(attachment.id), |
|
| 25 |
:id => nil, :class => 'deleted_attachment' %> <%= l(:button_delete) %> |
|
| 26 |
</label> |
|
| 27 |
</span> |
|
| 28 |
<% end -%> |
|
| 29 |
<hr /> |
|
| 30 |
</div> |
|
| 31 |
<% end -%> |
|
| 32 |
<div id="new-attachments" style="display:inline-block;"> |
|
| 33 |
<%= render :partial => 'attachments/form', :locals => {:container => @news} %>
|
|
| 34 |
</div> |
|
| 35 |
</fieldset> |
|
| 12 | 36 |
</div> |
| 13 | 37 | |
| 14 | 38 |
<%= wikitoolbar_for 'news_description', preview_news_path(:project_id => @project, :id => @news) %> |
| test/functional/news_controller_test.rb | ||
|---|---|---|
| 224 | 224 |
assert_equal News.find(1), attachment.container |
| 225 | 225 |
end |
| 226 | 226 | |
| 227 |
def test_put_update_with_deleted_attachment_ids |
|
| 228 |
set_tmp_attachments_directory |
|
| 229 |
news = News.find(1) |
|
| 230 |
attachment = Attachment.generate!(:container => news) |
|
| 231 |
assert_include attachment, news.attachments |
|
| 232 |
@request.session[:user_id] = 2 |
|
| 233 |
assert_difference 'Attachment.count', -1 do |
|
| 234 |
put( |
|
| 235 |
:update, |
|
| 236 |
:params => {
|
|
| 237 |
:id => 1, |
|
| 238 |
:news => {
|
|
| 239 |
:description => 'This is the description', |
|
| 240 |
:deleted_attachment_ids => [attachment.id] |
|
| 241 |
} |
|
| 242 |
} |
|
| 243 |
) |
|
| 244 |
end |
|
| 245 |
assert_not_include attachment, news.attachments |
|
| 246 |
end |
|
| 247 | ||
| 227 | 248 |
def test_update_with_failure |
| 228 | 249 |
@request.session[:user_id] = 2 |
| 229 | 250 |
put( |
- « Previous
- 1
- 2
- Next »