canvas-lms/app/models/planner_override.rb

117 lines
3.7 KiB
Ruby

# frozen_string_literal: true
#
# Copyright (C) 2017 - 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 PlannerOverride < ActiveRecord::Base
include Workflow
CONTENT_TYPES = PlannerHelper::PLANNABLE_TYPES.values
before_validation :link_to_parent_topic, :link_to_submittable
belongs_to :plannable, polymorphic:
[:announcement, :assignment, :discussion_topic, :planner_note, :wiki_page, :calendar_event, :assessment_request,
quiz: 'Quizzes::Quiz']
belongs_to :user
validates :plannable_id, :plannable_type, :workflow_state, :user_id, presence: true
validates :plannable_id, uniqueness: {scope: [:user_id, :plannable_type]}
scope :active, -> { where workflow_state: 'active' }
scope :deleted, -> { where workflow_state: 'deleted' }
scope :not_deleted, -> { where.not deleted }
scope :for_user, -> (user) { where user: user }
workflow do
state :active do
event :unpublish, :transitions_to => :unpublished
end
state :unpublished do
event :publish, :transitions_to => :active
end
state :deleted
end
alias published? active?
def link_to_parent_topic
return unless self.plannable_type == 'DiscussionTopic'
plannable = DiscussionTopic.find(self.plannable_id)
self.plannable_id = plannable.root_topic_id if plannable.root_topic_id
end
def link_to_submittable
return unless self.plannable_type == 'Assignment'
plannable = Assignment.find_by(id: self.plannable_id)
if plannable&.quiz?
self.plannable_type = PlannerHelper::PLANNABLE_TYPES['quiz']
self.plannable_id = plannable.quiz.id
elsif plannable&.discussion_topic?
self.plannable_type = PlannerHelper::PLANNABLE_TYPES['discussion_topic']
self.plannable_id = plannable.discussion_topic.id
elsif plannable&.wiki_page?
self.plannable_type = PlannerHelper::PLANNABLE_TYPES['wiki_page']
self.plannable_id = plannable.wiki_page.id
end
end
def associated_assignment_id
return self.plannable_id if self.plannable_type == 'Assignment'
self.plannable.assignment_id if self.plannable.respond_to? :assignment_id
end
def self.update_for(obj)
overrides = PlannerOverride.where(plannable_id: obj.id, plannable_type: obj.class.to_s)
overrides.update_all(workflow_state: plannable_workflow_state(obj)) if overrides.exists?
end
def self.plannable_workflow_state(plannable)
if plannable.respond_to?(:published?)
if plannable.respond_to?(:deleted?) && plannable.deleted?
'deleted'
elsif plannable.published?
'active'
else
'unpublished'
end
else
if plannable.respond_to?(:workflow_state)
workflow_state = plannable.workflow_state.to_s
if ['active', 'available', 'published'].include?(workflow_state)
'active'
elsif ['unpublished', 'deleted'].include?(workflow_state)
workflow_state
end
else
'unpublished'
end
end
end
def plannable_workflow_state
PlannerOverride.plannable_workflow_state(self.plannable)
end
alias_method :destroy_permanently!, :destroy
def destroy
self.workflow_state = 'deleted'
self.deleted_at = Time.now.utc
self.save
end
end