instructure/canvas-lms · error · ImportError
Cannot set date override on non-existent term
Error message
Cannot set date override on non-existent term
What it means
Guard in SIS::TermImporter::Work#add_term: a date_override_enrollment_type was supplied for a term that is new (doesn't exist yet), so ImportError is raised — date overrides can only be set on existing terms.
Solutions
- Create the term first (without override) in an earlier batch, then update it with the override
- Remove the override columns from rows that create new terms
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at lib/sis/term_importer.rb:56 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/9e173944dffae244.
Report an issue: GitHub.
Appendix: source
Thrown at lib/sis/term_importer.rb:56
def initialize(batch, root_account, logger)
@batch = batch
@root_account = root_account
@roll_back_data = []
@logger = logger
@success_count = 0
end
def add_term(term_id, name, status, start_date = nil, end_date = nil, integration_id = nil, date_override_enrollment_type = nil)
raise ImportError, "No term_id given for a term" if term_id.blank?
raise ImportError, "Improper status \"#{status}\" for term #{term_id}" unless /\Aactive|\Adeleted/i.match?(status)
return if @batch.skip_deletes? && status =~ /deleted/i
term = @root_account.enrollment_terms.where(sis_source_id: term_id).first_or_initialize
term.sis_batch_id = @batch.id
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 beenView on GitHub (pinned to 1c9f0bb801)