{"record":{"id":"b9570dea0497ebe2","repo":"instructure/canvas-lms","slug":"peer-review-sub-assignments-cannot-have-a-not-graded-grading","errorCode":null,"errorMessage":"Peer review sub assignments cannot have a not_graded grading type","messagePattern":"Peer review sub assignments cannot have a not_graded grading type","errorType":"validation","errorClass":"PeerReview::InvalidGradingTypeError","httpStatus":null,"severity":"error","filePath":"app/services/peer_review/validations.rb","lineNumber":40,"sourceCode":"    unless assignment.present? && assignment.is_a?(Assignment) && assignment.persisted?\n      raise PeerReview::InvalidParentAssignmentError, I18n.t(\"Invalid parent assignment\")\n    end\n  end\n\n  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","sourceCodeStart":22,"sourceCodeEnd":58,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/app/services/peer_review/validations.rb#L22-L58","documentation":"PeerReview::Validations#validate_grading_type raises PeerReview::InvalidGradingTypeError when a grading type of \"not_graded\" is supplied for a peer review sub assignment. Sub assignments must carry a grade; the library explicitly rejects the not_graded enum value.","triggerScenarios":"Creating/updating a peer review sub assignment with grading_type: \"not_graded\" in the API payload or service params.","commonSituations":"Copying parent assignment attributes (including not_graded) onto the sub assignment; API clients defaulting grading_type to not_graded; UI workflows that let users pick not_graded for review sub assignments.","solutions":["Use a graded grading type such as \"points\", \"percent\", or \"pass_fail\" for the sub assignment.","Only propagate grading_type from the parent when the parent is actually graded; otherwise default to \"points\".","Validate grading_type in your client before submitting the request."],"exampleFix":"// before\nsub = PeerReview::SubAssignmentCreator.new(assignment: parent, grading_type: \"not_graded\")\n// after\nsub = PeerReview::SubAssignmentCreator.new(\n  assignment: parent,\n  grading_type: parent.grading_type == \"not_graded\" ? \"points\" : parent.grading_type\n)","handlingStrategy":"validation","validationCode":"rejected = %w[not_graded]\nraise ArgumentError, \"invalid grading type\" if rejected.include?(params[:grading_type])","typeGuard":null,"tryCatchPattern":"begin\n  service.call\nrescue PeerReview::InvalidGradingTypeError => e\n  render json: { error: e.message }, status: :unprocessable_entity\nend","preventionTips":["Whitelist allowed grading types (points, percent, pass_fail) in params","Never copy parent grading_type blindly","Add schema-level validation on API payloads"],"tags":["peer-review","rails","validation","grading"],"backgroundTag":"invalid-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"}