diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 04a6582b..c60e0957 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -23,6 +23,7 @@ def callback @user = User.from_omniauth(auth_params).tap do |user| sign_in(user) log_signin(user) + update_name(user, auth_params['extra']['displayName']) end redirect_to request.env['omniauth.origin'] || home_path @@ -46,4 +47,9 @@ def auth_params def log_signin(user) logger.debug({ msg: 'Signed in user', user: }) end + + def update_name(user, name) + framework_user = FrameworkUsers.find_by_lcasid(user.uid) + framework_user.update(name:) if framework_user.present? + end end diff --git a/app/controllers/stack_pass_admin_controller.rb b/app/controllers/stack_pass_admin_controller.rb index 35287322..71c65203 100644 --- a/app/controllers/stack_pass_admin_controller.rb +++ b/app/controllers/stack_pass_admin_controller.rb @@ -14,37 +14,6 @@ def refcards @requests = ReferenceCardForm.where('pass_date_end > ?', start_calendar_year).order("#{sort_column} #{sort_direction}") end - def users - @users = Role.stackpass_admin.framework_users.order(:name) - end - - def add_user - # First check if the user exists in framework user - or create the user - framework_user = FrameworkUsers.find_or_create_by(lcasid: params['lcasid']) do |new_user| - new_user.name = params['name'] - new_user.role = 'Admin' - end - - # Now that we have the user, create the assignment: - Assignment.create(framework_users: framework_user, role: Role.stackpass_admin) - - # And redirect back to the admin users page: - flash[:success] = "Added #{framework_user.name} as an administrator" - redirect_to forms_stack_pass_admin_users_path - end - - def destroy_user - # First grab the user (so we can grab the name!) - admin = FrameworkUsers.find(params[:id]) - admin_name = admin.name - - # Now lets find the assignment - user_assignment = Assignment.where(framework_users: admin, role: Role.stackpass_admin).first - user_assignment.destroy - flash[:success] = "Removed #{admin_name} from administrator list" - redirect_to forms_stack_pass_admin_users_path - end - private def init_form!; end diff --git a/app/controllers/stack_pass_forms_controller.rb b/app/controllers/stack_pass_forms_controller.rb index 15374579..e7bdb3ce 100644 --- a/app/controllers/stack_pass_forms_controller.rb +++ b/app/controllers/stack_pass_forms_controller.rb @@ -49,7 +49,7 @@ def update @form = StackPassForm.find(params[:id]) @form.approvedeny = params[:stack_pass_][:approve_deny] - @form.processed_by = params[:processed_by] + @form.processed_by_id = FrameworkUsers.find_by_lcasid(current_user.uid).id if @form.approvedeny == false deny_reason = params[:denial_reason] diff --git a/app/controllers/stack_pass_users_controller.rb b/app/controllers/stack_pass_users_controller.rb new file mode 100644 index 00000000..dbdabe00 --- /dev/null +++ b/app/controllers/stack_pass_users_controller.rb @@ -0,0 +1,52 @@ +# Manipulate stack pass / reference card admins. +class StackPassUsersController < ApplicationController + before_action :auth_as_admin! + before_action :set_user, only: %i[update destroy] + + def index + @users = Role.stackpass_admin.framework_users.order(:name) + end + + def new + @user = FrameworkUsers.new + end + + def create + # First check if the user exists in framework user - or create the user + @user = FrameworkUsers.find_or_create_by(lcasid: user_params[:lcasid]) do |new_user| + new_user.name = user_params[:name] + new_user.role = 'Admin' + end + + unless @user.persisted? + render :new, status: :unprocessable_entity + return + end + + Assignment.create!(framework_users: @user, role: Role.stackpass_admin) + redirect_to stack_pass_users_path, flash: { success: "Added #{@user.name} as an administrator" } + end + + def destroy + user_assignment = Assignment.where(framework_users: @user, role: Role.stackpass_admin).first + user_assignment.destroy + redirect_to stack_pass_users_path, flash: { success: "Removed #{@user.name} from administrator list" } + end + + private + + # Ensure the current user is authenticated and an admin. + def auth_as_admin! + authenticate! + @user_is_admin = current_user.role?(Role.stackpass_admin) + redirect_to stack_pass_forms_path unless @user_is_admin + end + + def set_user + @user = FrameworkUsers.find_by(lcasid: params[:id]) + end + + def user_params + params.require(:framework_users).permit(:lcasid, :name) + end +end diff --git a/app/models/framework_users.rb b/app/models/framework_users.rb index c67818d5..e8600f43 100644 --- a/app/models/framework_users.rb +++ b/app/models/framework_users.rb @@ -15,12 +15,16 @@ class FrameworkUsers < ActiveRecord::Base has_many :roles, through: :assignments validates :lcasid, - presence: true + presence: true, numericality: true validates :name, presence: true validates :role, presence: true + def name_for_lcasid(lcasid) + find_by(lcasid:)&.name + end + class << self # Hardcoded admins - so if for some reason all of the # admins in the DB are deleted, we still have a way of diff --git a/app/models/stack_request.rb b/app/models/stack_request.rb index 131410c1..320c13b5 100644 --- a/app/models/stack_request.rb +++ b/app/models/stack_request.rb @@ -10,6 +10,27 @@ class StackRequest < ActiveRecord::Base presence: true, email: true + # Return the human-friendly status for this request. + def status + case approvedeny + when nil + 'Unprocessed' + when true + 'Approved' + when false + 'Denied' + end + end + + # Return the name of the person who processed this request. + def processor_name + if processed_by_id.present? + FrameworkUsers.name_from_lcasid(processed_by_id) + else + processed_by + end + end + private # For Stack Pass: diff --git a/app/views/reference_card_forms/show.html.erb b/app/views/reference_card_forms/show.html.erb index c01c0a75..c4432d3c 100644 --- a/app/views/reference_card_forms/show.html.erb +++ b/app/views/reference_card_forms/show.html.erb @@ -72,8 +72,7 @@
- <%= label_tag(:processed_by, "Processed by (enter your name):", class: "control-label") %>
- <%= text_field_tag(:processed_by, @current_user.display_name, placeholder: "Enter your name", class: "form-control", required: true) %> + Processed by: <%= @current_user.display_name %>
diff --git a/app/views/stack_pass_admin/admin.html.erb b/app/views/stack_pass_admin/admin.html.erb index d790951d..b3e22b55 100644 --- a/app/views/stack_pass_admin/admin.html.erb +++ b/app/views/stack_pass_admin/admin.html.erb @@ -1,8 +1,9 @@

Stack Pass/Reference Card - Administration

-
-<%= link_to 'View all Stack Pass requests', forms_stack_pass_admin_stack_passes_path %> -
-<%= link_to 'View all Reference Card requests', forms_stack_pass_admin_reference_cards_path %> -
-<%= link_to 'Edit/Add Administrators', forms_stack_pass_admin_users_path %> -
+ + + diff --git a/app/views/stack_pass_admin/users.html.erb b/app/views/stack_pass_admin/users.html.erb deleted file mode 100644 index d9b2d8e6..00000000 --- a/app/views/stack_pass_admin/users.html.erb +++ /dev/null @@ -1,58 +0,0 @@ - -

Manage Stack Pass/Reference Card Administrators

- <%= link_to 'Admin Home', forms_stack_pass_admin_path, class: "title-link text-nowrap" %> -
-<%= form_with url: "/forms/stack-pass-admin/add_user", local:true do %> -
-

Add Admin:

-
- <%= label_tag(:lcasid, "User ID:", class: "col-2") %> - <%= text_field_tag(:lcasid, nil, size: 40, placeholder: "UID", class: "col-4", required: true, autofocus: true) %> -
-
- <%= label_tag(:name, "Full Name:", class: "col-2") %> - <%= text_field_tag(:name, nil, size: 40, placeholder: "John Doe", class: "col-4", required: true) %> -
-
- -
-
-<% end %> -
-

Edit Admin:

-
-
-
- Administrators -
-
- User ID -
-
- Action -
-
-
-
- <% @users.each do |u| %> -
- - <%= hidden_field( :FrameworkUsers, :id, :value => u.id ) %> - -
- <%= u.name %> -
- -
- <%= u.lcasid %> -
- -
- <%= link_to 'Remove', forms_stack_pass_delete_user_path(u), - method: :delete, - data: {confirm: "Are you sure you want to delete #{u.name}?"}, - class: 'btn btn-sm btn-danger btn-white-text' %> -
-
- <% end %> -
diff --git a/app/views/stack_pass_forms/show.html.erb b/app/views/stack_pass_forms/show.html.erb index 91fcf0d6..afd170e4 100644 --- a/app/views/stack_pass_forms/show.html.erb +++ b/app/views/stack_pass_forms/show.html.erb @@ -118,7 +118,7 @@ Processed By: - <%= @req.processed_by %> + <%= @req.processor_name %>
diff --git a/app/views/stack_pass_users/_form.html.erb b/app/views/stack_pass_users/_form.html.erb new file mode 100644 index 00000000..eef06770 --- /dev/null +++ b/app/views/stack_pass_users/_form.html.erb @@ -0,0 +1,15 @@ +<%= form_for(@user, url: action_url) do |f| %> + <%= render 'application/form_error', model: @user if @user.errors.any? %> + <% if @user.persisted? %> +
+ +

<%= @user.lcasid %>

+
+ <% else %> + <%= field_for f, :lcasid, required: true %> + <% end %> + <%= field_for f, :name, required: true %> +
+ <%= f.submit 'Save Administrator', class: 'btn btn-primary' %> +
+<% end %> diff --git a/app/views/stack_pass_users/index.html.erb b/app/views/stack_pass_users/index.html.erb new file mode 100644 index 00000000..93311066 --- /dev/null +++ b/app/views/stack_pass_users/index.html.erb @@ -0,0 +1,35 @@ + +

<%= t('.page_title') %>

+ <%= link_to 'Admin Home', forms_stack_pass_admin_path, class: "title-link text-nowrap" %> +
+ +<%= link_to 'Add New', new_stack_pass_user_path, class: 'btn btn-sm btn-success btn-white-text m-3', title: 'Add New Administrator' %> + + + + + + + + + + + <% @users.each do |u| %> + + + + + + + <% end %> + +
Administrator NameUser IDAction
+ <%= u.name %> + + <%= u.lcasid %> + + <%= link_to 'Remove', stack_pass_user_path(u.lcasid), + method: :delete, + data: {confirm: "Are you sure you want to remove #{u.name} as an administrator?"}, + class: 'btn btn-sm btn-danger btn-white-text', title: 'Remove Administrator' %> +
diff --git a/app/views/stack_pass_users/new.html.erb b/app/views/stack_pass_users/new.html.erb new file mode 100644 index 00000000..a6727447 --- /dev/null +++ b/app/views/stack_pass_users/new.html.erb @@ -0,0 +1,6 @@ + +

<%= t('.page_title') %>

+ <%= link_to 'Admin Home', forms_stack_pass_admin_path, class: "title-link text-nowrap" %> +
+ +<%= render 'form', action_url: stack_pass_users_url %> diff --git a/config/locales/en.yml b/config/locales/en.yml index a3ad25cf..05a692e0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -59,6 +59,9 @@ en: research_middle: Middle name or initial of (research assistant) proxy dsp_rep: Name of DSP Representative date_term: The term of the Proxy Card + framework_users: + lcasid: User ID + name: Full Name location_request: email: Email address filename: Input file @@ -299,11 +302,21 @@ en: stack_pass_admin: admin: page_title: Stack Pass Administration - users: - page_title: Add/Edit Administrators requests: page_title: Stack Pass Requests + stack_pass_users: + index: + page_title: Manage Stack Pass/Reference Card Administrators + new: + page_title: Add Stack Pass/Reference Card Administrator + create: + page_title: Add Stack Pass/Reference Card Administrator + edit: + page_title: Edit Stack Pass/Reference Card Administrator + update: + page_title: Edit Stack Pass/Reference Card Administrator + fees: index: page_title: Library Fees List diff --git a/config/routes.rb b/config/routes.rb index e8f7bbdd..81a0fc6b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -60,9 +60,7 @@ get '/forms/stack-pass-admin/', to: 'stack_pass_admin#admin' get '/forms/stack-pass-admin/stack-passes', to: 'stack_pass_admin#stackpasses' get '/forms/stack-pass-admin/reference-cards', to: 'stack_pass_admin#refcards' - get '/forms/stack-pass-admin/users', to: 'stack_pass_admin#users' - post '/forms/stack-pass-admin/add_user', to: 'stack_pass_admin#add_user' - delete '/forms/stack-pass-admin/delete_user/:id(.:format)', to: 'stack_pass_admin#destroy_user', as: :forms_stack_pass_delete_user + resources :stack_pass_users, path: '/forms/stack-pass-admin/users', except: [:show, :edit, :update] # Proxy Borrower Form (DSP and Faculty) Routes: get '/forms/proxy-borrower/dsp', to: 'proxy_borrower_forms#dsp_form' diff --git a/db/migrate/20250710003327_add_processed_by_id_to_stack_requests.rb b/db/migrate/20250710003327_add_processed_by_id_to_stack_requests.rb new file mode 100644 index 00000000..598af45a --- /dev/null +++ b/db/migrate/20250710003327_add_processed_by_id_to_stack_requests.rb @@ -0,0 +1,17 @@ +class AddProcessedByIdToStackRequests < ActiveRecord::Migration[7.0] + def up + add_column :stack_requests, :processed_by_id, :integer + add_foreign_key :stack_requests, :framework_users, column: :processed_by_id + + StackRequest.find_each do |request| + request.processed_by_id = FrameworkUsers.find_by_name(request.processed_by) + end + end + + def down + StackRequest.where(processed_by: nil).find_each do |request| + request.processed_by = FrameworkUsers.name_for_lcasid(request.processed_by_id) + end + delete_column :stack_requests, :processed_by_id, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 87caa02f..07e17223 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2025_04_04_180042) do +ActiveRecord::Schema[7.0].define(version: 2025_07_10_003327) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" @@ -235,6 +235,7 @@ t.string "affiliation" t.text "research_desc" t.date "pass_date_end" + t.integer "processed_by_id" end create_table "tind_validators", force: :cascade do |t| @@ -250,4 +251,5 @@ add_foreign_key "host_bib_linked_bibs", "linked_bibs" add_foreign_key "host_bibs", "host_bib_tasks" add_foreign_key "location_records", "location_requests" + add_foreign_key "stack_requests", "framework_users", column: "processed_by_id" end