Skip to content

Commit 17b9f96

Browse files
committed
show turnitin info in gradebook2, fixes #7450
show appropriate icon in each cell (if any), fix gradebook1 state logic (show worst state, not average), show turnitin icon/link for text entry submissions in the submission dialog 1. set up turnitin on the account 2. create an assignment that accepts text entries and uploads 3. enable turnitin on the assignment 4. as a student, upload a file submission (e.g. .doc or something turnitin likes) 5. as a different student, submit it via text entry 6. as a teacher, confirm that the turnitin icons now show up in gradebook2 7. click on each submission in gradebook2 to open the comment dialog 8. confirm that the turnitin icon is present, shows the score, and links to the originality report 9. go to gradebook1 10. confirm that the turnitin icons still display correctly Change-Id: If6db3bd5b627b7dd4d306b89f9d0f71acf41b22e Reviewed-on: https://gerrit.instructure.com/12522 Tested-by: Jenkins <jenkins@instructure.com> Reviewed-by: Zach Pendleton <zachp@instructure.com>
1 parent 4549b0c commit 17b9f96

15 files changed

Lines changed: 174 additions & 63 deletions

File tree

app/coffeescripts/SubmissionDetailsDialog.coffee

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ define [
22
'i18n!submission_details_dialog'
33
'jquery'
44
'jst/SubmissionDetailsDialog'
5+
'compiled/gradebook2/Turnitin'
56
'jst/_submission_detail' # a partial needed by the SubmissionDetailsDialog template
67
'jst/_turnitinScore' # a partial needed by the submission_detail partial
78
'jquery.ajaxJSON'
@@ -10,7 +11,7 @@ define [
1011
'jqueryui/dialog'
1112
'jquery.instructure_misc_plugins'
1213
'vendor/jquery.scrollTo'
13-
], (I18n, $, submissionDetailsDialog) ->
14+
], (I18n, $, submissionDetailsDialog, {extractDataFor}) ->
1415

1516
class SubmissionDetailsDialog
1617
constructor: (@assignment, @student, @options) ->
@@ -52,20 +53,14 @@ define [
5253
@submission.moreThanOneSubmission = @submission.submission_history.length > 1
5354
@submission.loading = false
5455
for submission in @submission.submission_history
55-
submission["submission_type_is#{submission.submission_type}"] = true
5656
submission.submissionWasLate = @assignment.due_at && new Date(@assignment.due_at) > new Date(submission.submitted_at)
5757
for comment in submission.submission_comments || []
5858
comment.url = "#{@options.context_url}/users/#{comment.author_id}"
5959
urlPrefix = "#{location.protocol}//#{location.host}"
6060
comment.image_url = "#{urlPrefix}/images/users/#{comment.author_id}?fallback=#{encodeURIComponent(urlPrefix+'/images/messages/avatar-50.png')}"
61+
submission.turnitin = extractDataFor(submission, "submission_#{submission.id}", @options.context_url)
6162
for attachment in submission.attachments || []
62-
if turnitinDataForThisAttachment = submission.turnitin_data?["attachment_#{attachment.id}"]
63-
if turnitinDataForThisAttachment["similarity_score"]
64-
attachment.turnitin_data = turnitinDataForThisAttachment
65-
attachment.turnitin_data.state = "#{turnitinDataForThisAttachment.state || 'no'}_score"
66-
attachment.turnitin_data.score = "#{turnitinDataForThisAttachment.similarity_score}%"
67-
attachment.turnitin_data.reportUrl = "#{@options.context_url}/assignments/#{@assignment.id}/submissions/#{@student.id}/turnitin/attachment_#{attachment.id}"
68-
attachment.turnitin_data.tooltip = I18n.t('turnitin.tooltip.score', 'Turnitin Similarity Score - See detailed report')
63+
attachment.turnitin = extractDataFor(submission, "attachment_#{attachment.id}", @options.context_url)
6964
@dialog.html(submissionDetailsDialog(@submission))
7065
@dialog.find('select').trigger('change')
7166
@scrollCommentsToBottom()

app/coffeescripts/gradebook2/GRADEBOOK_TRANSLATIONS.coffee

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ define ['i18n!gradebook2'], (I18n) ->
1111
submission_tooltip_online_text_entry: I18n.t('titles.text', "Text Entry Submission"),
1212
submission_tooltip_pending_review: I18n.t('titles.quiz_review', "This quiz needs review"),
1313
submission_tooltip_media_comment: I18n.t('titles.media', "Media Comment Submission"),
14-
submission_tooltip_quiz: I18n.t('title.quiz', "Quiz Submission")
14+
submission_tooltip_quiz: I18n.t('title.quiz', "Quiz Submission")
15+
submission_tooltip_turnitin: I18n.t('title.turnitin', 'Has Turnitin score')

app/coffeescripts/gradebook2/Gradebook.coffee

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ define [
217217
break
218218
params =
219219
student_ids: (student.id for student in students)
220-
response_fields: ['user_id', 'url', 'score', 'grade', 'submission_type', 'submitted_at', 'assignment_id', 'grade_matches_current_submission']
220+
response_fields: ['id', 'user_id', 'url', 'score', 'grade', 'submission_type', 'submitted_at', 'assignment_id', 'grade_matches_current_submission', 'attachments']
221221
$.ajaxJSON(@options.submissions_url, "GET", params, @gotSubmissionsChunk)
222222
@chunk_start += @options.chunk_size
223223

app/coffeescripts/gradebook2/SubmissionCell.coffee

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ define [
22
'compiled/gradebook2/GRADEBOOK_TRANSLATIONS'
33
'jquery'
44
'underscore'
5+
'compiled/gradebook2/Turnitin'
56
'jquery.ajaxJSON'
6-
], (GRADEBOOK_TRANSLATIONS, $, _) ->
7+
], (GRADEBOOK_TRANSLATIONS, $, _, {extractData}) ->
78

89
class SubmissionCell
910

@@ -54,18 +55,22 @@ define [
5455

5556
cellWrapper: (innerContents, options = {}) ->
5657
opts = $.extend({}, {
57-
innerContents: '',
5858
classes: '',
5959
editable: true
6060
}, options)
6161
opts.submission ||= @opts.item[@opts.column.field]
6262
opts.assignment ||= @opts.column.object
6363
specialClasses = SubmissionCell.classesBasedOnSubmission(opts.submission, opts.assignment)
64-
tooltipText = $.map(specialClasses, (c)-> GRADEBOOK_TRANSLATIONS["submission_tooltip_#{c}"]).join ', '
6564

6665
opts.classes += ' no_grade_yet ' unless opts.submission.grade
6766
innerContents ?= if opts.submission?.submission_type then '<span class="submission_type_icon" />' else '-'
6867

68+
if turnitin = extractData(opts.submission)
69+
specialClasses.push('turnitin')
70+
innerContents += "<span class='gradebook-cell-turnitin #{turnitin.state}-score' />"
71+
72+
tooltipText = $.map(specialClasses, (c)-> GRADEBOOK_TRANSLATIONS["submission_tooltip_#{c}"]).join ', '
73+
6974
"""
7075
#{ if tooltipText then '<div class="gradebook-tooltip">'+ tooltipText + '</div>' else ''}
7176
<div class="gradebook-cell #{ if opts.editable then 'gradebook-cell-editable focus' else ''} #{opts.classes} #{specialClasses.join(' ')}">
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
define [
2+
'i18n!turnitin'
3+
'underscore'
4+
'compiled/util/invert'
5+
], (I18n, {max}, invert) ->
6+
7+
Turnitin =
8+
extractData: (submission) ->
9+
return unless submission?.turnitin_data
10+
data = items: []
11+
12+
if submission.attachments and submission.submission_type is 'online_upload'
13+
for attachment in submission.attachments
14+
attachment = attachment.attachment ? attachment
15+
if turnitin = submission.turnitin_data?['attachment_' + attachment.id]
16+
data.items.push turnitin
17+
else if submission.submission_type is "online_text_entry"
18+
if turnitin = submission.turnitin_data?['submission_' + submission.id]
19+
data.items.push turnitin
20+
21+
return unless data.items.length
22+
23+
stateList = ['no', 'none', 'acceptable', 'warning', 'problem', 'failure']
24+
stateMap = invert(stateList, parseInt)
25+
states = (stateMap[item.state] for item in data.items)
26+
data.state = stateList[max(states)]
27+
data
28+
29+
extractDataFor: (submission, key, urlPrefix) ->
30+
data = submission.turnitin_data
31+
return {} unless data and data[key] and data[key].similarity_score?
32+
data = data[key]
33+
data.state = "#{data.state || 'no'}_score"
34+
data.score = "#{data.similarity_score}%"
35+
data.reportUrl = "#{urlPrefix}/assignments/#{submission.assignment_id}/submissions/#{submission.user_id}/turnitin/#{key}"
36+
data.tooltip = I18n.t('tooltip.score', 'Turnitin Similarity Score - See detailed report')
37+
data
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# analogous to ruby's Hash#invert, namely it takes an object and inverts
2+
# the keys/values of its properties. takes an optional formatter for the
3+
# key->value translation (otherwise they will just default to strings).
4+
# in the event of duplicates, the last one wins.
5+
#
6+
# examples:
7+
#
8+
# > invert {a: 'A', b: 'B', c: 'C', dup: 'A'}
9+
# => {A: 'dup', B: 'b', C: 'c'}
10+
#
11+
# > invert ['a', 'b', 'c'], parseInt
12+
# => {a: 0, b: 1, c: 2}
13+
#
14+
15+
define ->
16+
17+
invert = (object, formatter) ->
18+
result = {}
19+
for own key, value of object
20+
result[value] = if formatter then formatter(key) else key
21+
result

app/stylesheets/gradebook2.sass

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,25 @@ $cell_height: 33px
216216
&.resubmitted
217217
background-image: url("/images/gradebook-resubmitted-indicator.png")
218218

219+
.gradebook-cell-turnitin
220+
position: absolute
221+
top: 2px
222+
right: 2px
223+
z-index: 1
224+
width: 20px
225+
height: 16px
226+
&.no-score
227+
background-image: url(/images/turnitin_no_score.png)
228+
&.none-score
229+
background-image: url(/images/turnitin_none_score.png)
230+
&.acceptable-score
231+
background-image: url(/images/turnitin_acceptable_score.png)
232+
&.warning-score
233+
background-image: url(/images/turnitin_warning_score.png)
234+
&.problem-score
235+
background-image: url(/images/turnitin_problem_score.png)
236+
&.failure-score
237+
background-image: url(/images/turnitin_failure_score.png)
219238

220239
.gradebook-cell-comment
221240
position: absolute
@@ -225,7 +244,7 @@ $cell_height: 33px
225244
height: 12px
226245
width: 12px
227246
visibility: hidden
228-
z-index: 1 //needs to be above "normal but below tooltips"
247+
z-index: 2 //needs to be above "normal but below tooltips"
229248
overflow: hidden
230249

231250
&:hover,

app/views/jst/_submission_detail.handlebars

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
<div>
99
{{#each attachments}}
1010
<div class="submisison-attachment">
11-
{{#if turnitin_data.reportUrl}}
12-
{{#with turnitin_data}}
11+
{{#if turnitin.reportUrl}}
12+
{{#with turnitin}}
1313
<span class="turnitin_score_container">{{> turnitinScore}}</span>
1414
{{/with}}
1515
{{/if}}
@@ -18,9 +18,14 @@
1818
{{/each}}
1919
</div>
2020
{{/if}}
21-
{{#if submission_type_is_online_text_entry}}
21+
{{#ifEqual submission_type "online_text_entry"}}
22+
{{#if turnitin.reportUrl}}
23+
{{#with turnitin}}
24+
<span class="turnitin_score_container">{{> turnitinScore}}</span>
25+
{{/with}}
26+
{{/if}}
2227
{{#t "online_text_entry_see_details_in_the_speedgrader."}}Online Text Entry, <a href="%{speedGraderUrl}">see details in the SpeedGrader</a>.{{/t}}
23-
{{/if}}
28+
{{/ifEqual}}
2429
{{else}}
2530
{{#t "no_submission"}}No submission{{/t}}
2631
{{/if}}

lib/api/v1/stream_item.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ def stream_item_json(stream_item, current_user, session)
7373
hash['notification_category'] = data.notification_category
7474
hash['html_url'] = hash['url'] = data.url
7575
when 'Submission'
76-
hash.merge! submission_json(Submission.find(data.id), Assignment.find(data.assignment.id), current_user, session, nil, ['submission_comments', 'assignment', 'course', 'html_url', 'user'])
76+
json = submission_json(Submission.find(data.id), Assignment.find(data.assignment.id), current_user, session, nil, ['submission_comments', 'assignment', 'course', 'html_url', 'user'])
77+
json.delete('id')
78+
hash.merge! json
7779

7880
# backwards compat from before using submission_json
7981
hash['assignment']['title'] = hash['assignment']['name']

lib/api/v1/submission.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def submission_json(submission, assignment, user, session, context = nil, includ
7575
hash
7676
end
7777

78-
SUBMISSION_JSON_FIELDS = %w(user_id url score grade attempt submission_type submitted_at body assignment_id grade_matches_current_submission workflow_state).freeze
78+
SUBMISSION_JSON_FIELDS = %w(id user_id url score grade attempt submission_type submitted_at body assignment_id grade_matches_current_submission workflow_state).freeze
7979
SUBMISSION_OTHER_FIELDS = %w(attachments discussion_entries)
8080

8181
def submission_attempt_json(attempt, assignment, user, session, version_idx = nil, context = nil)

0 commit comments

Comments
 (0)