{"record":{"id":"75de06d342a88ee5","repo":"instructure/canvas-lms","slug":"improper-grade-publishing-status-grade-publishing-status-for","errorCode":null,"errorMessage":"Improper grade_publishing_status \"#{grade_publishing_status}\" for enrollment #{enrollment_id}","messagePattern":"Improper grade_publishing_status \"#(.+?)\" for enrollment #(.+?)","errorType":"exception","errorClass":"ImportError","httpStatus":null,"severity":"error","filePath":"lib/sis/grade_publishing_results_importer.rb","lineNumber":42,"sourceCode":"      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":24,"sourceCodeEnd":56,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/lib/sis/grade_publishing_results_importer.rb#L24-L56","documentation":"add_grade_publishing_result raises ImportError when grade_publishing_status is not one of the allowed values 'published' or 'error' (compared case-insensitively after downcase). Any other string is rejected with the offending value interpolated.","triggerScenarios":"Calling `add_grade_publishing_result(id, 'pending', msg)` or 'failed', 'publishing', etc.; CSV status column containing values from a foreign vocabulary.","commonSituations":"Producer system emits statuses like 'in_progress', 'success', 'unpublished'; typos ('pubished'); whitespace-padded values with trailing spaces if not trimmed (whitespace still fails the %w[] include).","solutions":["Normalize source statuses to exactly 'published' or 'error' before import","Map foreign status vocabularies (e.g. success→published, failure→error) in preprocessing","Verify no stray whitespace: use `status.strip.downcase` when producing the value"],"exampleFix":"// before\nimporter.add_grade_publishing_result(id, 'success')\n// after\nmapped = { 'success' => 'published', 'failure' => 'error' }.fetch(row['status'].downcase, 'error')\nimporter.add_grade_publishing_result(id, mapped)","handlingStrategy":"validation","validationCode":"raise 'bad status' unless %w[published error].include?(grade_publishing_status.to_s.strip.downcase)","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":["Normalize to published/error at the data source","Trim whitespace before import","Add a mapping table for producer status vocabularies"],"tags":["ruby","sis-import","grade-publishing","invalid-enum"],"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"}