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:

    + + +<% 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