canvas-lms/app/presenters/submission/show_presenter.rb

121 lines
3.5 KiB
Ruby

# frozen_string_literal: true
# Copyright (C) 2019 - 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 Submission::ShowPresenter
include Rails.application.routes.url_helpers
include ApplicationHelper
def initialize(submission:, current_user:, assessment_request: nil, current_host: nil)
@submission = submission
@current_user = current_user
@assessment_request = assessment_request
@assignment = @submission.assignment
@context = @assignment.context
@current_host = current_host
end
def default_url_options
{ protocol: HostUrl.protocol, host: find_host }
end
# NB: Currently this method assumes that the only possible source of anonymity
# on the submission details is anonymous peer reviews (since teachers cannot
# view the page at all if anonymous grading is enabled). If it becomes possible
# to view submission details anonymously as a teacher, this check will need to
# be adjusted accordingly.
def anonymize_submission_owner?
@assessment_request.present? && @assignment.anonymous_peer_reviews?
end
def add_comment_url
if viewing_as_grader?
context_url(@context, :update_submission_context_gradebook_url)
else
submission_data_url
end
end
def add_comment_method
if viewing_as_grader?
"POST"
else
"PUT"
end
end
def submission_data_url(**additional_params)
submission_route = if anonymize_submission_owner?
:context_assignment_anonymous_submission_url
else
:context_assignment_submission_url
end
context_url(@context, submission_route, @assignment.id, anonymizable_student_id, **additional_params)
end
def submission_details_tool_launch_url
params = {
assignment_id: @assignment.id,
display: 'borderless',
url: @submission.external_tool_url
}
params[:resource_link_lookup_uuid] = resource_link_lookup_uuid if resource_link_lookup_uuid
retrieve_course_external_tools_url(@context.id, params)
end
def submission_preview_frame_url
submission_data_url(preview: 1, rand: rand(999999))
end
def comment_attachment_download_url(submission_comment:, attachment:)
submission_data_url(comment_id: submission_comment.id, download: attachment.id)
end
def comment_attachment_template_url
submission_data_url(comment_id: "{{ comment_id }}", download: "{{ id }}")
end
def currently_peer_reviewing?
@assessment_request&.assigned?
end
private
def anonymizable_student_id
anonymize_submission_owner? ? @submission.anonymous_id : @submission.user_id
end
def viewing_as_grader?
!currently_peer_reviewing? && @context.grants_right?(@current_user, :manage_grades)
end
def resource_link_lookup_uuid
@submission.resource_link_lookup_uuid
end
def find_host
return HostUrl.context_host(@context.root_account) unless @current_host
HostUrl.context_host(@context.root_account, @current_host)
end
end