# Mentorenwahl: A fullstack application for assigning mentors to students based on their whishes. # Copyright (C) 2022 Dominic Grimm # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . module Backend module Worker module Jobs # Assigns students to teachers when all students voted class AssignStudentsJob < Mosquito::QueuedJob # run_every 1.minute def rescheduleable? : Bool false end alias TeacherVote = {student: Int32, priority: Int32} alias Assignment = {teacher: Int32, priority: Int32} # :ditto: def perform : Nil teacher_count = Db::Teacher.query.count student_count = Db::Student.query.count vote_count = Db::Vote.query.count if teacher_count == 0 log "No teachers found, skipping assignment" fail elsif student_count == 0 log "No students found, skipping assignment" fail elsif student_count != Db::User.query.where(role: Db::UserRole::Student).count log "Not all students registered, skipping assignment" fail elsif vote_count < student_count log "Not all students voted, skipping assignment" fail elsif Db::Assignment.query.count > 0 log "Assignment has already run, skipping another assignment" fail end teachers = Db::Teacher.query .where do raw("EXISTS (SELECT 1 FROM teacher_votes WHERE teacher_id = teachers.id)") & max_students > 0 end end end end end end