instructure/canvas-lms · error · PeerReview::GroupAssignmentRequiredError
Must be a group assignment to create group overrides
Error message
Must be a group assignment to create group overrides
What it means
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.
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
Example fix
// before PeerReview::CreateGroupOverride.call(assignment: individual_assignment, group_id: group.id) // after assignment.update!(group_category: course.group_categories.create!(name: 'Project Groups')) PeerReview::CreateGroupOverride.call(assignment: assignment, group_id: group.id)
Defensive patterns
Strategy: validation
Validate before calling
raise ArgumentError, 'assignment must be a group assignment' unless assignment.group_category_id?
Type guard
null
Try / catch
begin
PeerReview::CreateGroupOverride.call(assignment:, group_id:)
rescue PeerReview::GroupAssignmentRequiredError => e
Rails.logger.warn("group override rejected: #{e.message}")
# surface a 422 asking the user to set up groups first
end Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
- Due date cannot be before available from date
- Group does not exist
- Invalid parent assignment
- Parent assignment ADHOC override not found for students
- Parent assignment Course override not found for course
AI-assisted analysis of instructure/canvas-lms@1c9f0bb801 (2026-09-15).
Data as JSON: /api/errors/c10fb5541490ef16.
Report an issue: GitHub.
Appendix: source
Thrown at app/services/peer_review/validations.rb:234
raise PeerReview::StudentIdsRequiredError, I18n.t("Student ids are required")
end
end
def validate_student_ids_in_course(student_ids)
raise PeerReview::StudentIdsNotInCourseError, I18n.t("Student ids are not in course") if student_ids.blank?
end
def validate_set_type_supported(set_type, services)
unless services.key?(set_type)
supported_types = services.keys.join(", ")
raise PeerReview::SetTypeNotSupportedError,
I18n.t("Set type '%{set_type}' is not supported. Supported types are: %{supported_types}", set_type:, supported_types:)
end
end
def validate_group_assignment_required(assignment)
unless assignment.group_category_id
raise PeerReview::GroupAssignmentRequiredError, I18n.t("Must be a group assignment to create group overrides")
end
end
def validate_group_exists(group)
raise PeerReview::GroupNotFoundError, I18n.t("Group does not exist") unless group.present?
end
def validate_adhoc_parent_override_exists(parent_override, student_ids)
unless parent_override.present?
raise PeerReview::ParentOverrideNotFoundError,
I18n.t("Parent assignment ADHOC override not found for students %{student_ids}", student_ids: student_ids.join(", "))
end
end
def validate_course_parent_override_exists(parent_override, course_id)
unless parent_override.present?
raise PeerReview::ParentOverrideNotFoundError,
I18n.t("Parent assignment Course override not found for course %{course_id}", course_id:)View on GitHub (pinned to 1c9f0bb801)