{"record":{"id":"c5c0a04d7197c657","repo":"instructure/canvas-lms","slug":"no-long-name-given-for-course-course-id","errorCode":null,"errorMessage":"No long_name given for course #{course_id}","messagePattern":"No long_name given for course #(.+?)","errorType":"exception","errorClass":"ImportError","httpStatus":null,"severity":"error","filePath":"lib/sis/course_importer.rb","lineNumber":68,"sourceCode":"\n      def initialize(batch, root_account, logger, a1, a2, m, batch_user, blueprint_associations)\n        @batch = batch\n        @batch_user = batch_user\n        @root_account = root_account\n        @courses_to_update_sis_batch_id = a1\n        @course_ids_to_update_associations = a2\n        @roll_back_data = []\n        @blueprint_associations = blueprint_associations\n        @messages = m\n        @logger = logger\n        @success_count = 0\n      end\n\n      def add_course(course_id, term_id, account_id, fallback_account_id, status, start_date, end_date, abstract_course_id, short_name, long_name, integration_id, course_format, blueprint_course_id, grade_passback_setting, homeroom_course, friendly_name)\n        state_changes = []\n        raise ImportError, \"No course_id given for a course\" if course_id.blank?\n        raise ImportError, \"No short_name given for course #{course_id}\" if short_name.blank? && abstract_course_id.blank?\n        raise ImportError, \"No long_name given for course #{course_id}\" if long_name.blank? && abstract_course_id.blank?\n        raise ImportError, \"Improper status \\\"#{status}\\\" for course #{course_id}\" unless /\\A(active|deleted|completed|unpublished|published)/i.match?(status)\n        raise ImportError, \"Invalid course_format \\\"#{course_format}\\\" for course #{course_id}\" unless course_format.blank? || course_format =~ /\\A(online|on_campus|blended|not_set)/i\n\n        valid_grade_passback_settings = %w[nightly_sync disabled not_set]\n        raise ImportError, \"Invalid grade_passback_setting \\\"#{grade_passback_setting}\\\" for course #{course_id}\" unless grade_passback_setting.blank? || valid_grade_passback_settings.include?(grade_passback_setting.downcase.strip)\n        return if @batch.skip_deletes? && status =~ /deleted/i\n\n        Course.unique_constraint_retry do\n          course = @root_account.all_courses.find_by(sis_source_id: course_id)\n          if course.nil?\n            course = Course.new\n            state_changes << :created\n          else\n            state_changes << :updated\n          end\n          course.saved_by = :sis_import\n          course_enrollment_term_id_stuck = course.stuck_sis_fields.include?(:enrollment_term_id)\n          if !course_enrollment_term_id_stuck && term_id","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/lib/sis/course_importer.rb#L50-L86","documentation":"SisCourseImporter#add_course raises ImportError when long_name is blank AND abstract_course_id is also blank. The course display name (long_name) is required for any course that is not linked to an abstract course, since it is what users see in the UI.","triggerScenarios":"add_course called with long_name=nil/\"\" while abstract_course_id is also blank — a courses.csv row missing both the long_name column and abstract_course_id.","commonSituations":"Minimal CSV templates that only list ids and short codes; data exports that truncate names; bulk updates supplying only short_name; misunderstanding that short_name alone is enough to create a course.","solutions":["Populate the long_name column (full course display name) in the courses.csv row","Supply abstract_course_id instead so the course inherits identity from an existing abstract course","Add pre-import validation requiring long_name (or abstract_course_id) on every course row","Check the upstream export for fields being dropped or truncated to empty strings"],"exampleFix":"// before\n\"course-101\",term-1,account-1,,active,,,,,,\"CS101\",\"\"\n// after\n\"course-101\",term-1,account-1,,active,,,,,,\"CS101\",\"Intro to Computer Science\"","handlingStrategy":"validation","validationCode":"if row['long_name'].to_s.strip.empty? && row['abstract_course_id'].to_s.strip.empty?\n  raise ArgumentError, \"course #{row['course_id']} needs long_name or abstract_course_id\"\nend","typeGuard":"def has_display_name?(row) = !row['long_name'].to_s.strip.empty? || !row['abstract_course_id'].to_s.strip.empty?","tryCatchPattern":"begin\n  importer.add_course(...)\nrescue SisImport::ImportError => e\n  raise unless e.message.start_with?('No long_name given')\n  log.warn(\"course row missing long_name: #{e.message}\")\nend","preventionTips":["Make long_name a required column in your export pipeline","Check exports for truncated/empty display names after transformations","Validate the CSV against a schema before import","Prefer failing loudly upstream rather than mid-batch"],"tags":["sis-import","missing-required-field","course-import"],"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"}