canvas-lms/app/models/ignore.rb

57 lines
2.6 KiB
Ruby

# frozen_string_literal: true
#
# Copyright (C) 2011 - present Instructure, Inc.
#
# This file is part of Canvas.
#
# Canvas is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, version 3 of the License.
#
# Canvas 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 Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
class Ignore < ActiveRecord::Base
belongs_to :user
belongs_to :asset, polymorphic: [:assignment, :assessment_request, quiz: "Quizzes::Quiz"]
validates :user_id, :asset_id, :asset_type, :purpose, presence: true
validates :permanent, inclusion: { in: [false, true] }
def self.cleanup
GuardRail.activate(:secondary) do
Ignore.select(:id)
.joins("LEFT JOIN #{Assignment.quoted_table_name} AS a ON a.id = ignores.asset_id AND 'Assignment' = ignores.asset_type
LEFT JOIN #{Quizzes::Quiz.quoted_table_name} AS q ON q.id = ignores.asset_id AND 'Quizzes::Quiz' = ignores.asset_type
LEFT JOIN #{AssessmentRequest.quoted_table_name} AS ar ON ar.id = ignores.asset_id AND 'AssessmentRequest' = ignores.asset_type
LEFT JOIN #{Submission.quoted_table_name} AS s ON ar.asset_id = s.id AND ar.asset_type = 'Submission'
LEFT JOIN #{Assignment.quoted_table_name} AS ara ON ara.id = s.assignment_id")
.where("(a.id IS NULL AND q.id IS NULL AND ar.id IS NULL)
OR (a.workflow_state = 'deleted' AND a.updated_at < :deletion_time)
OR (q.workflow_state = 'deleted' AND q.updated_at < :deletion_time)
OR (ar.workflow_state = 'deleted' AND ar.updated_at < :deletion_time)
OR (NOT EXISTS (
SELECT 1
FROM #{Enrollment.quoted_table_name}
WHERE enrollments.user_id = ignores.user_id
AND (enrollments.course_id = a.context_id
OR enrollments.course_id = q.context_id
OR enrollments.course_id = ara.context_id)
AND (enrollments.workflow_state <> 'deleted'
OR enrollments.updated_at > :deletion_time)))",
{ deletion_time: 1.month.ago }).find_in_batches do |batch|
GuardRail.activate(:primary) do
Ignore.where(id: batch).delete_all
end
end
end
end
end