Add new method on Submission model for OriginalityReport
Fixes: PLAT-1911 Test Plan: - Create an OriginalityReport for a submission with a file attachment. Give a value to the report's originality_report_url field in addition to required fields. - Navigate to /courses/:course_id/assignments/ :assignment_id/submissions/:user_id/ originality_report/:asset_string - Verify you are redirected to the OriginalityReport's originality_report_url - Navigate to the same URL as a user that does not have the :view_turnitin_report permission and verify you get an error. Change-Id: If4f18995ea0af9c441998d2cfc27b0a29b582d05 Reviewed-on: https://gerrit.instructure.com/96561 Reviewed-by: Nathan Mills <nathanm@instructure.com> QA-Review: August Thornton <august@instructure.com> Tested-by: Jenkins Reviewed-by: Keith T. Garner <kgarner@instructure.com> Product-Review: Weston Dransfield <wdransfield@instructure.com>
This commit is contained in:
parent
9c7651d635
commit
22cd2e0764
|
@ -477,6 +477,31 @@ class SubmissionsController < ApplicationController
|
|||
resubmit_to_plagiarism('vericite')
|
||||
end
|
||||
|
||||
def originality_report
|
||||
plagiarism_report('originality_report')
|
||||
end
|
||||
|
||||
def legacy_plagiarism_report(submission, asset_string, type)
|
||||
plag_data = submission.turnitin_data
|
||||
url = nil
|
||||
if type == 'vericite'
|
||||
plag_data = submission.vericite_data
|
||||
end
|
||||
if (report_url = plag_data[asset_string] && plag_data[asset_string][:report_url])
|
||||
url = polymorphic_url([:retrieve, @context, :external_tools], url:report_url, display:'borderless')
|
||||
else
|
||||
if type == 'vericite'
|
||||
# VeriCite URL
|
||||
url = submission.vericite_report_url(asset_string, @current_user, session) rescue nil
|
||||
else
|
||||
# Turnitin URL
|
||||
url = submission.turnitin_report_url(asset_string, @current_user) rescue nil
|
||||
end
|
||||
end
|
||||
url
|
||||
end
|
||||
private :legacy_plagiarism_report
|
||||
|
||||
def plagiarism_report(type)
|
||||
return render(:nothing => true, :status => 400) unless params_are_integers?(:assignment_id, :submission_id)
|
||||
|
||||
|
@ -484,21 +509,12 @@ class SubmissionsController < ApplicationController
|
|||
@submission = @assignment.submissions.where(user_id: params[:submission_id]).first
|
||||
@asset_string = params[:asset_string]
|
||||
if authorized_action(@submission, @current_user, :read)
|
||||
plag_data = @submission.turnitin_data
|
||||
if type == 'vericite'
|
||||
plag_data = @submission.vericite_data
|
||||
end
|
||||
if (report_url = plag_data[@asset_string] && plag_data[@asset_string][:report_url])
|
||||
url = polymorphic_url([:retrieve, @context, :external_tools], url:report_url, display:'borderless')
|
||||
if type == 'originality_report'
|
||||
url = @submission.originality_report_url(@asset_string, @current_user)
|
||||
else
|
||||
if type == 'vericite'
|
||||
# VeriCite URL
|
||||
url = @submission.vericite_report_url(@asset_string, @current_user, session) rescue nil
|
||||
else
|
||||
# Turnitin URL
|
||||
url = @submission.turnitin_report_url(@asset_string, @current_user) rescue nil
|
||||
end
|
||||
url = legacy_plagiarism_report(@submission, @asset_string, type)
|
||||
end
|
||||
|
||||
if url
|
||||
redirect_to url
|
||||
else
|
||||
|
|
|
@ -536,6 +536,17 @@ class Submission < ActiveRecord::Base
|
|||
end
|
||||
end
|
||||
|
||||
# Preload OriginalityReport before using this method
|
||||
def originality_report_url(asset_string, user)
|
||||
url = nil
|
||||
if self.grants_right?(user, :view_turnitin_report)
|
||||
attachment = self.attachments.find_by_asset_string(asset_string)
|
||||
report = self.originality_reports.find_by(attachment: attachment)
|
||||
url = report.originality_report_url if report
|
||||
end
|
||||
url
|
||||
end
|
||||
|
||||
def delete_turnitin_errors
|
||||
self.turnitin_data.delete(:status)
|
||||
self.turnitin_data.delete(:assignment_error)
|
||||
|
|
|
@ -238,6 +238,7 @@ CanvasRails::Application.routes.draw do
|
|||
request.query_parameters.key?(:download)
|
||||
end
|
||||
resources :submissions do
|
||||
get 'originality_report/:asset_string' => 'submissions#originality_report', as: :originality_report
|
||||
post 'turnitin/resubmit' => 'submissions#resubmit_to_turnitin', as: :resubmit_to_turnitin
|
||||
get 'turnitin/:asset_string' => 'submissions#turnitin_report', as: :turnitin_report
|
||||
post 'vericite/resubmit' => 'submissions#resubmit_to_vericite', as: :resubmit_to_vericite
|
||||
|
|
|
@ -612,24 +612,71 @@ describe SubmissionsController do
|
|||
end
|
||||
end
|
||||
|
||||
describe 'GET turnitin_report' do
|
||||
describe 'GET originality_report' do
|
||||
let_once(:test_course) do
|
||||
test_course = course(active_course: true)
|
||||
test_course.enroll_teacher(test_teacher, enrollment_state: 'active')
|
||||
test_course.enroll_student(test_student, enrollment_state: 'active')
|
||||
test_course
|
||||
end
|
||||
|
||||
let_once(:test_teacher) { User.create }
|
||||
let_once(:test_student) { User.create }
|
||||
let_once(:assignment) { Assignment.create!(title: 'test assignment', context: test_course) }
|
||||
let_once(:attachment) { attachment_model(filename: "submission.doc", context: test_student) }
|
||||
let_once(:submission) { assignment.submit_homework(test_student, attachments: [attachment]) }
|
||||
let!(:originality_report) {
|
||||
OriginalityReport.create!(attachment: attachment,
|
||||
submission: submission,
|
||||
originality_score: 0.5,
|
||||
originality_report_url: 'http://www.instructure.com')
|
||||
}
|
||||
|
||||
|
||||
before :each do
|
||||
user_session(test_teacher)
|
||||
end
|
||||
|
||||
it 'redirects to the originality report URL if it exists' do
|
||||
|
||||
get 'originality_report', course_id: assignment.context_id, assignment_id: assignment.id, submission_id: test_student.id, asset_string: attachment.asset_string
|
||||
expect(response).to redirect_to originality_report.originality_report_url
|
||||
end
|
||||
|
||||
|
||||
it 'returns 400 if submission_id is not integer' do
|
||||
get 'originality_report', :course_id => assignment.context_id, :assignment_id => assignment.id, :submission_id => '{{ user_id }}', :asset_string => attachment.asset_string
|
||||
expect(response.response_code).to eq 400
|
||||
end
|
||||
|
||||
it "returns unauthorized for users who can't read submission" do
|
||||
unauthorized_user = User.create
|
||||
user_session(unauthorized_user)
|
||||
get 'originality_report', course_id: assignment.context_id, assignment_id: assignment.id, submission_id: test_student.id, asset_string: attachment.asset_string
|
||||
expect(response.status).to eq 401
|
||||
end
|
||||
|
||||
it 'gives error if no url is present for the OriginalityReport' do
|
||||
originality_report.update_attribute(:originality_report_url, nil)
|
||||
get 'originality_report', course_id: assignment.context_id, assignment_id: assignment.id, submission_id: test_student.id, asset_string: attachment.asset_string
|
||||
expect(flash[:notice]).to be_present
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET turnitin_report' do
|
||||
it 'returns 400 if submission_id is not integer' do
|
||||
assignment = assignment_model
|
||||
get 'turnitin_report', :course_id => assignment.context_id, :assignment_id => assignment.id, :submission_id => '{{ user_id }}', :asset_string => '123'
|
||||
expect(response.response_code).to eq 400
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe 'POST resubmit_to_turnitin' do
|
||||
|
||||
it 'returns 400 if submission_id is not integer' do
|
||||
assignment = assignment_model
|
||||
post 'resubmit_to_turnitin', :course_id => assignment.context_id, :assignment_id => assignment.id, :submission_id => '{{ user_id }}'
|
||||
expect(response.response_code).to eq 400
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "copy_attachments_to_submissions_folder" do
|
||||
|
|
|
@ -856,6 +856,46 @@ describe Submission do
|
|||
|
||||
end
|
||||
|
||||
describe '#originality_report_url' do
|
||||
let_once(:test_course) do
|
||||
test_course = course_model
|
||||
test_course.enroll_teacher(test_teacher, enrollment_state: 'active')
|
||||
test_course.enroll_student(test_student, enrollment_state: 'active')
|
||||
test_course
|
||||
end
|
||||
|
||||
let_once(:test_teacher) { User.create }
|
||||
let_once(:test_student) { User.create }
|
||||
let_once(:assignment) { Assignment.create!(title: 'test assignment', context: test_course) }
|
||||
let_once(:attachment) { attachment_model(filename: "submission.doc", context: test_student) }
|
||||
let_once(:submission) { assignment.submit_homework(test_student, attachments: [attachment]) }
|
||||
let_once(:report_url) { 'http://www.test-score.com' }
|
||||
let!(:originality_report) {
|
||||
OriginalityReport.create!(attachment: attachment,
|
||||
submission: submission,
|
||||
originality_score: 0.5,
|
||||
originality_report_url: report_url)
|
||||
}
|
||||
|
||||
it 'returns nil if no originality report exists for the submission' do
|
||||
originality_report.destroy
|
||||
expect(submission.originality_report_url(attachment.asset_string, test_teacher)).to be_nil
|
||||
end
|
||||
|
||||
it 'returns nil if no report url is present in the report' do
|
||||
originality_report.update_attribute(:originality_report_url, nil)
|
||||
expect(submission.originality_report_url(attachment.asset_string, test_teacher)).to be_nil
|
||||
end
|
||||
|
||||
it 'returns the originality_report_url if present' do
|
||||
expect(submission.originality_report_url(attachment.asset_string, test_teacher)).to eq(report_url)
|
||||
end
|
||||
|
||||
it 'requires the :grade permission' do
|
||||
unauthorized_user = User.new
|
||||
expect(submission.originality_report_url(attachment.asset_string, unauthorized_user)).to be_nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "turnitin" do
|
||||
|
|
Loading…
Reference in New Issue