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:
wdransfield 2016-12-01 10:37:20 -07:00 committed by Weston Dransfield
parent 9c7651d635
commit 22cd2e0764
5 changed files with 132 additions and 17 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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