diff --git a/db/migrate/20101201000002_validate_migration_integrity.rb b/db/migrate/20101201000003_validate_migration_integrity.rb
similarity index 97%
rename from db/migrate/20101201000002_validate_migration_integrity.rb
rename to db/migrate/20101201000003_validate_migration_integrity.rb
index 18a6295d766..949a28f9f7e 100644
--- a/db/migrate/20101201000002_validate_migration_integrity.rb
+++ b/db/migrate/20101201000003_validate_migration_integrity.rb
@@ -28,7 +28,7 @@ class ValidateMigrationIntegrity < ActiveRecord::Migration[4.2]
def self.up
initial_migration_version = "20101210192618"
- last_squashed_migration_version = "20110606160200"
+ last_squashed_migration_version = "20110817173455"
initial_migration_has_run = ActiveRecord::SchemaMigration.where(version: initial_migration_version).exists?
last_squashed_migration_has_run = ActiveRecord::SchemaMigration.where(version: last_squashed_migration_version).exists?
diff --git a/db/migrate/20101210192618_init_canvas_db.rb b/db/migrate/20101210192618_init_canvas_db.rb
index c17ebd2894f..d0187b06fd5 100644
--- a/db/migrate/20101210192618_init_canvas_db.rb
+++ b/db/migrate/20101210192618_init_canvas_db.rb
@@ -133,8 +133,8 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
t.boolean "require_authorization_code"
t.string "default_time_zone"
t.string "external_status", :default => "active"
- t.integer "storage_quota"
- t.integer "default_storage_quota"
+ t.integer "storage_quota", :limit => 8
+ t.integer "default_storage_quota", :limit => 8
t.boolean "enable_user_notes", :default => false
t.string "allowed_services"
t.text "turnitin_pledge"
@@ -148,6 +148,7 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
t.text "settings"
t.string "sis_name"
t.string "uuid"
+ t.string "default_locale"
end
add_index "accounts", ["id", "type"], :name => "index_accounts_on_id_and_type"
@@ -157,6 +158,21 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
add_index "accounts", ["sis_source_id"], :name => "index_accounts_on_sis_source_id"
add_index "accounts", ["type"], :name => "index_accounts_on_type"
+ create_table :alerts do |t|
+ t.integer :context_id, :limit => 8
+ t.string :context_type
+ t.text :recipients
+ t.integer :repetition
+
+ t.timestamps null: true
+ end
+
+ create_table :alert_criteria do |t|
+ t.integer :alert_id, :limit => 8
+ t.string :criterion_type
+ t.float :threshold
+ end
+
create_table "assessment_question_bank_users", :force => true do |t|
t.integer "assessment_question_bank_id", :limit => 8
t.integer "user_id", :limit => 8
@@ -648,6 +664,8 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
create_table "conversations" do |t|
t.string "private_hash" # for quick lookups so we know whether or not we need to create a new one
+ t.boolean "has_attachments", :default => false, :null => false
+ t.boolean "has_media_objects", :default => false, :null => false
end
add_index "conversations", ["private_hash"], :unique => true
@@ -658,6 +676,10 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
t.boolean "subscribed", :default => true
t.string "workflow_state"
t.datetime "last_authored_at"
+ t.boolean "has_attachments", :default => false, :null => false
+ t.boolean "has_media_objects", :default => false, :null => false
+ t.integer "message_count", :default => 0
+ t.string "label"
end
add_index "conversation_participants", ["conversation_id"]
add_index "conversation_participants", ["user_id", "last_message_at"]
@@ -668,6 +690,10 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
t.datetime "created_at"
t.boolean "generated"
t.text "body"
+ t.text "forwarded_message_ids"
+ t.string "media_comment_id"
+ t.string "media_comment_type"
+ t.integer "context_message_id", :limit => 8
end
add_index "conversation_messages", ["conversation_id", "created_at"]
@@ -675,6 +701,7 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
t.integer "conversation_message_id", :limit => 8
t.integer "conversation_participant_id", :limit => 8
end
+ add_index :conversation_message_participants, [:conversation_participant_id, :conversation_message_id], :name => :index_cmp_on_cpi_and_cmi
create_table "course_account_associations", :force => true do |t|
t.integer "course_id", :limit => 8
@@ -724,6 +751,7 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
t.boolean "restrict_enrollments_to_section_dates"
t.integer "account_id", :limit => 8
t.integer "nonxlist_course_id", :limit => 8
+ t.boolean "sticky_xlist"
end
add_index "course_sections", ["course_id"], :name => "index_course_sections_on_course_id"
@@ -766,7 +794,7 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
t.string "sis_batch_id"
t.boolean "show_all_discussion_entries"
t.boolean "open_enrollment"
- t.integer "storage_quota"
+ t.integer "storage_quota", :limit => 8
t.text "tab_configuration"
t.boolean "allow_wiki_comments"
t.text "turnitin_comments"
@@ -777,6 +805,8 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
t.string "sis_course_code"
t.boolean "restrict_enrollments_to_course_dates"
t.integer "template_course_id", :limit => 8
+ t.string "locale"
+ t.text "settings"
end
add_index "courses", ["abstract_course_id"], :name => "index_courses_on_abstract_course_id"
@@ -851,6 +881,7 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
t.datetime "updated_at"
t.integer "user_id", :limit => 8
t.string "name"
+ t.string "redirect_uri"
end
create_table "discussion_entries", :force => true do |t|
@@ -1183,7 +1214,7 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
t.string "join_level"
t.string "default_view", :default => "feed"
t.string "migration_id"
- t.integer "storage_quota"
+ t.integer "storage_quota", :limit => 8
t.string "uuid"
t.integer "root_account_id", :limit => 8
t.string "sis_source_id"
@@ -1223,6 +1254,7 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
add_index "inbox_items", ["sender_id"], :name => "index_inbox_items_on_sender_id"
add_index "inbox_items", ["user_id"], :name => "index_inbox_items_on_user_id"
add_index "inbox_items", ["workflow_state"], :name => "index_inbox_items_on_workflow_state"
+ add_index :inbox_items, [:asset_type, :asset_id]
create_table "learning_outcome_groups", :force => true do |t|
t.integer "context_id", :limit => 8
@@ -1466,6 +1498,7 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
t.boolean "participated"
t.boolean "summarized"
t.integer "account_id", :limit => 8
+ t.integer "real_user_id", :limit => 8
end
execute("ALTER TABLE #{PageView.quoted_table_name} ADD PRIMARY KEY (request_id)")
@@ -1928,6 +1961,7 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
t.string "context_code"
t.integer "media_object_id", :limit => 8
t.text "turnitin_data"
+ t.boolean "has_admin_comment", :default => false, :null => false
end
add_index "submissions", ["assignment_id", "submission_type"], :name => "index_submissions_on_assignment_id_and_submission_type"
@@ -2029,7 +2063,7 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
t.integer "unread_inbox_items_count"
t.integer "reminder_time_for_due_dates", :default => 172800
t.integer "reminder_time_for_grading", :default => 0
- t.integer "storage_quota"
+ t.integer "storage_quota", :limit => 8
t.string "visible_inbox_types"
t.datetime "last_user_note"
t.boolean "subscribe_to_emails"
@@ -2037,6 +2071,9 @@ class InitCanvasDb < ActiveRecord::Migration[4.2]
t.string "sis_name"
t.text "preferences"
t.string "avatar_state"
+ t.string "locale"
+ t.string "browser_locale"
+ t.integer "unread_conversations_count", :default => 0
end
add_index "users", ["avatar_state", "avatar_image_updated_at"], :name => "index_users_on_avatar_state_and_avatar_image_updated_at"
diff --git a/db/migrate/20101216224513_create_delayed_jobs.rb b/db/migrate/20101216224513_create_delayed_jobs.rb
index 759d0b7bfbc..15dd16ba4ce 100644
--- a/db/migrate/20101216224513_create_delayed_jobs.rb
+++ b/db/migrate/20101216224513_create_delayed_jobs.rb
@@ -52,14 +52,30 @@ class CreateDelayedJobs < ActiveRecord::Migration[4.2]
table.string :strand
end
- # "nulls first" syntax is postgresql specific, and allows for more
- # efficient querying for the next job
- connection.execute("CREATE INDEX get_delayed_jobs_index ON #{Delayed::Backend::ActiveRecord::Job.quoted_table_name} (priority, run_at, failed_at nulls first, locked_at nulls first, queue)")
add_index :delayed_jobs, [:tag]
- add_index :delayed_jobs, :strand
+ add_index :delayed_jobs, %w(run_at queue locked_at strand priority), :name => 'index_delayed_jobs_for_get_next'
+ add_index :delayed_jobs, %w(strand id), :name => 'index_delayed_jobs_on_strand'
+
+ create_table :failed_jobs do |t|
+ t.integer "priority", :default => 0
+ t.integer "attempts", :default => 0
+ t.string "handler", :limit => 512000
+ t.integer "original_id", :limit => 8
+ t.text "last_error"
+ t.string "queue"
+ t.datetime "run_at"
+ t.datetime "locked_at"
+ t.datetime "failed_at"
+ t.string "locked_by"
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ t.string "tag"
+ t.integer "max_attempts"
+ t.string "strand"
+ end
end
def self.down
- drop_table :delayed_jobs
+ raise ActiveRecord::IrreversibleMigration
end
end
diff --git a/db/migrate/20110609212540_message_attachments_and_media_objects.rb b/db/migrate/20110609212540_message_attachments_and_media_objects.rb
deleted file mode 100644
index fea9b65e8bc..00000000000
--- a/db/migrate/20110609212540_message_attachments_and_media_objects.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class MessageAttachmentsAndMediaObjects < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- add_column :conversations, :has_attachments, :boolean
- add_column :conversations, :has_media_objects, :boolean
- add_column :conversation_participants, :has_attachments, :boolean
- add_column :conversation_participants, :has_media_objects, :boolean
- end
-
- def self.down
- remove_column :conversations, :has_attachments
- remove_column :conversations, :has_media_objects
- remove_column :conversation_participants, :has_attachments
- remove_column :conversation_participants, :has_media_objects
- end
-end
diff --git a/db/migrate/20110610163600_add_sticky_xlisting.rb b/db/migrate/20110610163600_add_sticky_xlisting.rb
deleted file mode 100644
index 33c86e7fb2a..00000000000
--- a/db/migrate/20110610163600_add_sticky_xlisting.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class AddStickyXlisting < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- add_column :course_sections, :sticky_xlist, :boolean
- end
-
- def self.down
- remove_column :course_sections, :sticky_xlist
- end
-end
diff --git a/db/migrate/20110610213249_optimize_delayed_jobs.rb b/db/migrate/20110610213249_optimize_delayed_jobs.rb
deleted file mode 100644
index 272d680a9ff..00000000000
--- a/db/migrate/20110610213249_optimize_delayed_jobs.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class OptimizeDelayedJobs < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.connection
- Delayed::Backend::ActiveRecord::Job.connection
- end
-
- def self.up
- create_table :failed_jobs do |t|
- t.integer "priority", :default => 0
- t.integer "attempts", :default => 0
- t.string "handler", :limit => 512000
- t.integer "original_id", :limit => 8
- t.text "last_error"
- t.string "queue"
- t.datetime "run_at"
- t.datetime "locked_at"
- t.datetime "failed_at"
- t.string "locked_by"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "tag"
- t.integer "max_attempts"
- t.string "strand"
- end
-
- remove_index :delayed_jobs, :name => 'get_delayed_jobs_index'
- remove_index :delayed_jobs, [:strand]
-
- add_index :delayed_jobs, %w(run_at queue locked_at strand priority), :name => 'index_delayed_jobs_for_get_next'
- add_index :delayed_jobs, %w(strand id), :name => 'index_delayed_jobs_on_strand'
-
- # move all failed jobs to the new failed table
- Delayed::Backend::ActiveRecord::Job.where("failed_at IS NOT NULL").find_each do |job|
- job.fail! unless job.on_hold?
- end
- end
-
- def self.down
- raise ActiveRecord::IrreversibleMigration
- end
-end
diff --git a/db/migrate/20110617200149_convert_storage_quotas_to_bytes.rb b/db/migrate/20110617200149_convert_storage_quotas_to_bytes.rb
deleted file mode 100644
index af588a72c04..00000000000
--- a/db/migrate/20110617200149_convert_storage_quotas_to_bytes.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class ConvertStorageQuotasToBytes < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- FIELDS_TO_FIX = [
- [ User, :storage_quota ],
- [ Account, :storage_quota ],
- [ Account, :default_storage_quota ],
- [ Course, :storage_quota ],
- [ Group, :storage_quota ],
- ]
-
- def self.up
- FIELDS_TO_FIX.each do |klass, field|
- change_column klass.table_name.to_s, field, :integer, :limit => 8
- update("UPDATE #{klass.quoted_table_name} SET #{field} = #{field} * 1024 * 1024 WHERE #{field} IS NOT NULL AND #{field} < 1024 * 1024")
- end
- end
-
- def self.down
- FIELDS_TO_FIX.each do |klass, field|
- change_column klass.table_name.to_s, field, :integer, :limit => 4
- update("UPDATE #{klass.quoted_table_name} SET #{field} = #{field} / 1024 * 1024 WHERE #{field} IS NOT NULL AND #{field} >= 1024 * 1024")
- end
- end
-end
diff --git a/db/migrate/20110708151915_add_real_user_id_to_page_views.rb b/db/migrate/20110708151915_add_real_user_id_to_page_views.rb
deleted file mode 100644
index 116d8725c0a..00000000000
--- a/db/migrate/20110708151915_add_real_user_id_to_page_views.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class AddRealUserIdToPageViews < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- add_column :page_views, :real_user_id, :integer, :limit => 8
- end
-
- def self.down
- remove_column :page_views, :real_user_id
- end
-end
diff --git a/db/migrate/20110708231141_locale_prefs.rb b/db/migrate/20110708231141_locale_prefs.rb
deleted file mode 100644
index 302e112715f..00000000000
--- a/db/migrate/20110708231141_locale_prefs.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class LocalePrefs < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- add_column :users, :locale, :string
- add_column :users, :browser_locale, :string
- add_column :courses, :locale, :string
- add_column :accounts, :default_locale, :string
- end
-
- def self.down
- remove_column :users, :locale
- remove_column :users, :browser_locale
- remove_column :courses, :locale
- remove_column :accounts, :default_locale
- end
-end
diff --git a/db/migrate/20110720185610_create_alerts.rb b/db/migrate/20110720185610_create_alerts.rb
deleted file mode 100644
index 9f1c4c7526b..00000000000
--- a/db/migrate/20110720185610_create_alerts.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class CreateAlerts < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- create_table :alerts do |t|
- t.integer :context_id, :limit => 8
- t.string :context_type
- t.text :recipients
- t.integer :repetition
-
- t.timestamps null: true
- end
-
- create_table :alert_criteria do |t|
- t.integer :alert_id, :limit => 8
- t.string :criterion_type
- t.float :threshold
- end
- end
-
- def self.down
- drop_table :alert_criteria
- drop_table :alerts
- end
-end
diff --git a/db/migrate/20110801034931_message_counts.rb b/db/migrate/20110801034931_message_counts.rb
deleted file mode 100644
index 51c985c18a6..00000000000
--- a/db/migrate/20110801034931_message_counts.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class MessageCounts < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- add_column :conversation_participants, :message_count, :int, :default => 0
- update <<-SQL
- UPDATE #{ConversationParticipant.quoted_table_name}
- SET message_count = (
- SELECT COUNT(*)
- FROM #{ConversationMessage.quoted_table_name}, #{ConversationMessageParticipant.quoted_table_name}
- WHERE conversation_messages.conversation_id = conversation_participants.conversation_id
- AND NOT conversation_messages.generated
- AND conversation_messages.id = conversation_message_participants.conversation_message_id
- AND conversation_participant_id = conversation_participants.id
- )
- SQL
- end
-
- def self.down
- remove_column :conversation_participants, :message_count
- end
-end
diff --git a/db/migrate/20110801080015_message_forwards.rb b/db/migrate/20110801080015_message_forwards.rb
deleted file mode 100644
index 30430f311fa..00000000000
--- a/db/migrate/20110801080015_message_forwards.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class MessageForwards < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- add_column :conversation_messages, :forwarded_message_ids, :text
- end
-
- def self.down
- remove_column :conversation_messages, :forwarded_message_ids
- end
-end
diff --git a/db/migrate/20110803192001_unread_counts.rb b/db/migrate/20110803192001_unread_counts.rb
deleted file mode 100644
index cec83185475..00000000000
--- a/db/migrate/20110803192001_unread_counts.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class UnreadCounts < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- add_column :users, :unread_conversations_count, :int, :default => 0
- update <<-SQL
- UPDATE #{User.quoted_table_name}
- SET unread_conversations_count = (
- SELECT COUNT(*)
- FROM #{ConversationParticipant.quoted_table_name}
- WHERE workflow_state = 'unread'
- AND last_message_at IS NOT NULL
- AND user_id = users.id
- )
- SQL
- end
-
- def self.down
- remove_column :users, :unread_conversations_count
- end
-end
diff --git a/db/migrate/20110804195852_label_conversations.rb b/db/migrate/20110804195852_label_conversations.rb
deleted file mode 100644
index af9bd66b3ba..00000000000
--- a/db/migrate/20110804195852_label_conversations.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class LabelConversations < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- add_column :conversation_participants, :label, :string
- end
-
- def self.down
- remove_column :conversation_participants, :label
- end
-end
diff --git a/db/migrate/20110805003024_add_developer_key_redirect_uri.rb b/db/migrate/20110805003024_add_developer_key_redirect_uri.rb
deleted file mode 100644
index be3419c95be..00000000000
--- a/db/migrate/20110805003024_add_developer_key_redirect_uri.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class AddDeveloperKeyRedirectUri < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- add_column :developer_keys, :redirect_uri, :string
- end
-
- def self.down
- remove_column :developer_keys, :redirect_uri
- end
-end
diff --git a/db/migrate/20110809193507_fix_duplicate_discussions.rb b/db/migrate/20110809193507_fix_duplicate_discussions.rb
deleted file mode 100644
index e050a8d24ef..00000000000
--- a/db/migrate/20110809193507_fix_duplicate_discussions.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class FixDuplicateDiscussions < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- DiscussionTopic.transaction do
- duplicate_topics = DiscussionTopic.
- select([:old_assignment_id, :context_id, :context_type]).
- where("old_assignment_id IS NOT NULL AND workflow_state <> 'deleted' AND root_topic_id IS NULL AND context_type='Course'").
- group('old_assignment_id, context_id, context_type HAVING COUNT(*) > 1').to_a
-
- duplicate_topics.each do |topic|
- duplicates = DiscussionTopic.
- where("context_id=? AND context_type=? AND old_assignment_id=? AND workflow_state<>'deleted' AND root_topic_id is null",
- topic.context_id, topic.context_type, topic.old_assignment_id).
- order('updated_at DESC').to_a
- to_keep = duplicates.shift
-
- DiscussionEntry.where(:discussion_topic_id => duplicates).update_all(:discussion_topic_id => to_keep)
- DiscussionTopic.where(:root_topic_id => duplicates).update_all(:root_topic_id => to_keep)
- DiscussionTopic.delete(duplicates)
- end
- end
- end
-
- def self.down
- end
-end
diff --git a/db/migrate/20110809221718_add_settings_to_courses.rb b/db/migrate/20110809221718_add_settings_to_courses.rb
deleted file mode 100644
index 635d581305f..00000000000
--- a/db/migrate/20110809221718_add_settings_to_courses.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class AddSettingsToCourses < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- add_column :courses, :settings, :text
- end
-
- def self.down
- remove_column :courses, :settings
- end
-end
diff --git a/db/migrate/20110810194057_conversations_has_attachments_not_null.rb b/db/migrate/20110810194057_conversations_has_attachments_not_null.rb
deleted file mode 100644
index 47dc4f61f0f..00000000000
--- a/db/migrate/20110810194057_conversations_has_attachments_not_null.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class ConversationsHasAttachmentsNotNull < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- [:conversations, :conversation_participants].each do |table|
- [:has_attachments, :has_media_objects].each do |column|
- change_column_null table, column, false, false
- change_column_default table, column, false
- end
- end
- end
-
- def self.down
- [:conversations, :conversation_participants].each do |table|
- [:has_attachments, :has_media_objects].each do |column|
- change_column_null table, column, true
- change_column_default table, column, nil
- end
- end
- end
-end
diff --git a/db/migrate/20110816152405_new_inbox_media_comments.rb b/db/migrate/20110816152405_new_inbox_media_comments.rb
deleted file mode 100644
index 1af5538de99..00000000000
--- a/db/migrate/20110816152405_new_inbox_media_comments.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class NewInboxMediaComments < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- add_column :conversation_messages, :media_comment_id, :string
- add_column :conversation_messages, :media_comment_type, :string
- end
-
- def self.down
- remove_column :conversation_messages, :media_comment_id
- remove_column :conversation_messages, :media_comment_type
- end
-end
diff --git a/db/migrate/20110816203511_message_migration.rb b/db/migrate/20110816203511_message_migration.rb
deleted file mode 100644
index ce475c53d4f..00000000000
--- a/db/migrate/20110816203511_message_migration.rb
+++ /dev/null
@@ -1,307 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class MessageMigration < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- add_index :conversation_message_participants, [:conversation_participant_id, :conversation_message_id], :name => :index_cmp_on_cpi_and_cmi
- add_index :inbox_items, [:asset_type, :asset_id]
-
- # for bringing over attachments and tracking deleted inbox_items
- # the other new columns get removed at the end of the migration, we'll keep this one for now
- # in case we need to track/fix any issues post migration
- add_column :conversation_messages, :context_message_id, :integer, :limit => 8
-
- return if Rails.env.test?
-
- unless connection.adapter_name =~ /postgres/
- $stderr.puts "don't know how to migrate conversation data for #{connection.adapter_name}!"
- return
- end
-
- # for grouping messages into conversations
- # private: list of participant ids <= 2
- # group: root_context_message_id + list of participant ids (if the list changes, it's a different conversation)
- add_column :conversations, :migration_signature, :text
-
- # helper column for merging into existing private conversations
- add_column :conversations, :tmp_private_hash, :string
-
- # from context_message, will get rolled up into conversation_participant
- add_column :conversation_message_participants, :unread, :boolean
-
- execute <<-SQL
- CREATE TEMPORARY TABLE __migrated_messages AS
- SELECT
- id,
- user_id AS author_id,
- created_at,
- CASE WHEN subject IS NULL OR LOWER(SUBSTR(subject, 1, 4)) = 're: ' THEN body ELSE subject || #{connection.quote("\n\n")} || body END AS body,
- COALESCE(root_context_message_id, id) AS root_context_message_id,
- media_comment_id,
- media_comment_type,
- '::TEXT' AS signature
- FROM
- #{connection.quote_table_name('context_messages')}
- SQL
- execute "CREATE INDEX index__migrated_messages_on_id ON __migrated_messages (id)"
-
- execute <<-SQL
- CREATE TEMPORARY TABLE __migrated_message_participants AS
- SELECT DISTINCT
- context_message_id AS migrated_message_id,
- user_id
- FROM
- #{connection.quote_table_name('context_message_participants')}
- SQL
- execute "CREATE INDEX index_mmp_on_message_id ON __migrated_message_participants (migrated_message_id)"
-
- execute <<-SQL
- CREATE TEMPORARY TABLE __migrated_message_participant_strings AS
- SELECT migrated_message_id, STRING_AGG(user_id::TEXT, ',') AS participants, COUNT(DISTINCT user_id) <= 2 AS private
- FROM (
- SELECT DISTINCT migrated_message_id, user_id
- FROM __migrated_message_participants
- ORDER BY migrated_message_id, user_id
- ) p
- GROUP BY migrated_message_id
- SQL
- execute "CREATE INDEX index_mmps_on_migrated_message_id ON __migrated_message_participant_strings (migrated_message_id)"
-
- execute <<-SQL
- UPDATE __migrated_messages
- SET signature = CASE WHEN private THEN '' ELSE root_context_message_id || ':' END || participants
- FROM __migrated_message_participant_strings
- WHERE migrated_message_id = __migrated_messages.id
- SQL
- execute "CREATE INDEX index___migrated_messages_on_signature ON __migrated_messages (signature)"
-
- execute <<-SQL
- INSERT INTO #{Conversation.quoted_table_name}(migration_signature, has_attachments, has_media_objects)
- SELECT DISTINCT signature, FALSE, FALSE
- FROM __migrated_messages
- SQL
- add_index :conversations, :migration_signature
-
- Conversation.where("migration_signature ~ E'^[0-9]+(,[0-9]+)?$'").find_each(:batch_size => 10000) do |conversation|
- conversation.update_attribute :tmp_private_hash, Digest::SHA1.hexdigest(conversation.migration_signature)
- end
- add_index :conversations, :tmp_private_hash
-
- # in case any private conversations already exist...
- update <<-SQL
- UPDATE #{Conversation.quoted_table_name}
- SET migration_signature = c2.migration_signature
- FROM #{Conversation.quoted_table_name} c2
- WHERE conversations.private_hash = c2.tmp_private_hash
- SQL
- execute <<-SQL
- CREATE TEMPORARY TABLE __existing_private_conversations AS
- SELECT private_hash FROM #{Conversation.quoted_table_name} WHERE private_hash IS NOT NULL
- SQL
- delete <<-SQL
- DELETE FROM #{Conversation.quoted_table_name} WHERE tmp_private_hash IN (SELECT private_hash FROM __existing_private_conversations)
- SQL
-
- # create participants for any group conversations or *new* private conversations
- remove_index :conversation_participants, :column => [:user_id, :last_message_at]
- add_index :conversation_participants, :user_id # temporary for better insert speeds (and to prevent people hitting new messaging from killing the db)
- subquery = "SELECT DISTINCT ON (signature) signature, id FROM __migrated_messages ORDER BY signature, id DESC"
- execute <<-SQL
- INSERT INTO #{ConversationParticipant.quoted_table_name}(conversation_id, user_id, subscribed, workflow_state, has_attachments, has_media_objects)
- SELECT c.id, mp.user_id, TRUE, 'read', FALSE, FALSE
- FROM __migrated_message_participants mp,
- (#{subquery}) AS m,
- #{Conversation.quoted_table_name} c
- WHERE migrated_message_id = m.id
- AND migration_signature = signature
- AND private_hash IS NULL
- SQL
- # make sure new private conversations have their hash set
- update <<-SQL
- UPDATE #{Conversation.quoted_table_name}
- SET private_hash = tmp_private_hash
- WHERE tmp_private_hash IS NOT NULL
- SQL
-
- execute <<-SQL
- INSERT INTO #{ConversationMessage.quoted_table_name}(conversation_id, author_id, created_at, generated, body, media_comment_id, media_comment_type, context_message_id)
- SELECT
- conversations.id,
- author_id,
- created_at,
- FALSE,
- body,
- media_comment_id,
- media_comment_type,
- __migrated_messages.id
- FROM
- __migrated_messages, #{Conversation.quoted_table_name}
- WHERE
- signature = migration_signature
- SQL
-
-
- # make messages visible to users
- execute <<-SQL
- INSERT INTO #{ConversationMessageParticipant.quoted_table_name}(conversation_message_id, conversation_participant_id, unread)
- SELECT
- cm.id,
- cp.id,
- ii.workflow_state = 'unread'
- FROM
- #{ConversationMessage.quoted_table_name} cm,
- #{ConversationParticipant.quoted_table_name} cp,
- #{connection.quote_table_name('inbox_items')} ii
- WHERE
- cm.conversation_id = cp.conversation_id
- AND ii.asset_id = cm.context_message_id
- AND ii.asset_type = 'ContextMessage'
- AND ii.user_id = cp.user_id
- AND ii.workflow_state <> 'deleted'
- SQL
-
- # make sure senders can see their sent items (they don't normally get an inbox_item, unless explicitly added as a recipient)
- execute <<-SQL
- INSERT INTO #{ConversationMessageParticipant.quoted_table_name}(conversation_message_id, conversation_participant_id, unread)
- SELECT
- cm.id,
- cp.id,
- FALSE
- FROM
- #{ConversationMessage.quoted_table_name} cm
- INNER JOIN
- #{ConversationParticipant.quoted_table_name} cp ON cm.conversation_id = cp.conversation_id AND cm.author_id = cp.user_id
- LEFT JOIN
- #{ConversationMessageParticipant.quoted_table_name} existing ON existing.conversation_message_id = cm.id AND existing.conversation_participant_id = cp.id
- WHERE
- cm.context_message_id IS NOT NULL
- AND existing.id IS NULL
- SQL
-
- # hide inbox_items from the users
- update "UPDATE #{connection.quote_table_name('inbox_items')} SET workflow_state = 'retired' WHERE asset_type IN ('ContextMessage', 'SubmissionComment') AND workflow_state = 'read'"
- update "UPDATE #{connection.quote_table_name('inbox_items')} SET workflow_state = 'retired_unread' WHERE asset_type IN ('ContextMessage', 'SubmissionComment') AND workflow_state = 'unread'"
-
-
- update <<-SQL
- UPDATE #{ConversationParticipant.quoted_table_name}
- SET workflow_state = 'unread'
- WHERE EXISTS (SELECT 1 FROM #{ConversationMessageParticipant.quoted_table_name} WHERE conversation_participants.id = conversation_participant_id AND unread LIMIT 1)
- SQL
-
-
- # attachments
- update <<-SQL
- UPDATE #{Attachment.quoted_table_name}
- SET context_id = conversation_messages.id, context_type = 'ConversationMessage'
- FROM #{ConversationMessage.quoted_table_name}
- WHERE attachments.context_type = 'ContextMessage' AND conversation_messages.context_message_id = attachments.context_id
- SQL
-
- update <<-SQL
- UPDATE #{ConversationParticipant.quoted_table_name}
- SET has_attachments = TRUE
- WHERE id IN (
- SELECT conversation_participant_id
- FROM #{ConversationMessageParticipant.quoted_table_name} cmp, #{Attachment.quoted_table_name} a
- WHERE
- a.context_type = 'ConversationMessage'
- AND a.context_id = conversation_message_id
- )
- SQL
-
- update <<-SQL
- UPDATE #{Conversation.quoted_table_name}
- SET has_attachments = TRUE
- WHERE id IN (
- SELECT conversation_id
- FROM #{ConversationMessage.quoted_table_name} cm, #{Attachment.quoted_table_name} a
- WHERE
- a.context_type = 'ConversationMessage'
- AND a.context_id = cm.id
- )
- SQL
-
-
- # audio comments
- update <<-SQL
- UPDATE #{ConversationParticipant.quoted_table_name}
- SET has_media_objects = TRUE
- WHERE id IN (
- SELECT conversation_participant_id
- FROM #{ConversationMessageParticipant.quoted_table_name} cmp, #{ConversationMessage.quoted_table_name} cm
- WHERE cmp.conversation_message_id = cm.id AND media_comment_id IS NOT NULL
- )
- SQL
-
- update <<-SQL
- UPDATE #{Conversation.quoted_table_name}
- SET has_media_objects = TRUE
- WHERE id IN (
- SELECT conversation_id
- FROM #{ConversationMessage.quoted_table_name}
- WHERE media_comment_id IS NOT NULL
- )
- SQL
-
- # cached stats
- execute <<-SQL
- CREATE TEMPORARY TABLE __migrated_conversation_stats AS
- SELECT
- conversation_participant_id,
- COUNT(*) AS message_count,
- MAX(cm.created_at) AS last_message_at,
- MAX(CASE WHEN cm.author_id = cp.user_id THEN cm.created_at ELSE NULL END) AS last_authored_at
- FROM #{ConversationMessageParticipant.quoted_table_name} cmp, #{ConversationMessage.quoted_table_name} cm, #{ConversationParticipant.quoted_table_name} cp
- WHERE conversation_message_id = cm.id AND conversation_participant_id = cp.id
- GROUP BY conversation_participant_id
- SQL
- execute "CREATE INDEX index_mcs_on_cpi ON __migrated_conversation_stats (conversation_participant_id)"
-
- update <<-SQL
- UPDATE #{ConversationParticipant.quoted_table_name}
- SET message_count = __migrated_conversation_stats.message_count,
- last_message_at = __migrated_conversation_stats.last_message_at,
- last_authored_at = __migrated_conversation_stats.last_authored_at
- 'FROM __migrated_conversation_stats'
- WHERE conversation_participants.id = conversation_participant_id
- SQL
- add_index :conversation_participants, [:user_id, :last_message_at]
- remove_index :conversation_participants, :column => :user_id
-
- execute <<-SQL
- UPDATE #{User.quoted_table_name}
- SET unread_conversations_count = (SELECT COUNT(*) FROM #{ConversationParticipant.quoted_table_name} WHERE workflow_state = 'unread' AND user_id = users.id)
- SQL
-
- remove_column :conversations, :migration_signature
- remove_column :conversations, :tmp_private_hash
- remove_column :conversation_message_participants, :unread
-
- execute "DROP TABLE __migrated_messages"
- execute "DROP TABLE __migrated_message_participants"
- execute "DROP TABLE __migrated_message_participant_strings"
- execute "DROP TABLE __existing_private_conversations"
- execute "DROP TABLE __migrated_conversation_stats"
- end
-
- def self.down
- raise ActiveRecord::IrreversibleMigration
- end
-end
diff --git a/db/migrate/20110817173455_submission_has_admin_comment.rb b/db/migrate/20110817173455_submission_has_admin_comment.rb
deleted file mode 100644
index a6e96e10465..00000000000
--- a/db/migrate/20110817173455_submission_has_admin_comment.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# Copyright (C) 2011 - present Instructure, Inc.
-#
-# This file is part of Canvas.
-#
-# Canvas is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Affero General Public License as published by the Free
-# Software Foundation, version 3 of the License.
-#
-# Canvas 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 Affero General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Affero General Public License along
-# with this program. If not, see .
-
-class SubmissionHasAdminComment < ActiveRecord::Migration[4.2]
- tag :predeploy
-
- def self.up
- add_column :submissions, :has_admin_comment, :boolean, :default => false, :null => false
- update <<-SQL
- UPDATE #{Submission.quoted_table_name} SET has_admin_comment=EXISTS(
- SELECT 1 FROM #{SubmissionComment.quoted_table_name} AS sc, #{Assignment.quoted_table_name} AS a, #{Course.quoted_table_name} AS c, #{Enrollment.quoted_table_name} AS e
- WHERE sc.submission_id=submissions.id AND a.id = submissions.assignment_id
- AND submissions.workflow_state <> 'deleted'
- AND c.id = a.context_id AND a.context_type = 'Course' AND e.course_id = c.id
- AND e.user_id = sc.author_id AND e.workflow_state = 'active'
- AND e.type IN ('TeacherEnrollment', 'TaEnrollment'))
- SQL
- end
-
- def self.down
- remove_column :submissions, :has_admin_comment
- end
-end