{"record":{"id":"65fa05b5a0109f15","repo":"instructure/canvas-lms","slug":"unsupported-submission-type-for-turnitin-integration","errorCode":null,"errorMessage":"Unsupported submission type for turnitin integration: #{submission.submission_type}","messagePattern":"Unsupported submission type for turnitin integration: #(.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"lib/turnitin.rb","lineNumber":200,"sourceCode":"      course = assignment.context\n      opts = {\n        post: true,\n        utp: \"1\",\n        user: student,\n        course:,\n        assignment:,\n        tem: email(course)\n      }\n      responses = {}\n      if submission.submission_type == \"online_upload\"\n        attachments = submission.attachments.select { |a| a.turnitinable? && (asset_string.nil? || a.asset_string == asset_string) }\n        attachments.each do |a|\n          responses[a.asset_string] = sendRequest(:submit_paper, \"2\", { ptl: a.display_name, pdata: a.open, ptype: \"2\" }.merge!(opts))\n        end\n      elsif submission.submission_type == \"online_text_entry\" && (asset_string.nil? || submission.asset_string == asset_string)\n        responses[submission.asset_string] = sendRequest(:submit_paper, \"2\", { ptl: assignment.title, pdata: submission.plaintext_body, ptype: \"1\" }.merge!(opts))\n      else\n        raise \"Unsupported submission type for turnitin integration: #{submission.submission_type}\"\n      end\n\n      responses.transform_values! do |res|\n        res.success? ? { object_id: res.returned_object_id } : res.error_hash\n      end\n\n      responses\n    end\n\n    def generateReport(submission, asset_string)\n      assignment = submission.assignment\n      course = assignment.context\n      object_id = submission.turnitin_data.dig(asset_string, :object_id)\n      res = nil\n      res = sendRequest(:generate_report, 2, oid: object_id, utp: \"2\", user: course, course:, assignment:) if object_id\n      data = {}\n      if res\n        data[:similarity_score] = res.css(\"originalityscore\").first.try(:content)","sourceCodeStart":182,"sourceCodeEnd":218,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/lib/turnitin.rb#L182-L218","documentation":"Turnitinlib#submitPaper supports submitting only file attachments and online_text_entry submissions. Any other submission_type (e.g. online_url_entry, online_quiz, media) reaches the else branch and raises, because Turnitin's paper API has no mapped payload for it.","triggerScenarios":"Calling submit_at / submitPaper on a submission whose submission_type is neither an attachment-based type nor 'online_text_entry' (or the asset_string filter excludes every attachment and the text-entry branch doesn't match), so the else raise fires.","commonSituations":"Plagiarism platform jobs processing assignments that accept external-tool, quiz, or media recordings; enabling Turnitin on an assignment with unsupported online submission types; legacy data migrations touching old submission types.","solutions":["Only enable Turnitin for assignments whose allowed submission types are file upload / text entry","Skip unsupported submissions in the calling job instead of submitting them","Convert or flatten the submission content into a supported type before submission","Add an explicit handler branch for the new submission type if Turnitin supports it"],"exampleFix":"// before\nsubmission.submit_at plagiarism\n// after\nif %w[online_upload online_text_entry].include?(submission.submission_type)\n  submission.submit_at(plagiarism)\nelse\n  Rails.logger.warn(\"skipping turnitin for #{submission.submission_type}\")\nend","handlingStrategy":"validation","validationCode":"SUPPORTED = %w[online_upload online_text_entry].freeze\nraise 'unsupported for turnitin' unless SUPPORTED.include?(submission.submission_type)","typeGuard":"def turnitin_submittable?(submission) = %w[online_upload online_text_entry].include?(submission.submission_type)","tryCatchPattern":"begin\n  submission.submit_at(plagiarism_tool)\nrescue RuntimeError => e\n  raise unless e.message.start_with?('Unsupported submission type for turnitin')\n  Rails.logger.warn(\"skipped: #{e.message}\")\nend","preventionTips":["Enable plagiarism review only for file/text-entry assignments","Filter submission types in plagiarism job queues","Cover new submission types with specs against submitPaper"],"tags":["turnitin","plagiarism","unsupported-type"],"backgroundTag":"unsupported-enum-value","analyzedSha":"1c9f0bb8013ed69c4f2efe11fd483025469b7e6c","analyzedAt":"2026-09-15T20:33:18.891Z","contentChangedAt":"2026-09-15T20:33:18.891Z","schemaVersion":2},"datasetVersion":"2026-09-23T02:17:17.105Z"}