instructure/canvas-lms · error · ImportError

No category_id given for an institutional tag category

Error message

No category_id given for an institutional tag category

What it means

Validation guard in InstitutionalTagCategoryImporter::Work#add_institutional_tag_category raised when the sis_id argument (category_id) is blank. The category cannot be created or matched to an existing institutional tag category without a SIS identifier, so the row is rejected at parse time.

Solutions

  1. Provide a category_id (sis id) for every institutional tag category row
  2. Re-run the SIS batch after correcting the file
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at lib/sis/institutional_tag_category_importer.rb:42 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/691d240658e1a9f8. Report an issue: GitHub.

Appendix: source

Thrown at lib/sis/institutional_tag_category_importer.rb:42

      importer = Work.new(@batch, @root_account, @logger)
      yield importer
      SisBatchRollBackData.bulk_insert_roll_back_data(importer.roll_back_data)
      importer.success_count
    end

    class Work
      attr_accessor :success_count, :roll_back_data

      def initialize(batch, root_account, logger)
        @batch = batch
        @root_account = root_account
        @logger = logger
        @success_count = 0
        @roll_back_data = []
      end

      def add_institutional_tag_category(sis_id, name, description, status)
        raise ImportError, "No category_id given for an institutional tag category" if sis_id.blank?
        raise ImportError, "No name given for institutional tag category #{sis_id}" if name.blank?
        raise ImportError, "No status given for institutional tag category #{sis_id}" if status.blank?
        raise ImportError, "Improper status \"#{status}\" for institutional tag category #{sis_id}" unless /\A(active|deleted)/i.match?(status)
        return if @batch.skip_deletes? && /deleted/i.match?(status)

        category = InstitutionalTagCategory.find_by(root_account_id: @root_account.id, sis_source_id: sis_id)
        category ||= InstitutionalTagCategory.new(account: @root_account,
                                                  root_account: @root_account,
                                                  sis_source_id: sis_id)

        category.name = name
        category.description = description
        category.sis_batch_id = @batch.id
        category.workflow_state = /deleted/i.match?(status) ? "deleted" : "active"

        if category.save
          data = SisBatchRollBackData.build_data(sis_batch: @batch, context: category)
          @roll_back_data << data if data

View on GitHub (pinned to 1c9f0bb801)