OpenProject is the leading open source project management software.
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.
openproject/db/migrate/012_migrate_legacy.rb

123 lines
4.1 KiB

class MigrateLegacy < ActiveRecord::Migration
def self.up
begin
execute "select count(*) from backlogs"
legacy = true
rescue
legacy = false
end
if legacy
if Story.trackers.nil? || Story.trackers.size == 0 || Task.tracker.nil?
raise "Please configure the Backlogs Story and Task trackers before migrating.
You do this by starting Redmine and going to \"Administration -> Plugins -> Redmine Scrum Plugin -> Configure\"
and setting up the Task tracker and one or more Story trackers.
You might have to go to \"Administration -> Trackers\" first
and create new trackers for this purpose. After doing this, stop
redmine and re-run this migration."
end
task_tracker = Task.tracker
story_tracker = Story.trackers[0]
Story.reset_column_information
Issue.reset_column_information
Task.reset_column_information
# close existing transactions and turn on autocommit
ActiveRecord::Base.connection.commit_db_transaction
say_with_time "Migrating Backlogs data..." do
bottom = 0
execute("select coalesce(max(position), 0) from items").each { |row|
bottom = row[0].to_i
}
bottom += 1
connection = ActiveRecord::Base.connection
stories = execute "
select story.issue_id, story.points, sprint.version_id
from items story
join issues on issues.id = story.issue_id
left join items parent on parent.id = story.parent_id and story.parent_id <> 0
left join backlogs sprint on story.backlog_id = sprint.id and sprint.id <> 0
where parent.id is null
order by coalesce(story.position, #{bottom}) desc, story.created_at desc"
stories.each { |row|
id, points, sprint = row
story = Story.find(id)
story.update_attributes(
:tracker_id => story_tracker,
:fixed_version_id => sprint,
:story_points => points
)
# because we're inserting the stories last-first, this
# position gets shifted down 1 spot each time, yielding a
# neatly compacted position list
story.insert_at 1
}
tasks = execute "
select task.issue_id, sprint.version_id, parent.issue_id
from items task
join issues task_issue on task_issue.id = task.issue_id
join items parent on parent.id = task.parent_id and task.parent_id <> 0
join issues parent_issue on parent_issue.id = parent.issue_id
left join backlogs sprint on task.backlog_id = sprint.id and sprint.id <> 0
order by coalesce(task.position, #{bottom}) desc, task.created_at desc"
tasks.each { |row|
id, sprint, parent_id = row
task = Task.find(id)
task.update_attributes(
:tracker_id => task_tracker,
:fixed_version_id => sprint
)
# this must be done before insert_at, because task position
# (see below) is scoped to the parent issue
task.move_to_child_of parent_id
# because we're inserting the tasks last-first, this
# position gets shifted down 1 spot each time, yielding a
# neatly compacted position list
task.insert_at 1
}
res = execute "select version_id, start_date, is_closed from backlogs"
res.each { |row|
version, start_date, is_closed = row
status = connection.quote(is_closed ? 'closed' : 'open')
version = connection.quote(version == 0 ? nil : version)
start_date = connection.quote(start_date)
execute "update versions set status = #{status}, sprint_start_date = #{start_date} where id = #{version}"
}
end
execute %{
insert into burndown_days (version_id, points_committed, points_accepted, created_at)
select version_id, scope, done, backlog_chart_data.created_at
from backlogs
join backlog_chart_data on backlogs.id = backlog_id
}
drop_table 'backlogs'
drop_table 'items'
end
end
def self.down
#pass
end
end