diff --git a/app/jobs/registrar_import_job.rb b/app/jobs/registrar_import_job.rb
index 1fc91506..c68e135d 100644
--- a/app/jobs/registrar_import_job.rb
+++ b/app/jobs/registrar_import_job.rb
@@ -5,7 +5,7 @@ class RegistrarImportJob < ActiveJob::Base
def perform(registrar)
results = { read: 0, processed: 0, new_users: 0, new_theses: 0, updated_theses: 0, new_degrees: [], new_depts: [],
- errors: [] }
+ new_degree_periods: [], errors: [] }
CSV.new(registrar.graduation_list.download, headers: true).each.with_index(1) do |row, i|
Rails.logger.info("Parsing row #{i}")
@@ -33,6 +33,8 @@ def perform(registrar)
results[:new_depts] << department if department.id_previously_changed?
grad_date = reformat_grad_date(row['Degree Award Date'])
logger.info("Grad date is #{grad_date.inspect}")
+ degree_period = DegreePeriod.from_grad_date(grad_date)
+ results[:new_degree_periods] << degree_period if degree_period.id_previously_changed?
begin
# Set whodunnit for thesis transaction
PaperTrail.request.whodunnit = 'registrar'
diff --git a/app/models/degree_period.rb b/app/models/degree_period.rb
index ba3fc6c8..aa72922d 100644
--- a/app/models/degree_period.rb
+++ b/app/models/degree_period.rb
@@ -18,4 +18,20 @@ class DegreePeriod < ApplicationRecord
VALID_GRAD_MONTHS = %w[May June September February].freeze
validates_inclusion_of :grad_month, in: VALID_GRAD_MONTHS
+
+ # Given a grad date from a registrar data import CSV (or elsewhere, look up a Degree Period and create one if it does
+ # not exist.
+ def self.from_grad_date(grad_date)
+ new_grad_month = grad_date.strftime('%B')
+ new_grad_year = grad_date.strftime('%Y')
+ degree_period = DegreePeriod.find_by(grad_month: new_grad_month, grad_year: new_grad_year)
+ if degree_period.blank?
+ new_degree_period = DegreePeriod.create!(grad_month: new_grad_month, grad_year: new_grad_year)
+ Rails.logger.warn("New department created, requires Processor attention: \
+ #{new_degree_period.grad_month} #{new_degree_period.grad_year}")
+ new_degree_period
+ else
+ degree_period
+ end
+ end
end
diff --git a/app/views/report_mailer/registrar_import_email.html.erb b/app/views/report_mailer/registrar_import_email.html.erb
index a256f2e5..17180bb7 100644
--- a/app/views/report_mailer/registrar_import_email.html.erb
+++ b/app/views/report_mailer/registrar_import_email.html.erb
@@ -14,6 +14,7 @@
New authors: <%= @results[:new_users] %>
New degrees: <%= @results[:new_degrees].count %>
New DLCs: <%= @results[:new_depts].count %>
+ New degree periods: <%= @results[:new_degree_periods].count %>
<% if @results[:errors].any? %>
@@ -45,3 +46,15 @@
<% end %>
<% end %>
+
+<% if @results[:new_degree_periods].any? %>
+ The following new degree periods must be assigned Archivematica accession numbers to enable publication for
+ associated theses:
+
+
+ <% @results[:new_degree_periods].each do |degree_period| %>
+ - <%= link_to "#{degree_period.grad_month} #{degree_period.grad_year}",
+ new_admin_archivematica_accession_url(degree_period_id: degree_period.id) %>
+ <% end %>
+
+<% end %>
diff --git a/test/fixtures/files/registrar_data_full_anonymized.csv b/test/fixtures/files/registrar_data_full_anonymized.csv
index a8f307c7..355c2a81 100644
--- a/test/fixtures/files/registrar_data_full_anonymized.csv
+++ b/test/fixtures/files/registrar_data_full_anonymized.csv
@@ -1,7 +1,7 @@
Full Name,Degree Status,Degree Type,Degree Desc,Degree Department,Degree Award Term,Degree Award Date,Degree Code,Dept Name In Commencement Bk,Thesis Title,Is Primary Course Of Major,Thesis Coauthor,Krb Name,Last Name,First Name,Middle Name,Email Address
"Klein, Jennifer",AW,PHD,Doctor of Philosophy,MAS,2019SU,9/18/2019 0:00,PHD,Program in Media Arts and Sciences,thesis in the field of Media Arts and Sciences: Social Inductive Biases for Reinforcement Learning,Y,,finleyjessica,Klein,Jennifer,,finleyjessica@example.com
-"Hawkins, Destiny",AW,PHD,Doctor of Philosophy,MAS,2019SU,9/18/2019 0:00,PHD,Program in Media Arts and Sciences,thesis in the field of Media Arts and Sciences: Laser Direct-Write Fabrication of MEMS,Y,,pattersondavid,Hawkins,Destiny,,pattersondavid@example.com
-"Love, Tyler Alexander",AW,PHD,Doctor of Philosophy,6,2019SU,9/18/2019 0:00,PHD,Department of Electrical Engineering and Computer Science,thesis in the field of Computer Science: Fast Spectral Primitives for Directed Graphs,Y,,dianebishop,Love,Tyler,Alexander,dianebishop@example.com
+"Hawkins, Destiny",AW,PHD,Doctor of Philosophy,MAS,2019SU,5/18/2023 0:00,PHD,Program in Media Arts and Sciences,thesis in the field of Media Arts and Sciences: Laser Direct-Write Fabrication of MEMS,Y,,pattersondavid,Hawkins,Destiny,,pattersondavid@example.com
+"Love, Tyler Alexander",AW,PHD,Doctor of Philosophy,6,2019SU,6/18/2024 0:00,PHD,Department of Electrical Engineering and Computer Science,thesis in the field of Computer Science: Fast Spectral Primitives for Directed Graphs,Y,,dianebishop,Love,Tyler,Alexander,dianebishop@example.com
"Anderson, James John",AW,SM,Master of Science in Real Estate Development,RED,2019SU,9/18/2019 0:00,SMRED,Center for Real Estate Development,,Y,,tony71,Anderson,James,John,tony71@example.com
"Mcclain, Matthew Patricia",AW,SM,Master of Science in Mechanical Engineering,2,2019SU,9/18/2019 0:00,SM2,Department of Mechanical Engineering,,Y,,jeffrey83,Mcclain,Matthew,Patricia,jeffrey83@example.com
"Jordan, Kimberly Jason",AW,SM,Master of Science in Real Estate Development,RED,2019SU,9/18/2019 0:00,SMRED,Center for Real Estate Development,,Y,,carrieenglish,Jordan,Kimberly,Jason,carrieenglish@example.com
diff --git a/test/jobs/registrar_import_job_test.rb b/test/jobs/registrar_import_job_test.rb
index 73220a9e..66250d26 100644
--- a/test/jobs/registrar_import_job_test.rb
+++ b/test/jobs/registrar_import_job_test.rb
@@ -18,7 +18,7 @@ class RegistrarImportJobTest < ActiveJob::TestCase
end
test 'job runs and returns expected results' do
- skip "Slow test skipped due to env settings" if ENV.fetch("SKIP_SLOW", false)
+ skip 'Slow test skipped due to env settings' if ENV.fetch('SKIP_SLOW', false)
registrar = Registrar.last
registrar.graduation_list.attach(io: File.open('test/fixtures/files/registrar_data_full_anonymized.csv'),
filename: 'registrar_data_full_anonymized.csv')
@@ -30,6 +30,7 @@ class RegistrarImportJobTest < ActiveJob::TestCase
assert_equal 430, results[:new_users]
assert_equal 42, results[:new_degrees].length
assert_equal 30, results[:new_depts].length
+ assert_equal 3, results[:new_degree_periods].length
assert_equal 1, results[:errors].length
assert_includes results[:errors][0], 'Row #418 missing a Kerberos ID'
@@ -41,6 +42,7 @@ class RegistrarImportJobTest < ActiveJob::TestCase
assert_equal 0, results[:new_users]
assert_equal 0, results[:new_degrees].length
assert_equal 0, results[:new_depts].length
+ assert_equal 0, results[:new_degree_periods].length
assert_equal 1, results[:errors].length
assert_includes results[:errors][0], 'Row #418 missing a Kerberos ID'
end
diff --git a/test/mailers/report_mailer_test.rb b/test/mailers/report_mailer_test.rb
index 5a080539..11a4e9a8 100644
--- a/test/mailers/report_mailer_test.rb
+++ b/test/mailers/report_mailer_test.rb
@@ -5,7 +5,7 @@ class ReportMailerTest < ActionMailer::TestCase
ClimateControl.modify DISABLE_ALL_EMAIL: 'false' do
registrar = registrar(:valid)
results = { read: 0, processed: 0, new_users: 0, new_theses: 1, updated_theses: 0, new_degrees: [], new_depts: [],
- errors: [] }
+ new_degree_periods: [], errors: [] }
email = ReportMailer.registrar_import_email(registrar, results)
# Send the email, then test that it got queued
diff --git a/test/models/degree_period_test.rb b/test/models/degree_period_test.rb
index 958394db..6fdcd0e5 100644
--- a/test/models/degree_period_test.rb
+++ b/test/models/degree_period_test.rb
@@ -8,7 +8,7 @@
# created_at :datetime not null
# updated_at :datetime not null
#
-require "test_helper"
+require 'test_helper'
class DegreePeriodTest < ActiveSupport::TestCase
test 'only grad years between 1900 and 2099 are valid' do
@@ -30,7 +30,7 @@ class DegreePeriodTest < ActiveSupport::TestCase
d.grad_year = '2155'
assert_not d.valid?
end
-
+
test 'only certain grad months are valid' do
d = degree_periods(:june_2023)
assert_equal 'June', d.grad_month
@@ -113,4 +113,20 @@ class DegreePeriodTest < ActiveSupport::TestCase
d.save
assert_equal versions_count + 1, d.versions.count
end
+
+ test 'finds existing degree period from reformatted grad date' do
+ date = Date.new(2023, 6, 1)
+ degree_period = DegreePeriod.from_grad_date(date)
+ assert_equal degree_periods(:june_2023), degree_period
+ end
+
+ test 'creates new degree period from reformatted grad date' do
+ degree_period_count = DegreePeriod.count
+ date = Date.new(2024, 6, 1)
+ assert_not DegreePeriod.find_by(grad_month: 'June', grad_year: '2024')
+
+ degree_period = DegreePeriod.from_grad_date(date)
+ assert_equal degree_period_count + 1, DegreePeriod.count
+ assert_equal degree_period, DegreePeriod.last
+ end
end