otwarchive-symphonyarchive/app/controllers/potential_matches_controller.rb

147 lines
5.8 KiB
Ruby
Raw Normal View History

2026-03-11 22:22:11 +00:00
class PotentialMatchesController < ApplicationController
before_action :users_only
before_action :load_collection
before_action :collection_maintainers_only
before_action :load_challenge
before_action :check_assignments_not_sent
before_action :check_signup_closed, only: [:generate]
before_action :load_potential_match_from_id, only: [:show]
def load_challenge
@challenge = @collection.challenge
no_challenge and return unless @challenge
end
def no_challenge
flash[:error] = ts("What challenge did you want to sign up for?")
redirect_to collection_path(@collection) rescue redirect_to '/'
false
end
def load_potential_match_from_id
@potential_match = PotentialMatch.find(params[:id])
no_potential_match and return unless @potential_match
end
def no_assignment
flash[:error] = ts("What potential match did you want to work on?")
redirect_to collection_path(@collection) rescue redirect_to '/'
false
end
def check_signup_closed
signup_open and return unless !@challenge.signup_open
end
def signup_open
flash[:error] = ts("Sign-up is still open, you cannot determine potential matches now.")
redirect_to @collection rescue redirect_to '/'
false
end
def check_assignments_not_sent
assignments_sent and return unless @challenge.assignments_sent_at.nil?
end
def assignments_sent
flash[:error] = ts("Assignments have already been sent! If necessary, you can purge them.")
redirect_to collection_assignments_path(@collection) rescue redirect_to '/'
false
end
def index
@settings = @collection.challenge.potential_match_settings
if (invalid_ids = PotentialMatch.invalid_signups_for(@collection)).present?
# there are invalid signups
@invalid_signups = ChallengeSignup.where(id: invalid_ids)
elsif PotentialMatch.in_progress?(@collection)
# we're generating
@in_progress = true
@progress = PotentialMatch.progress(@collection)
elsif ChallengeAssignment.in_progress?(@collection)
@assignment_in_progress = true
elsif @collection.potential_matches.count > 0 && @collection.assignments.count == 0
flash[:error] = ts("There has been an error in the potential matching. Please first try regenerating assignments, and if that doesn't work, all potential matches. If the problem persists, please contact Support.")
elsif @collection.potential_matches.count > 0
# we have potential_matches and assignments
### find assignments with no potential recipients
# first get signups with no offer potential matches
no_opms = ChallengeSignup.in_collection(@collection).no_potential_offers.pluck(:id)
@assignments_with_no_potential_recipients = @collection.assignments.where(offer_signup_id: no_opms)
### find assignments with no potential giver
# first get signups with no request potential matches
no_rpms = ChallengeSignup.in_collection(@collection).no_potential_requests.pluck(:id)
@assignments_with_no_potential_givers = @collection.assignments.where(request_signup_id: no_rpms)
# list the assignments by requester
if params[:no_giver]
@assignments = @collection.assignments.with_request.with_no_offer.order_by_requesting_pseud
elsif params[:no_recipient]
# ordering causes this to hang on large challenge due to
# left join required to get offering pseuds
@assignments = @collection.assignments.with_offer.with_no_request # .order_by_offering_pseud
elsif params[:dup_giver]
@assignments = ChallengeAssignment.duplicate_givers(@collection).order_by_offering_pseud
elsif params[:dup_recipient]
@assignments = ChallengeAssignment.duplicate_recipients(@collection).order_by_requesting_pseud
else
@assignments = @collection.assignments.with_request.with_offer.order_by_requesting_pseud
end
@assignments = @assignments.paginate page: params[:page], per_page: ArchiveConfig.ITEMS_PER_PAGE
end
end
# Generate potential matches
def generate
if PotentialMatch.in_progress?(@collection)
flash[:error] = ts("Potential matches are already being generated for this collection!")
else
# delete all existing assignments and potential matches for this collection
ChallengeAssignment.clear!(@collection)
PotentialMatch.clear!(@collection)
flash[:notice] = ts("Beginning generation of potential matches. This may take some time, especially if your challenge is large.")
PotentialMatch.set_up_generating(@collection)
PotentialMatch.generate(@collection)
end
# redirect to index
redirect_to collection_potential_matches_path(@collection)
end
# Regenerate matches for one signup
def regenerate_for_signup
if params[:signup_id].blank? || (@signup = ChallengeSignup.where(id: params[:signup_id]).first).nil?
flash[:error] = ts("What sign-up did you want to regenerate matches for?")
else
PotentialMatch.regenerate_for_signup(@signup)
flash[:notice] = ts("Matches are being regenerated for ") + @signup.pseud.byline +
ts(". Please allow at least 5 minutes for this process to complete before refreshing the page.")
end
# redirect to index
redirect_to collection_potential_matches_path(@collection)
end
def cancel_generate
if !PotentialMatch.in_progress?(@collection)
flash[:error] = ts("Potential matches are not currently being generated for this challenge.")
elsif PotentialMatch.canceled?(@collection)
flash[:error] = ts("Potential match generation has already been canceled, please refresh again shortly.")
else
PotentialMatch.cancel_generation(@collection)
flash[:notice] = ts("Potential match generation cancellation requested. This may take a while, please refresh shortly.")
end
redirect_to collection_potential_matches_path(@collection)
end
def show
end
end