Skip to content

Commit

Permalink
Merge pull request #1214 from MITLibraries/etd-589-accession-model
Browse files Browse the repository at this point in the history
Allow thesis processors to assign accession numbers to degree periods
  • Loading branch information
jazairi authored Sep 7, 2023
2 parents ac9a23d + d647acd commit 4b03d42
Show file tree
Hide file tree
Showing 36 changed files with 1,019 additions and 72 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,6 @@ coverage

storage
.vscode

# Ignore Rails Mermaid ERD gem generated HTML. (We put the markdown in the readme instead.)
docs/etd_erd.html
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ group :development do
gem 'dotenv-rails'
gem 'letter_opener'
gem 'listen'
gem 'rails-mermaid_erd'
gem 'rubocop'
gem 'rubocop-rails'
gem 'scout_apm'
Expand Down
3 changes: 3 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,8 @@ GEM
rails-html-sanitizer (1.6.0)
loofah (~> 2.21)
nokogiri (~> 1.14)
rails-mermaid_erd (0.4.2)
rails (>= 5.2)
railties (7.0.7.2)
actionpack (= 7.0.7.2)
activesupport (= 7.0.7.2)
Expand Down Expand Up @@ -447,6 +449,7 @@ DEPENDENCIES
pg
puma
rails (~> 7.0)
rails-mermaid_erd
rubocop
rubocop-rails
rubyzip
Expand Down
46 changes: 46 additions & 0 deletions app/controllers/admin/archivematica_accessions_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
module Admin
class ArchivematicaAccessionsController < Admin::ApplicationController
# Overwrite any of the RESTful controller actions to implement custom behavior
# For example, you may want to send an email after a foo is updated.
#
# def update
# super
# send_foo_updated_email(requested_resource)
# end

# Override this method to specify custom lookup behavior.
# This will be used to set the resource for the `show`, `edit`, and `update`
# actions.
#
# def find_resource(param)
# Foo.find_by!(slug: param)
# end

# The result of this lookup will be available as `requested_resource`

# Override this if you have certain roles that require a subset
# this will be used to set the records shown on the `index` action.
#
# def scoped_resource
# if current_user.super_admin?
# resource_class
# else
# resource_class.with_less_stuff
# end
# end

# Override `resource_params` if you want to transform the submitted
# data before it's persisted. For example, the following would turn all
# empty values into nil values. It uses other APIs such as `resource_class`
# and `dashboard`:
#
# def resource_params
# params.require(resource_class.model_name.param_key).
# permit(dashboard.permitted_attributes).
# transform_values { |value| value == "" ? nil : value }
# end

# See https://administrate-prototype.herokuapp.com/customizing_controller_actions
# for more information
end
end
46 changes: 46 additions & 0 deletions app/controllers/admin/degree_periods_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
module Admin
class DegreePeriodsController < Admin::ApplicationController
# Overwrite any of the RESTful controller actions to implement custom behavior
# For example, you may want to send an email after a foo is updated.
#
# def update
# super
# send_foo_updated_email(requested_resource)
# end

# Override this method to specify custom lookup behavior.
# This will be used to set the resource for the `show`, `edit`, and `update`
# actions.
#
# def find_resource(param)
# Foo.find_by!(slug: param)
# end

# The result of this lookup will be available as `requested_resource`

# Override this if you have certain roles that require a subset
# this will be used to set the records shown on the `index` action.
#
# def scoped_resource
# if current_user.super_admin?
# resource_class
# else
# resource_class.with_less_stuff
# end
# end

# Override `resource_params` if you want to transform the submitted
# data before it's persisted. For example, the following would turn all
# empty values into nil values. It uses other APIs such as `resource_class`
# and `dashboard`:
#
# def resource_params
# params.require(resource_class.model_name.param_key).
# permit(dashboard.permitted_attributes).
# transform_values { |value| value == "" ? nil : value }
# end

# See https://administrate-prototype.herokuapp.com/customizing_controller_actions
# for more information
end
end
66 changes: 66 additions & 0 deletions app/dashboards/archivematica_accession_dashboard.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
require 'administrate/base_dashboard'

class ArchivematicaAccessionDashboard < Administrate::BaseDashboard
# ATTRIBUTE_TYPES
# a hash that describes the type of each of the model's fields.
#
# Each different type represents an Administrate::Field object,
# which determines how the attribute is displayed
# on pages throughout the dashboard.
ATTRIBUTE_TYPES = {
id: Field::Number,
degree_period: Field::BelongsTo.with_options(collection: DegreePeriod::VALID_GRAD_MONTHS),
accession_number: Field::String,
created_at: Field::DateTime,
updated_at: Field::DateTime
}.freeze

# COLLECTION_ATTRIBUTES
# an array of attributes that will be displayed on the model's index page.
#
# By default, it's limited to four items to reduce clutter on index pages.
# Feel free to add, remove, or rearrange items.
COLLECTION_ATTRIBUTES = %i[
id
degree_period
accession_number
created_at
].freeze

# SHOW_PAGE_ATTRIBUTES
# an array of attributes that will be displayed on the model's show page.
SHOW_PAGE_ATTRIBUTES = %i[
id
degree_period
accession_number
created_at
updated_at
].freeze

# FORM_ATTRIBUTES
# an array of attributes that will be displayed
# on the model's form (`new` and `edit`) pages.
FORM_ATTRIBUTES = %i[
degree_period
accession_number
].freeze

# COLLECTION_FILTERS
# a hash that defines filters that can be used while searching via the search
# field of the dashboard.
#
# For example to add an option to search for open resources by typing "open:"
# in the search field:
#
# COLLECTION_FILTERS = {
# open: ->(resources) { resources.where(open: true) }
# }.freeze
COLLECTION_FILTERS = {}.freeze

# Overwrite this method to customize how accessions are displayed
# across all pages of the admin dashboard.
#
def display_resource(archivematica_accession)
archivematica_accession.accession_number.to_s
end
end
68 changes: 68 additions & 0 deletions app/dashboards/degree_period_dashboard.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
require 'administrate/base_dashboard'

class DegreePeriodDashboard < Administrate::BaseDashboard
# ATTRIBUTE_TYPES
# a hash that describes the type of each of the model's fields.
#
# Each different type represents an Administrate::Field object,
# which determines how the attribute is displayed
# on pages throughout the dashboard.
ATTRIBUTE_TYPES = {
id: Field::Number,
archivematica_accession: Field::HasOne,
grad_month: Field::Select.with_options(collection: DegreePeriod::VALID_GRAD_MONTHS),
grad_year: Field::String,
created_at: Field::DateTime,
updated_at: Field::DateTime
}.freeze

# COLLECTION_ATTRIBUTES
# an array of attributes that will be displayed on the model's index page.
#
# By default, it's limited to four items to reduce clutter on index pages.
# Feel free to add, remove, or rearrange items.
COLLECTION_ATTRIBUTES = %i[
id
archivematica_accession
grad_month
grad_year
].freeze

# SHOW_PAGE_ATTRIBUTES
# an array of attributes that will be displayed on the model's show page.
SHOW_PAGE_ATTRIBUTES = %i[
id
archivematica_accession
grad_month
grad_year
created_at
updated_at
].freeze

# FORM_ATTRIBUTES
# an array of attributes that will be displayed
# on the model's form (`new` and `edit`) pages.
FORM_ATTRIBUTES = %i[
grad_month
grad_year
].freeze

# COLLECTION_FILTERS
# a hash that defines filters that can be used while searching via the search
# field of the dashboard.
#
# For example to add an option to search for open resources by typing "open:"
# in the search field:
#
# COLLECTION_FILTERS = {
# open: ->(resources) { resources.where(open: true) }
# }.freeze
COLLECTION_FILTERS = {}.freeze

# Overwrite this method to customize how degree periods are displayed
# across all pages of the admin dashboard.
#
def display_resource(degree_period)
"#{degree_period.grad_month} #{degree_period.grad_year}"
end
end
6 changes: 6 additions & 0 deletions app/models/ability.rb
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,12 @@ def processor
can :files, Transfer

can :read, Hold

can :manage, :archivematica_accession
can :manage, ArchivematicaAccession

can :manage, :degree_period
can :manage, DegreePeriod
end

# Library staff who can use the admin dashboards (which includes operations
Expand Down
27 changes: 27 additions & 0 deletions app/models/archivematica_accession.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# == Schema Information
#
# Table name: archivematica_accessions
#
# id :integer not null, primary key
# accession_number :string
# created_at :datetime not null
# updated_at :datetime not null
# degree_period_id :integer not null
#

# Accession is where we store the Accession Number that is generated in our Archivematica system. It is used in this
# application to generate an S3 key that automations in Archivematica can detect and associate with Submission
# Information Packages (SIPs) for a single degree period with a single Accession number in Archivematica.
class ArchivematicaAccession < ApplicationRecord
has_paper_trail
belongs_to :degree_period

validates_uniqueness_of :degree_period_id, message: 'already has an accession number'
validates_uniqueness_of :accession_number
validates :accession_number, presence: true,
format: {
with: /\A(19|20)\d{2}_\d{3}\z/i,
message: 'must match the format `YYYY_ddd`, where `YYYY` is a year between 1900 and ' \
'2099, and `ddd` is a three-digit sequence number (e.g., 2023_001)'
}
end
1 change: 1 addition & 0 deletions app/models/author.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
# graduation_confirmed :boolean default(FALSE), not null
# created_at :datetime not null
# updated_at :datetime not null
# proquest_allowed :boolean
#
class Author < ApplicationRecord
belongs_to :user
Expand Down
21 changes: 21 additions & 0 deletions app/models/degree_period.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# == Schema Information
#
# Table name: degree_periods
#
# id :integer not null, primary key
# grad_month :string
# grad_year :string
# created_at :datetime not null
# updated_at :datetime not null
#
class DegreePeriod < ApplicationRecord
has_paper_trail
has_one :archivematica_accession, dependent: :destroy

validates :grad_year, format: { with: /\A(19|20)\d{2}\z/i,
message: 'must be between 1900 and 2099' },
uniqueness: { scope: :grad_month, message: 'and month combination already exists' }

VALID_GRAD_MONTHS = %w[May June September February].freeze
validates_inclusion_of :grad_month, in: VALID_GRAD_MONTHS
end
8 changes: 8 additions & 0 deletions app/models/proquest_export_batch.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
# == Schema Information
#
# Table name: proquest_export_batches
#
# id :integer not null, primary key
# created_at :datetime not null
# updated_at :datetime not null
#
class ProquestExportBatch < ApplicationRecord
require 'csv'

Expand Down
3 changes: 2 additions & 1 deletion app/models/submission_information_package.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#
# id :integer not null, primary key
# preserved_at :datetime
# preservation_status :integer default(0), not null
# preservation_status :integer default("unpreserved"), not null
# bag_declaration :string
# bag_name :string
# manifest :text
Expand All @@ -13,6 +13,7 @@
# created_at :datetime not null
# updated_at :datetime not null
#

# Creates the structure for an individual thesis to be preserved in Archivematica according to the BagIt spec:
# https://datatracker.ietf.org/doc/html/rfc8493.
#
Expand Down
Loading

0 comments on commit 4b03d42

Please sign in to comment.