Feature #34862 » 34862.patch
app/models/message.rb | ||
---|---|---|
51 | 51 |
:author_key => :author_id |
52 | 52 |
acts_as_watchable |
53 | 53 | |
54 |
attr_writer :deleted_attachment_ids |
|
55 | ||
54 | 56 |
validates_presence_of :board, :subject, :content |
55 | 57 |
validates_length_of :subject, :maximum => 255 |
56 | 58 |
validate :cannot_reply_to_locked_topic, :on => :create |
... | ... | |
58 | 60 |
after_create :add_author_as_watcher, :reset_counters! |
59 | 61 |
after_update :update_messages_board |
60 | 62 |
after_destroy :reset_counters! |
63 |
after_save :delete_selected_attachments |
|
61 | 64 |
after_create_commit :send_notification |
62 | 65 | |
63 | 66 |
scope :visible, (lambda do |*args| |
... | ... | |
73 | 76 |
user.allowed_to?(:edit_messages, message.project) |
74 | 77 |
end |
75 | 78 |
) |
79 |
safe_attributes( |
|
80 |
'deleted_attachment_ids', |
|
81 |
:if => |
|
82 |
lambda do |message, user| |
|
83 |
message.attachments_deletable?(user) |
|
84 |
end |
|
85 |
) |
|
86 | ||
76 | 87 |
def visible?(user=User.current) |
77 | 88 |
!user.nil? && user.allowed_to?(:view_messages, project) |
78 | 89 |
end |
... | ... | |
121 | 132 |
project.notified_users.reject {|user| !visible?(user)} |
122 | 133 |
end |
123 | 134 | |
135 |
def deleted_attachment_ids |
|
136 |
Array(@deleted_attachment_ids).map(&:to_i) |
|
137 |
end |
|
138 | ||
124 | 139 |
private |
125 | 140 | |
126 | 141 |
def add_author_as_watcher |
127 | 142 |
Watcher.create(:watchable => self.root, :user => author) |
128 | 143 |
end |
129 | 144 | |
145 |
def delete_selected_attachments |
|
146 |
if deleted_attachment_ids.present? |
|
147 |
objects = attachments.where(:id => deleted_attachment_ids) |
|
148 |
attachments.delete(objects) |
|
149 |
end |
|
150 |
end |
|
151 | ||
130 | 152 |
def send_notification |
131 | 153 |
if Setting.notified_events.include?('message_posted') |
132 | 154 |
Mailer.deliver_message_posted(self) |
app/views/messages/_form.html.erb | ||
---|---|---|
32 | 32 |
<%= wikitoolbar_for 'message_content', preview_board_message_path(:board_id => @board, :id => @message) %> |
33 | 33 |
<!--[eoform:message]--> |
34 | 34 | |
35 |
<p><%= l(:label_attachment_plural) %><br /> |
|
36 |
<%= render :partial => 'attachments/form', :locals => {:container => @message} %></p> |
|
35 |
<fieldset> |
|
36 |
<legend><%= l(:label_attachment_plural) %></legend> |
|
37 |
<% if @message.attachments.any? && @message.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="<%= 'display:none;' if @message.deleted_attachment_ids.blank? %>"> |
|
40 |
<% @message.attachments.each do |attachment| -%> |
|
41 |
<span class="existing-attachment"> |
|
42 |
<%= text_field_tag nil, attachment.filename, :id => nil, :class => 'filename', :disabled => true %> |
|
43 |
<label> |
|
44 |
<%= check_box_tag 'message[deleted_attachment_ids][]', |
|
45 |
attachment.id, |
|
46 |
@message.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', :locals => {:container => @message} %> |
|
56 |
</div> |
|
57 |
</fieldset> |
|
37 | 58 |
</div> |
test/functional/messages_controller_test.rb | ||
---|---|---|
21 | 21 | |
22 | 22 |
class MessagesControllerTest < Redmine::ControllerTest |
23 | 23 |
fixtures :projects, :users, :email_addresses, :user_preferences, :members, :member_roles, :roles, :boards, :messages, :enabled_modules, |
24 |
:watchers |
|
24 |
:watchers, :attachments
|
|
25 | 25 | |
26 | 26 |
def setup |
27 | 27 |
User.current = nil |
... | ... | |
235 | 235 |
assert_equal Board.find(2), message.board |
236 | 236 |
end |
237 | 237 | |
238 |
def test_post_edit_with_deleted_attachment_ids |
|
239 |
set_tmp_attachments_directory |
|
240 |
@request.session[:user_id] = 2 |
|
241 |
message = Message.find(1) |
|
242 |
attachment = message.attachments.first |
|
243 |
assert_difference 'Attachment.count', -1 do |
|
244 |
post( |
|
245 |
:edit, |
|
246 |
:params => { |
|
247 |
:board_id => 1, |
|
248 |
:id => 1, |
|
249 |
:message => { |
|
250 |
:subject => 'New subject', |
|
251 |
:content => 'New body', |
|
252 |
:deleted_attachment_ids => [attachment.id] |
|
253 |
} |
|
254 |
} |
|
255 |
) |
|
256 |
end |
|
257 |
message.reload |
|
258 |
assert_not_includes message.attachments, attachment |
|
259 |
end |
|
260 | ||
238 | 261 |
def test_reply |
239 | 262 |
@request.session[:user_id] = 2 |
240 | 263 |
post( |