{"record":{"id":"dbdd0b21553232ae","repo":"instructure/canvas-lms","slug":"no-user-id-given-for-admin","errorCode":null,"errorMessage":"No user_id given for admin","messagePattern":"No user_id given for admin","errorType":"exception","errorClass":"ImportError","httpStatus":null,"severity":"error","filePath":"lib/sis/admin_importer.rb","lineNumber":63,"sourceCode":"      attr_accessor :success_count,\n                    :roll_back_data,\n                    :account_users_to_update_associations,\n                    :account_users_to_set_batch_id\n\n      def initialize(batch, root_account, logger)\n        @batch = batch\n        @root_account = root_account\n        @account = root_account\n        @logger = logger\n        @success_count = 0\n        @roll_back_data = []\n        @account_users_to_update_associations = Set.new\n        @account_users_to_set_batch_id = Set.new\n        @account_roles_by_account_id = {}\n      end\n\n      def process_admin(user_id: nil, account_id: nil, role_id: nil, role: nil, status: nil, root_account: nil)\n        raise ImportError, \"No user_id given for admin\" if user_id.blank?\n        raise ImportError, \"No status given for admin\" if status.blank?\n        raise ImportError, \"No role_id or role given for admin\" if role.blank? && role_id.blank?\n\n        state = status.downcase.strip\n        raise ImportError, \"Invalid status #{status} for admin\" unless %w[active deleted].include? state\n        return if @batch.skip_deletes? && state == \"deleted\"\n\n        get_account(account_id)\n        raise ImportError, \"Invalid account_id given for admin\" unless @account\n\n        get_role(role_id, role)\n        raise ImportError, \"Invalid role '#{role}' for admin\" if role.present? && !@role\n        raise ImportError, \"Invalid role_id '#{role_id}' for admin\" if role_id.present? && !@role\n\n        the_root_account = root_account_from_id(root_account) if root_account\n        raise ImportError, \"Invalid or unknown user_id '#{user_id}' for admin\" if root_account && !the_root_account\n\n        the_root_account ||= @root_account","sourceCodeStart":45,"sourceCodeEnd":81,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/lib/sis/admin_importer.rb#L45-L81","documentation":"The SIS admin importer's process_admin requires a user_id identifying which user receives the admin role. A blank user_id raises ImportError immediately. Admins are always defined by pairing an existing user with an account and role, so the user reference is mandatory.","triggerScenarios":"process_admin(user_id: nil/''/whitespace, ...) or an admins.csv row with an empty user_id (sis_user_id / integrated data column empty).","commonSituations":"SIS export not populating the user_id column; user identified by email/login instead of sis id without prior user import; blank rows at end of CSV being processed.","solutions":["Populate user_id in admins.csv with the user's sis_user_id (matching a previously imported user).","Skip blank CSV rows before feeding the importer.","Import the users first so a valid user_id exists, then import admins."],"exampleFix":"// before\nprocess_admin(user_id: '', account_id: 'acct1', role: 'AdminEnrollment', status: 'active')\n// after\nprocess_admin(user_id: 'user123', account_id: 'acct1', role: 'AdminEnrollment', status: 'active')","handlingStrategy":"validation","validationCode":"raise ArgumentError, \"user_id required\" if user_id.to_s.strip.empty?\nraise \"unknown user\" unless root_account.users.exists?(sis_user_id: user_id) # or pseudographs lookup","typeGuard":null,"tryCatchPattern":"begin\n  importer.process_admin(user_id: uid, account_id: aid, role: role, status: status)\nrescue SIS::BaseImporter::ImportError => e\n  logger.warn(\"skipping admin row: #{e.message}\")\nend","preventionTips":["Import users.csv before admins.csv","Skip empty CSV rows","Require user_id column non-null in SIS export validation"],"tags":["sis","validation","csv-import"],"backgroundTag":"missing-required-argument","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"}