Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ gem 'turbo-rails'
gem 'stimulus-rails'
# Build JSON APIs with ease [https://github.com/rails/jbuilder]
gem 'jbuilder'
# Allows returning free formed structs
gem 'ostruct'

# Used to differentaite text
gem 'diff-lcs'
Expand Down
2 changes: 2 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ GEM
racc (~> 1.4)
nokogiri (1.18.8-x86_64-linux-musl)
racc (~> 1.4)
ostruct (0.6.1)
parallel (1.27.0)
parser (3.3.8.0)
ast (~> 2.4.1)
Expand Down Expand Up @@ -405,6 +406,7 @@ DEPENDENCIES
htmldiff
importmap-rails
jbuilder
ostruct
pg
propshaft
puma (>= 5.0)
Expand Down
141 changes: 56 additions & 85 deletions app/controllers/courses_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -178,25 +178,19 @@ def handle_add_lecturers

begin
ActiveRecord::Base.transaction do
create_lecturer_enrolments(lecturer_emails, @course, unregistered_lecturers, registered_lecturers)
create_lecturer_enrolments(lecturer_emails, @course)
end
rescue StandardError => e
redirect_back_or_to '/', alert: e.message
return
end

send_invite_emails(unregistered_lecturers)
send_notification_emails(registered_lecturers, @course)

redirect_to course_path(@course)
end

def handle_add_students
authorize @course, :manage_students?

unregistered_students = Set[]
registered_students = []

if params[:csv_file].blank? || params[:csv_file].content_type != 'text/csv'
redirect_back_or_to '/', alert: 'Please provide a CSV file from ebwise'
return
Expand Down Expand Up @@ -233,19 +227,17 @@ def handle_add_students

if @course.grouped
student_hashmap = @course.parse_csv_grouped(csv_obj)
create_db_entries_grouped(student_hashmap, @course, unregistered_students, registered_students)
create_db_entries_grouped(student_hashmap, @course)
else
student_set = @course.parse_csv_solo(csv_obj)
create_db_entries_solo(student_set, @course, unregistered_students, registered_students)
create_db_entries_solo(student_set, @course)
end
end
rescue StandardError => e
redirect_back_or_to '/', alert: e.message
return
end

send_invite_emails(unregistered_students)
send_notification_emails(registered_students, @course)
redirect_to course_path(@course)
end

Expand Down Expand Up @@ -531,37 +523,37 @@ def load_capacity_result
@capacity_result = SupervisorCapacityCalculator.new(@course).calculate
end

def create_db_entries_grouped(hash_map, parent_course, unregistered_students, registered_students)
def create_db_entries_grouped(hash_map, parent_course)
hash_map.keys.each do |group|
new_group = ProjectGroup.find_or_create_by!(group_name: group, course: parent_course)

hash_map[group].each do |group_member|
new_user = User.find_by(email_address: group_member[:email_address])

if new_user
new_user.update!(instid: group_member[:instid])

registered_students.push(group_member[:email_address]) if new_user.enrolments.where(course: parent_course).empty?
else
new_user = User.create!(
email_address: group_member[:email_address],
if !new_user
result = UserCreator.call(
name: group_member[:name],
email: group_member[:email_address],
password: SecureRandom.base64(24),
has_registered: false,
verify_only: false,
instid: group_member[:instid]
)

new_otp_instance = Otp.create!(
user: new_user,
token: SecureRandom.uuid
)
GeneralMailer.with(
email_address: group_member[:email],
otp_token: result.otp_instance.token,
).ProPro_Invite.deliver_later

unregistered_students.add(
{
email_address: group_member[:email_address],
otp_token: new_otp_instance.token
}
)
new_user = result.user
else
new_user.update!(instid: group_member[:instid])

if new_user.enrolments.where(course: parent_course).empty?
GeneralMailer.with(
course: parent_course,
email_address: group_member[:email]
).Course_Invite_Notification.deliver_later
end
end

Enrolment.find_or_create_by!(
Expand All @@ -585,54 +577,34 @@ def create_db_entries_grouped(hash_map, parent_course, unregistered_students, re
end
end

def send_invite_emails(unregistered_users)
unregistered_users.each do |user|
GeneralMailer.with(
email_address: user[:email_address],
otp_token: user[:otp_token],
from_course: true
).ProPro_Invite.deliver_later
end
end

def send_notification_emails(registered_emails, course)
registered_emails.each do |email|
GeneralMailer.with(
course: course,
email_address: email
).Course_Invite_Notification.deliver_later
end
end

def create_db_entries_solo(student_set, parent_course, unregistered_students, registered_students)
def create_db_entries_solo(student_set, parent_course)
student_set.each do |student|
new_user = User.find_by(email_address: student[:email_address])

if new_user
new_user.update!(instid: student[:instid])

registered_students.push(student[:email_address]) if new_user.enrolments.where(course: parent_course).empty?
else
new_user = User.create!(
email_address: student[:email_address],
if !new_user
result = UserCreator.call(
name: student[:name],
email: student[:email_address],
password: SecureRandom.base64(24),
has_registered: false,
verify_only: false,
instid: student[:instid]
)

new_otp_instance = Otp.create!(
user: new_user,
token: SecureRandom.uuid
)
GeneralMailer.with(
email_address: student[:email_address],
otp_token: result.otp_instance.token,
).ProPro_Invite.deliver_later

unregistered_students.add(
{
email_address: student[:email_address],
otp_token: new_otp_instance.token,
otp: new_otp_instance.otp
}
)
new_user = result.user
else
new_user.update!(instid: student[:instid])

if new_user.enrolments.where(course: parent_course).empty?
GeneralMailer.with(
course: parent_course,
email_address: student[:email]
).Course_Invite_Notification.deliver_later
end
end

Enrolment.find_or_create_by!(
Expand All @@ -643,33 +615,32 @@ def create_db_entries_solo(student_set, parent_course, unregistered_students, re
end
end

def create_lecturer_enrolments(lecturer_emails, parent_course, unregistered_lecturers, registered_lecturers)
def create_lecturer_enrolments(lecturer_emails, parent_course)
lecturer_emails.each do |email|
next if email.blank?

new_lecturer = User.find_by(email_address: email)

if !new_lecturer
new_lecturer = User.create!(
email_address: email,
result = UserCreator.call(
name: "Lecturer-#{SecureRandom.hex(2)}",
email: email,
password: SecureRandom.base64(24),
has_registered: false,
name: "Lecturer-#{SecureRandom.hex(2)}"
verify_only: false
)

new_otp_instance = Otp.create!(
user: new_lecturer,
token: SecureRandom.uuid
)
GeneralMailer.with(
email_address: email,
otp_token: result.otp_instance.token,
).ProPro_Invite.deliver_later

new_lecturer = result.user

unregistered_lecturers.add(
{
email_address: email,
otp_token: new_otp_instance.token
}
)
elsif new_lecturer.enrolments.where(course: parent_course).empty?
registered_lecturers.push(email)
GeneralMailer.with(
course: parent_course,
email_address: email
).Course_Invite_Notification.deliver_later
end

Enrolment.find_or_create_by!(
Expand Down
Loading
Loading