create method for returning originality data

fixes PLAT-1912

test plan:
- Create an OriginalityReport for an attachment on a submission
- Call #originality_data on the submission
- You should get back the originality_report data

- Create some tii data on a submission
- call #originality_data on the submission

Change-Id: I35687c9b8d3e87a9d2359efadb5854452a47c8a8
Reviewed-on: https://gerrit.instructure.com/96583
Tested-by: Jenkins
Reviewed-by: Weston Dransfield <wdransfield@instructure.com>
Reviewed-by: Keith T. Garner <kgarner@instructure.com>
QA-Review: August Thornton <august@instructure.com>
Product-Review: Nathan Mills <nathanm@instructure.com>
This commit is contained in:
Nathan Mills 2016-12-01 17:53:32 -07:00
parent a7755efe34
commit 2c0150a733
6 changed files with 96 additions and 3 deletions

View File

@ -4,11 +4,12 @@ class OriginalityReport < ActiveRecord::Base
belongs_to :attachment
belongs_to :originality_report_attachment, class_name: "Attachment"
validates :originality_score, :attachment, :submission, presence: true
validates :originality_score, inclusion: { in: 0..1, message: 'score must be between 0 and 1' }
validates :originality_score, inclusion: { in: 0..100, message: 'score must be between 0 and 100' }
validates :workflow_state, inclusion: { in: ['scored', 'error', 'pending'] }
alias_attribute :file_id, :attachment_id
alias_attribute :originality_report_file_id, :originality_report_attachment_id
before_validation { self.workflow_state ||= 'pending' }
def state
Turnitin.state_from_similarity_score(originality_score)

View File

@ -74,6 +74,7 @@ class Submission < ActiveRecord::Base
has_many :rubric_assessments, :as => :artifact
has_many :attachment_associations, :as => :context
has_many :provisional_grades, class_name: 'ModeratedGrading::ProvisionalGrade'
has_many :originality_reports
has_one :rubric_assessment, -> { where(assessment_type: 'grading') }, as: :artifact
# we no longer link submission comments and conversations, but we haven't fixed up existing
@ -511,6 +512,20 @@ class Submission < ActiveRecord::Base
true
end
# This method pulls data from the OriginalityReport table
# Preload OriginalityReport before using this method in a collection of submissions
def originality_data
data = self.originality_reports.each_with_object({}) do |originality_report, hash|
hash[Attachment.asset_string(originality_report.attachment_id)] = {
similarity_score: originality_report.originality_score.round(2),
state: originality_report.state,
report_url: originality_report.originality_report_url,
status: originality_report.workflow_state
}
end
turnitin_data.merge(data)
end
def turnitin_assets
if self.submission_type == 'online_upload'
self.attachments.select{ |a| a.turnitinable? }

View File

@ -0,0 +1,6 @@
class ChangeOriginalityReportOriginalityScoreToFloat < ActiveRecord::Migration
tag :predeploy
def change
change_column :originality_reports, :originality_score, :float, null: false
end
end

View File

@ -173,7 +173,7 @@ describe 'Originality Reports API', type: :request do
it "does not update originality score if out of range" do
user_session(@teacher)
put @endpoints[:update], originality_report: {originality_score: 1.5}
put @endpoints[:update], originality_report: {originality_score: 150}
expect(response.status).to eq 400
expect(JSON.parse(response.body)['errors'].key? 'originality_score').to be_truthy

View File

@ -15,7 +15,7 @@ describe OriginalityReport do
it 'requires an originality score' do
subject.originality_score = nil
subject.valid?
expect(subject.errors[:originality_score]).to eq ["can't be blank", "score must be between 0 and 1"]
expect(subject.errors[:originality_score]).to eq ["can't be blank", "score must be between 0 and 100"]
end
it 'requires an attachment' do
@ -58,4 +58,9 @@ describe OriginalityReport do
subject.save!
expect(subject.originality_report_attachment).to eq originality_attachemnt
end
it 'returns the state of the originality report' do
expect(subject.state).to eq 'acceptable'
end
end

View File

@ -792,6 +792,72 @@ describe Submission do
end
end
context "OriginalityReport" do
let(:attachment) { attachment_model }
let(:course) { course_model }
let(:submission) { submission_model }
let(:originality_report) do
OriginalityReport.create!(attachment: attachment, originality_score: '1', submission: submission)
end
describe "#originality_data" do
it "generates the originality data" do
originality_report.originality_report_url = 'http://example.com'
originality_report.save!
expect(submission.originality_data).to eq({
attachment.asset_string => {
similarity_score: originality_report.originality_score,
state: originality_report.state,
report_url: originality_report.originality_report_url,
status: originality_report.workflow_state
}
})
end
it "includes tii data" do
tii_data = {
similarity_score: 10,
state: 'acceptable',
report_url: 'http://example.com',
status: 'scored'
}
submission.turnitin_data[attachment.asset_string] = tii_data
expect(submission.originality_data).to eq({
attachment.asset_string => tii_data
})
end
it "overrites the tii data with the originality data" do
originality_report.originality_report_url = 'http://example.com'
originality_report.save!
tii_data = {
similarity_score: 10,
state: 'acceptable',
report_url: 'http://example.com/tii',
status: 'pending'
}
submission.turnitin_data[attachment.asset_string] = tii_data
expect(submission.originality_data).to eq({
attachment.asset_string => {
similarity_score: originality_report.originality_score,
state: originality_report.state,
report_url: originality_report.originality_report_url,
status: originality_report.workflow_state
}
})
end
it "rounds the score to 2 decimal places" do
originality_report.originality_score = 2.94997
originality_report.save!
expect(submission.originality_data[attachment.asset_string][:similarity_score]).to eq(2.95)
end
end
end
context "turnitin" do
context "Turnitin LTI" do