{"record":{"id":"c10fb5541490ef16","repo":"instructure/canvas-lms","slug":"must-be-a-group-assignment-to-create-group-overrides","errorCode":null,"errorMessage":"Must be a group assignment to create group overrides","messagePattern":"Must be a group assignment to create group overrides","errorType":"validation","errorClass":"PeerReview::GroupAssignmentRequiredError","httpStatus":null,"severity":"error","filePath":"app/services/peer_review/validations.rb","lineNumber":234,"sourceCode":"      raise PeerReview::StudentIdsRequiredError, I18n.t(\"Student ids are required\")\n    end\n  end\n\n  def validate_student_ids_in_course(student_ids)\n    raise PeerReview::StudentIdsNotInCourseError, I18n.t(\"Student ids are not in course\") if student_ids.blank?\n  end\n\n  def validate_set_type_supported(set_type, services)\n    unless services.key?(set_type)\n      supported_types = services.keys.join(\", \")\n      raise PeerReview::SetTypeNotSupportedError,\n            I18n.t(\"Set type '%{set_type}' is not supported. Supported types are: %{supported_types}\", set_type:, supported_types:)\n    end\n  end\n\n  def validate_group_assignment_required(assignment)\n    unless assignment.group_category_id\n      raise PeerReview::GroupAssignmentRequiredError, I18n.t(\"Must be a group assignment to create group overrides\")\n    end\n  end\n\n  def validate_group_exists(group)\n    raise PeerReview::GroupNotFoundError, I18n.t(\"Group does not exist\") unless group.present?\n  end\n\n  def validate_adhoc_parent_override_exists(parent_override, student_ids)\n    unless parent_override.present?\n      raise PeerReview::ParentOverrideNotFoundError,\n            I18n.t(\"Parent assignment ADHOC override not found for students %{student_ids}\", student_ids: student_ids.join(\", \"))\n    end\n  end\n\n  def validate_course_parent_override_exists(parent_override, course_id)\n    unless parent_override.present?\n      raise PeerReview::ParentOverrideNotFoundError,\n            I18n.t(\"Parent assignment Course override not found for course %{course_id}\", course_id:)","sourceCodeStart":216,"sourceCodeEnd":252,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/app/services/peer_review/validations.rb#L216-L252","documentation":"PeerReview::GroupAssignmentRequiredError raised when creating peer-review group overrides on an assignment that has no group_category_id. The PeerReview validations layer requires the parent assignment to be a group assignment before any group-based override can be created, since group overrides reference groups that belong to a group category.","triggerScenarios":"Calling any PeerReview override service (e.g. create_group_override) with an assignment whose group_category_id is nil — i.e. an individual assignment or a group set that was deleted.","commonSituations":"Pointing the override flow at an individual (non-group) assignment; assignment configured after group categories were removed; passing the wrong assignment id to the service; group set deleted after assignment creation.","solutions":["Assign a group category to the assignment (assignment.update!(group_category_id: gc.id)) before creating group overrides","Verify you are passing the intended group assignment's id, not an individual assignment","Create a group set in the course UI or via GroupCategory.create!(context: course) and attach it to the assignment","Use the ADHOC (student-based) override path instead of the group override path for individual assignments"],"exampleFix":"// before\nPeerReview::CreateGroupOverride.call(assignment: individual_assignment, group_id: group.id)\n// after\nassignment.update!(group_category: course.group_categories.create!(name: 'Project Groups'))\nPeerReview::CreateGroupOverride.call(assignment: assignment, group_id: group.id)","handlingStrategy":"validation","validationCode":"raise ArgumentError, 'assignment must be a group assignment' unless assignment.group_category_id?","typeGuard":"null","tryCatchPattern":"begin\n  PeerReview::CreateGroupOverride.call(assignment:, group_id:)\nrescue PeerReview::GroupAssignmentRequiredError => e\n  Rails.logger.warn(\"group override rejected: #{e.message}\")\n  # surface a 422 asking the user to set up groups first\nend","preventionTips":["Check assignment.group_category_id before invoking any group override service","Only wire group-override UI to assignments with a group set","Add a model-level validation that peer-review assignments have a group category"],"tags":["ruby","rails","peer-review","assignments","validation"],"backgroundTag":"invalid-state-transition","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"}