instructure/canvas-lms · error · PeerReview::InvalidAssignmentSubmissionTypesError

Peer reviews cannot be used with External Tool assignments

Error message

Peer reviews cannot be used with External Tool assignments

What it means

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.

Solutions

  1. Use a non-external-tool assignment (online submission types) for peer reviews.
  2. Skip peer review creation when `assignment.external_tool?` returns true.
  3. If peer review is needed for LTI content, use the tool's own review mechanism instead.

Example fix

// before
PeerReview::SubAssignmentCreator.new(assignment: assignment).call # external tool
// after
unless assignment.external_tool?
  PeerReview::SubAssignmentCreator.new(assignment: assignment).call
end
Defensive patterns

Strategy: validation

Validate before calling

raise ArgumentError, "external tool assignments cannot use peer reviews" if assignment.external_tool?

Try / catch

begin
  service.call
rescue PeerReview::InvalidAssignmentSubmissionTypesError => e
  render json: { error: e.message }, status: :unprocessable_entity
end

Prevention

When it happens

Trigger: 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.

Common situations: Administrators turning on peer reviews for an LTI-based assignment; scripted course imports that set peer_reviews on all assignments including external tool ones.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of instructure/canvas-lms@1c9f0bb801 (2026-09-15). Data as JSON: /api/errors/5f035028cf5d795b. Report an issue: GitHub.

Appendix: source

Thrown at app/services/peer_review/validations.rb:45

  def validate_peer_reviews_enabled(assignment)
    unless assignment.peer_reviews?
      raise PeerReview::PeerReviewsNotEnabledError, I18n.t("Peer reviews are not enabled for this assignment")
    end
  end

  def validate_feature_enabled(assignment)
    unless assignment.context.feature_enabled?(:peer_review_allocation_and_grading)
      raise PeerReview::FeatureDisabledError, I18n.t("Peer Review Allocation and Grading feature flag is disabled")
    end
  end

  def validate_grading_type(grading_type)
    raise PeerReview::InvalidGradingTypeError, I18n.t("Peer review sub assignments cannot have a not_graded grading type") if grading_type == "not_graded"
  end

  def validate_assignment_submission_types(assignment)
    if assignment.external_tool?
      raise PeerReview::InvalidAssignmentSubmissionTypesError, I18n.t("Peer reviews cannot be used with External Tool assignments")
    end

    if assignment.submission_types == "discussion_topic"
      raise PeerReview::InvalidAssignmentSubmissionTypesError, I18n.t("Peer reviews cannot be used with Discussion Topic assignments")
    end
  end

  def validate_peer_review_sub_assignment_exists(assignment)
    if assignment.peer_review_sub_assignment.blank?
      raise PeerReview::SubAssignmentNotExistError, I18n.t("Peer review sub assignment does not exist")
    end
  end

  def validate_peer_review_sub_assignment_not_exist(assignment)
    if assignment.peer_review_sub_assignment.present?
      raise PeerReview::SubAssignmentExistsError, I18n.t("Peer review sub assignment exists")
    end
  end

View on GitHub (pinned to 1c9f0bb801)