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:
Sebastian Serth
2023-08-19 11:28:57 +02:00
committed by Sebastian Serth
parent e2baa2ee55
commit e3603758ef
18 changed files with 114 additions and 54 deletions

View File

@ -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

View 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

View File

@ -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"

View File

@ -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