Migrate database and models for study-group-based authorization

This commit is contained in:
Sebastian Serth
2022-09-20 16:14:06 +02:00
committed by Sebastian Serth
parent ec4c6207f0
commit 04ed45ea73
9 changed files with 79 additions and 3 deletions

View File

@@ -0,0 +1,39 @@
# frozen_string_literal: true
class MigratePermissionsToStudyGroup < ActiveRecord::Migration[6.1]
# rubocop:disable Rails/SkipsModelValidations
def up
create_default_groups
migrate_internal_users
migrate_external_users
end
def create_default_groups
Consumer.find_each do |consumer|
StudyGroup.find_or_create_by!(consumer: consumer, external_id: nil) do |new_group|
new_group.name = "Default Study Group for #{consumer.name}"
end
end
end
def migrate_internal_users
# Internal users don't necessarily have a study group yet, which is needed for the teacher role
InternalUser.find_each do |user|
user.update_columns(platform_admin: true) if user.role == 'admin'
study_group = StudyGroup.find_by!(consumer: user.consumer, external_id: nil)
# All platform admins will "just" be a teacher in the study group
new_role = %w[admin teacher].include?(user.role) ? :teacher : :learner
membership = StudyGroupMembership.find_or_create_by!(study_group: study_group, user: user)
membership.update_columns(role: new_role)
end
end
def migrate_external_users
# All external users are (or will be) in a study group once launched through LTI
# and therefore don't need a new StudyGroupMembership
ExternalUser.where(role: 'admin').update(platform_admin: true)
end
# rubocop:enable Rails/SkipsModelValidations
end