Refactor LTI parameters and add study group
* This change also requires that submissions in our test need to have a valid study group.
This commit is contained in:

committed by
Sebastian Serth

parent
e2baa2ee55
commit
e3603758ef
@ -0,0 +1,7 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class AddStudyGroupToLtiParameters < ActiveRecord::Migration[7.0]
|
||||
def change
|
||||
add_reference :lti_parameters, :study_group, index: true, null: true, foreign_key: true
|
||||
end
|
||||
end
|
44
db/migrate/20230819084917_unify_lti_parameters.rb
Normal file
44
db/migrate/20230819084917_unify_lti_parameters.rb
Normal file
@ -0,0 +1,44 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class UnifyLtiParameters < ActiveRecord::Migration[7.0]
|
||||
def change
|
||||
reversible do |dir|
|
||||
dir.up do
|
||||
# We cannot add a foreign key to a table that has rows that violate the constraint.
|
||||
LtiParameter.where(external_users_id: nil)
|
||||
.or(LtiParameter.where.not(external_users_id: ExternalUser.all.select(:id)))
|
||||
.or(LtiParameter.where(exercises_id: nil))
|
||||
.or(LtiParameter.where.not(exercises_id: Exercise.all.select(:id)))
|
||||
.delete_all
|
||||
|
||||
# For each user/exercise pair, keep the most recent LtiParameter.
|
||||
LtiParameter.all.group(:external_users_id, :exercises_id).having('count(*) > 1').count.each do |ids, count|
|
||||
LtiParameter.where(external_users_id: ids.first, exercises_id: ids.second).order(updated_at: :asc).limit(count - 1).delete_all
|
||||
end
|
||||
change_column :lti_parameters, :id, :bigint
|
||||
end
|
||||
|
||||
dir.down do
|
||||
change_column :lti_parameters, :id, :integer
|
||||
end
|
||||
end
|
||||
|
||||
remove_column :lti_parameters, :consumers_id, :bigint
|
||||
|
||||
rename_column :lti_parameters, :external_users_id, :external_user_id
|
||||
change_column_null :lti_parameters, :external_user_id, false
|
||||
add_foreign_key :lti_parameters, :external_users
|
||||
|
||||
rename_column :lti_parameters, :exercises_id, :exercise_id
|
||||
change_column_null :lti_parameters, :exercise_id, false
|
||||
add_foreign_key :lti_parameters, :exercises
|
||||
|
||||
add_index :lti_parameters, %i[external_user_id study_group_id exercise_id], unique: true, name: 'index_lti_params_on_external_user_and_study_group_and_exercise'
|
||||
end
|
||||
|
||||
class LtiParameter < ActiveRecord::Base; end
|
||||
|
||||
class ExternalUser < ActiveRecord::Base; end
|
||||
|
||||
class Exercise < ActiveRecord::Base; end
|
||||
end
|
17
db/schema.rb
17
db/schema.rb
@ -10,7 +10,7 @@
|
||||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema[7.0].define(version: 2023_07_27_080619) do
|
||||
ActiveRecord::Schema[7.0].define(version: 2023_08_19_084917) do
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "pg_trgm"
|
||||
enable_extension "pgcrypto"
|
||||
@ -341,14 +341,16 @@ ActiveRecord::Schema[7.0].define(version: 2023_07_27_080619) do
|
||||
t.string "severity"
|
||||
end
|
||||
|
||||
create_table "lti_parameters", id: :serial, force: :cascade do |t|
|
||||
t.integer "external_users_id"
|
||||
t.integer "consumers_id"
|
||||
t.integer "exercises_id"
|
||||
create_table "lti_parameters", force: :cascade do |t|
|
||||
t.integer "external_user_id", null: false
|
||||
t.integer "exercise_id", null: false
|
||||
t.jsonb "lti_parameters", default: {}, null: false
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.index ["external_users_id"], name: "index_lti_parameters_on_external_users_id"
|
||||
t.bigint "study_group_id"
|
||||
t.index ["external_user_id", "study_group_id", "exercise_id"], name: "index_lti_params_on_external_user_and_study_group_and_exercise", unique: true
|
||||
t.index ["external_user_id"], name: "index_lti_parameters_on_external_user_id"
|
||||
t.index ["study_group_id"], name: "index_lti_parameters_on_study_group_id"
|
||||
end
|
||||
|
||||
create_table "programming_group_memberships", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
@ -599,6 +601,9 @@ ActiveRecord::Schema[7.0].define(version: 2023_07_27_080619) do
|
||||
add_foreign_key "exercise_tips", "exercise_tips", column: "parent_exercise_tip_id"
|
||||
add_foreign_key "exercise_tips", "exercises"
|
||||
add_foreign_key "exercise_tips", "tips"
|
||||
add_foreign_key "lti_parameters", "exercises"
|
||||
add_foreign_key "lti_parameters", "external_users"
|
||||
add_foreign_key "lti_parameters", "study_groups"
|
||||
add_foreign_key "programming_group_memberships", "programming_groups"
|
||||
add_foreign_key "programming_groups", "exercises"
|
||||
add_foreign_key "remote_evaluation_mappings", "study_groups"
|
||||
|
@ -40,7 +40,7 @@ BEGIN
|
||||
|
||||
DELETE FROM anomaly_notifications WHERE exercise_id = duplicated_exercise;
|
||||
DELETE FROM exercise_tags WHERE exercise_id = duplicated_exercise;
|
||||
DELETE FROM lti_parameters WHERE exercises_id = duplicated_exercise;
|
||||
DELETE FROM lti_parameters WHERE exercise_id = duplicated_exercise;
|
||||
DELETE FROM remote_evaluation_mappings WHERE exercise_id = duplicated_exercise;
|
||||
|
||||
-- Preventing duplicated entries in exercise_collection_items
|
||||
|
Reference in New Issue
Block a user