instructure/canvas-lms · error · ImportError

No name given for term #

Error message

No name given for term #{term_id}

What it means

Validation error in TermImporter::Work#add_term raised when a date_override row names a term whose sis_source_id matched no existing enrollment term (term.new_record?). Date overrides can only be applied to terms created by a prior import; the referenced term does not exist.

Solutions

  1. Provide a name for every term row
  2. Correct the CSV and re-import
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at lib/sis/term_importer.rb:72 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of instructure/canvas-lms@1c9f0bb801 (2026-09-15). Data as JSON: /api/errors/3cefbe322ec161d5. Report an issue: GitHub.

Appendix: source

Thrown at lib/sis/term_importer.rb:72

        if date_override_enrollment_type
          # only configure the date override if this row is present
          raise ImportError, "Cannot set date override on non-existent term" if term.new_record?
          unless %w[StudentEnrollment TeacherEnrollment TaEnrollment DesignerEnrollment].include?(date_override_enrollment_type)
            raise ImportError, "Invalid date_override_enrollment_type"
          end

          date_override = term.enrollment_dates_overrides.where(enrollment_type: date_override_enrollment_type).order(:id).first
          unless date_override&.stuck_sis_fields&.intersect?(%i[start_at end_at])
            case status
            when /active/i
              date_override ||= term.enrollment_dates_overrides.build(context: @root_account, enrollment_type: date_override_enrollment_type)
              date_override.update!(start_at: start_date, end_at: end_date)
            when /deleted/i
              term.enrollment_dates_overrides.where(enrollment_type: date_override_enrollment_type).destroy_all
            end
          end
        else
          raise ImportError, "No name given for term #{term_id}" if name.blank?

          # only update the name on new records, and ones that haven't been
          # changed since the last sis import
          if term.new_record? || !term.stuck_sis_fields.include?(:name)
            term.name = name
          end

          term.integration_id = integration_id if integration_id.present?

          case status
          when /active/i
            term.workflow_state = "active"
          when /deleted/i
            term.workflow_state = "deleted"
          end
          unless term.stuck_sis_fields.intersect?([:start_at, :end_at])
            term.start_at = start_date
            term.end_at = end_date

View on GitHub (pinned to 1c9f0bb801)