{"record":{"id":"349c4a27aeb8cd83","repo":"instructure/canvas-lms","slug":"grade-publishing-requires-a-grading-standard","errorCode":null,"errorMessage":"grade publishing requires a grading standard","messagePattern":"grade publishing requires a grading standard","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/models/course.rb","lineNumber":2643,"sourceCode":"\n    recompute_student_scores_without_send_later(user_ids_to_publish)\n    enrollments = student_enrollments.not_fake.eager_load(:user).preload(:course_section).order_by_sortable_name\n    enrollments = enrollments.where(user_id: user_ids_to_publish) if user_ids_to_publish\n\n    errors = []\n    posts_to_make = []\n    posted_enrollment_ids = []\n    all_enrollment_ids = enrollments.map(&:id)\n\n    begin\n      raise \"final grade publishing disabled\" unless Canvas::Plugin.find!(\"grade_export\").enabled?\n\n      settings = Canvas::Plugin.find!(\"grade_export\").settings\n      raise \"endpoint undefined\" if settings[:publish_endpoint].blank?\n\n      format_settings = Course.valid_grade_export_types[settings[:format_type]]\n      raise \"unknown format type: #{settings[:format_type]}\" unless format_settings\n      raise \"grade publishing requires a grading standard\" if !grading_standard_enabled? && format_settings[:requires_grading_standard]\n\n      publishing_pseudonym = SisPseudonym.for(publishing_user, self)\n      raise \"publishing disallowed for this publishing user\" if publishing_pseudonym.nil? && format_settings[:requires_publishing_pseudonym]\n\n      callback = Course.valid_grade_export_types[settings[:format_type]][:callback]\n      posts_to_make = callback.call(self, enrollments, publishing_user, publishing_pseudonym)\n    rescue => e\n      Enrollment.where(id: all_enrollment_ids).update_all(grade_publishing_status: \"error\", grade_publishing_message: e.to_s)\n      raise e\n    end\n\n    default_timeout = Setting.get(\"send_final_grades_to_endpoint_timelimit\", 15.seconds.to_s).to_f\n\n    timeout_options = { raise_on_timeout: true, fallback_timeout_length: default_timeout }\n\n    posts_to_make.each do |enrollment_ids, res, mime_type, headers = {}|\n      posted_enrollment_ids += enrollment_ids\n      if res","sourceCodeStart":2625,"sourceCodeEnd":2661,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/app/models/course.rb#L2625-L2661","documentation":"Some grade export formats declare requires_grading_standard: true; if the course does not have a grading standard enabled, publishing raises this error because final grades cannot be mapped to letter grades without one.","triggerScenarios":"Calling publish_final_grades on a course whose grading_standard_enabled? is false while the configured grade_export format requires a grading standard.","commonSituations":"Courses created without a grading scheme being pushed to SIS via a letter-grade export format; admins changing course grading settings after publishing was configured.","solutions":["Assign a grading standard to the course (course.grading_standard = ...; grading_standard_enabled = true) before publishing","Switch the grade_export format_type to one that does not require a grading standard","Check grading_standard_enabled? up front and surface a user-friendly validation message"],"exampleFix":"// before\ncourse.publish_final_grades(teacher)\n// after\ncourse.grading_standard = GradingStandard.default_instance\ncourse.save!\ncourse.publish_final_grades(teacher)","handlingStrategy":"validation","validationCode":"fmt = Canvas::Plugin.find!('grade_export').settings[:format_type]\nrequires_std = Course.valid_grade_export_types[fmt]&.dig(:requires_grading_standard)\nraise 'assign a grading standard first' if requires_std && !course.grading_standard_enabled?","typeGuard":"null","tryCatchPattern":"begin\n  course.publish_final_grades(user)\nrescue RuntimeError => e\n  raise unless e.message == 'grade publishing requires a grading standard'\n  # prompt user to add a grading scheme to the course\nend","preventionTips":["Ensure courses use a grading standard when SIS letter-grade export is on","Validate grading_standard_enabled? before enabling publishing UI","Choose export formats consistent with course grading configuration"],"tags":["ruby","rails","grades","grading-standard"],"backgroundTag":"missing-required-config-field","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"}