Defect #38966 » fix-38966-remove_attachment_after_custom_value_deleted.patch
lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb | ||
---|---|---|
29 | 29 |
return if self.included_modules.include?(Redmine::Acts::Customizable::InstanceMethods) |
30 | 30 |
cattr_accessor :customizable_options |
31 | 31 |
self.customizable_options = options |
32 |
before_destroy :preserve_custom_field_attachment_data |
|
32 | 33 |
has_many :custom_values, lambda {includes(:custom_field)}, |
33 | 34 |
:as => :customized, |
34 | 35 |
:inverse_of => :customized, |
... | ... | |
38 | 39 |
send :include, Redmine::Acts::Customizable::InstanceMethods |
39 | 40 |
validate :validate_custom_field_values |
40 | 41 |
after_save :save_custom_field_values |
42 |
after_destroy :destroy_custom_field_attachments |
|
41 | 43 |
end |
42 | 44 |
end |
43 | 45 | |
... | ... | |
170 | 172 |
super |
171 | 173 |
end |
172 | 174 | |
175 |
def preserve_custom_field_attachment_data |
|
176 |
@custom_field_attachment_data = self.custom_values.select{ |cv| cv.custom_field.field_format == 'attachment'}.map(&:id) |
|
177 |
end |
|
178 | ||
179 |
def destroy_custom_field_attachments |
|
180 |
@custom_field_attachment_data.each do |container_id| |
|
181 |
Attachment.where(:container_id => container_id, :container_type => 'CustomValue').destroy_all |
|
182 |
end |
|
183 |
end |
|
184 | ||
173 | 185 |
module ClassMethods |
174 | 186 |
end |
175 | 187 |
end |
test/unit/issue_test.rb | ||
---|---|---|
2163 | 2163 |
end |
2164 | 2164 |
end |
2165 | 2165 | |
2166 |
def test_destroy_should_delete_attachments_on_custom_values |
|
2167 |
cf = IssueCustomField.create!(:name => 'Attachable field', :field_format => 'attachment', :is_for_all => true, :tracker_ids => [1]) |
|
2168 |
user = User.find(2) |
|
2169 |
issue = Issue.new(:project_id => 1, :tracker_id => 1, :subject => 'test', :author_id => user.id) |
|
2170 |
attachment = Attachment.create!(:container => issue,:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => user.id) |
|
2171 |
issue.send( |
|
2172 |
:safe_attributes=, |
|
2173 |
{ |
|
2174 |
'custom_fields' => |
|
2175 |
[ |
|
2176 |
{'id' => cf.id.to_s, 'value' => attachment.id.to_s}, |
|
2177 |
] |
|
2178 |
}, user |
|
2179 |
) |
|
2180 | ||
2181 |
assert_difference 'CustomValue.where(:customized_type => "Issue").count', -(issue.custom_values.count) do |
|
2182 |
assert_difference 'Attachment.count', -1 do |
|
2183 |
issue.destroy |
|
2184 |
end |
|
2185 |
end |
|
2186 |
end |
|
2187 | ||
2166 | 2188 |
def test_destroying_a_deleted_issue_should_not_raise_an_error |
2167 | 2189 |
issue = Issue.find(1) |
2168 | 2190 |
Issue.find(1).destroy |