kanbanworkflowstimelinescrumrubyroadmapproject-planningproject-managementopenprojectangularissue-trackerifcgantt-chartganttbug-trackerboardsbcf
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
3.3 KiB
77 lines
3.3 KiB
#-- copyright
|
|
# OpenProject is a project management system.
|
|
# Copyright (C) 2012-2017 the OpenProject Foundation (OPF)
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License version 3.
|
|
#
|
|
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
|
|
# Copyright (C) 2006-2017 Jean-Philippe Lang
|
|
# Copyright (C) 2010-2013 the ChiliProject Team
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#
|
|
# See doc/COPYRIGHT.rdoc for more details.
|
|
#++
|
|
|
|
##
|
|
# Goes through all attachments looking for ones whose 'file' column, which is the new column
|
|
# used by the carrierwave-based attachments, is not set.
|
|
#
|
|
# For every one of those attachments the migration then sets the 'file' column to
|
|
# whatever the value of the legacy column 'filename' is. If that one is empty too
|
|
# it falls back to the 'disk_filename' column. This one was not meant to be displayed
|
|
# to users but it's better than nothing, especially when trying to identify corrupt attachments.
|
|
#
|
|
# If *that* column is empty too, the attachment is broken beyond repair and will be dropped.
|
|
#
|
|
# Note: Just because the 'file' column is restored doesn't mean the actual file exists.
|
|
# Rather the 'file' column being empty means precisely that the file is missing.
|
|
# By still writing the filename into the file column the attachment can at least
|
|
# be displayed, if not downloaded.
|
|
#
|
|
# Important: The migration is irreversible.
|
|
class PatchCorruptAttachments < ActiveRecord::Migration[4.2]
|
|
def up
|
|
Attachment.all.each do |attachment|
|
|
patch_attachment attachment
|
|
end
|
|
end
|
|
|
|
def down
|
|
puts "Won't revert this migration as it would mean breaking valid attachments. \
|
|
We could break the attachments with missing files again by deleting their
|
|
file column to restore the state before the migration. But that doesn't help.".squish
|
|
end
|
|
|
|
def patch_attachment(attachment)
|
|
attributes = attachment.attributes
|
|
if attributes['file'].blank?
|
|
# fall back to disk filename if necessary
|
|
file = attributes['filename'].presence || attributes['disk_filename'].presence
|
|
|
|
if file
|
|
attachment.update_column :file, file
|
|
puts "updated attachment #{attachment.id}'s file column: #{file}"
|
|
else
|
|
# this really shouldn't happen - but just in case it does, it is more sensible
|
|
# to just delete the attachment because it will just break things
|
|
puts "could not patch #{attachment.inspect} - missing file name information - \
|
|
it's hopeless ... deleting it".squish
|
|
attachment.destroy
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|