{"record":{"id":"5f035028cf5d795b","repo":"instructure/canvas-lms","slug":"peer-reviews-cannot-be-used-with-external-tool-assignments","errorCode":null,"errorMessage":"Peer reviews cannot be used with External Tool assignments","messagePattern":"Peer reviews cannot be used with External Tool assignments","errorType":"validation","errorClass":"PeerReview::InvalidAssignmentSubmissionTypesError","httpStatus":null,"severity":"error","filePath":"app/services/peer_review/validations.rb","lineNumber":45,"sourceCode":"  def validate_peer_reviews_enabled(assignment)\n    unless assignment.peer_reviews?\n      raise PeerReview::PeerReviewsNotEnabledError, I18n.t(\"Peer reviews are not enabled for this assignment\")\n    end\n  end\n\n  def validate_feature_enabled(assignment)\n    unless assignment.context.feature_enabled?(:peer_review_allocation_and_grading)\n      raise PeerReview::FeatureDisabledError, I18n.t(\"Peer Review Allocation and Grading feature flag is disabled\")\n    end\n  end\n\n  def validate_grading_type(grading_type)\n    raise PeerReview::InvalidGradingTypeError, I18n.t(\"Peer review sub assignments cannot have a not_graded grading type\") if grading_type == \"not_graded\"\n  end\n\n  def validate_assignment_submission_types(assignment)\n    if assignment.external_tool?\n      raise PeerReview::InvalidAssignmentSubmissionTypesError, I18n.t(\"Peer reviews cannot be used with External Tool assignments\")\n    end\n\n    if assignment.submission_types == \"discussion_topic\"\n      raise PeerReview::InvalidAssignmentSubmissionTypesError, I18n.t(\"Peer reviews cannot be used with Discussion Topic assignments\")\n    end\n  end\n\n  def validate_peer_review_sub_assignment_exists(assignment)\n    if assignment.peer_review_sub_assignment.blank?\n      raise PeerReview::SubAssignmentNotExistError, I18n.t(\"Peer review sub assignment does not exist\")\n    end\n  end\n\n  def validate_peer_review_sub_assignment_not_exist(assignment)\n    if assignment.peer_review_sub_assignment.present?\n      raise PeerReview::SubAssignmentExistsError, I18n.t(\"Peer review sub assignment exists\")\n    end\n  end","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/app/services/peer_review/validations.rb#L27-L63","documentation":"PeerReview::Validations#validate_assignment_submission_types raises PeerReview::InvalidAssignmentSubmissionTypesError when the assignment is an external tool assignment (`external_tool?` true). External tool (LTI) submissions cannot participate in peer reviews, so the library rejects such assignments as peer review parents.","triggerScenarios":"Enabling peer review sub assignments on an assignment with submission_types including 'external_tool'; creating peer reviews for an LTI tool assignment via the API.","commonSituations":"Administrators turning on peer reviews for an LTI-based assignment; scripted course imports that set peer_reviews on all assignments including external tool ones.","solutions":["Use a non-external-tool assignment (online submission types) for peer reviews.","Skip peer review creation when `assignment.external_tool?` returns true.","If peer review is needed for LTI content, use the tool's own review mechanism instead."],"exampleFix":"// before\nPeerReview::SubAssignmentCreator.new(assignment: assignment).call # external tool\n// after\nunless assignment.external_tool?\n  PeerReview::SubAssignmentCreator.new(assignment: assignment).call\nend","handlingStrategy":"validation","validationCode":"raise ArgumentError, \"external tool assignments cannot use peer reviews\" if assignment.external_tool?","typeGuard":null,"tryCatchPattern":"begin\n  service.call\nrescue PeerReview::InvalidAssignmentSubmissionTypesError => e\n  render json: { error: e.message }, status: :unprocessable_entity\nend","preventionTips":["Filter out external_tool assignments when bulk-enabling peer reviews","Hide the peer review option in UI for LTI assignments","Assert assignment type in service specs"],"tags":["peer-review","lti","rails","validation"],"backgroundTag":"unsupported-operation","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"}