{"record":{"id":"08327dbcee138936","repo":"instructure/canvas-lms","slug":"no-grade-publishing-status-given-for-enrollment-enrollment","errorCode":null,"errorMessage":"No grade_publishing_status given for enrollment #{enrollment_id}","messagePattern":"No grade_publishing_status given for enrollment #(.+?)","errorType":"exception","errorClass":"ImportError","httpStatus":null,"severity":"error","filePath":"lib/sis/grade_publishing_results_importer.rb","lineNumber":41,"sourceCode":"    def process\n      importer = Work.new(@batch, @root_account, @logger)\n      yield importer\n      importer.success_count\n    end\n\n    class Work\n      attr_accessor :success_count\n\n      def initialize(batch, root_account, logger)\n        @batch = batch\n        @root_account = root_account\n        @logger = logger\n        @success_count = 0\n      end\n\n      def add_grade_publishing_result(enrollment_id, grade_publishing_status, message = nil)\n        raise ImportError, \"No enrollment_id given\" if enrollment_id.blank?\n        raise ImportError, \"No grade_publishing_status given for enrollment #{enrollment_id}\" if grade_publishing_status.blank?\n        raise ImportError, \"Improper grade_publishing_status \\\"#{grade_publishing_status}\\\" for enrollment #{enrollment_id}\" unless %w[published error].include?(grade_publishing_status.downcase)\n\n        if Enrollment.where(id: enrollment_id, root_account_id: @root_account)\n                     .update_all(grade_publishing_status: grade_publishing_status.downcase,\n                                 grade_publishing_message: message.to_s,\n                                 updated_at: Time.now.utc) != 1\n          raise ImportError, \"Enrollment #{enrollment_id} doesn't exist\"\n        end\n\n        @success_count += 1\n      end\n    end\n  end\nend\n","sourceCodeStart":23,"sourceCodeEnd":56,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/lib/sis/grade_publishing_results_importer.rb#L23-L56","documentation":"Guard in SIS::GradePublishingResultsImporter::Work#add_grade_publishing_result: a grade publishing results row omits grade_publishing_status for the given enrollment_id, so ImportError is raised for that import row.","triggerScenarios":"Calling `add_grade_publishing_result(enrollment_id, nil_or_empty, msg)`; grade publishing results CSV rows with an empty status column while enrollment_id is present.","commonSituations":"Export tooling omits the status for rows that never reached publishing; wrong header mapping so status parses as nil; script passes nil literal for the second argument.","solutions":["Ensure every CSV row has a grade_publishing_status value ('published' or 'error')","Fix the status column mapping/order of arguments in the call","Default or derive a status upstream when the source omits it, rather than passing blank"],"exampleFix":"// before\nimporter.add_grade_publishing_result(id, row['grade_publishing_status'])\n// after\nstatus = row['grade_publishing_status'].presence || 'error'\nimporter.add_grade_publishing_result(id, status)","handlingStrategy":"validation","validationCode":"raise 'missing status' if grade_publishing_status.blank?\nimporter.add_grade_publishing_result(enrollment_id, grade_publishing_status)","typeGuard":null,"tryCatchPattern":"begin\n  importer.add_grade_publishing_result(id, status)\nrescue SIS::Base::ImportError => e\n  logger.warn(\"Skipping grade publishing result: #{e.message}\")\nend","preventionTips":["Require a status value in every export row","Check header mapping for the status column","Default missing statuses to a sensible value upstream"],"tags":["ruby","sis-import","grade-publishing","missing-required-field"],"backgroundTag":"empty-required-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"}