[RESOLVED] Unable to import users using Kolibri CLI

I am trying to import multiple uses using the “kolibri manage importusers --facility facility ./users.csv” command but I am receiving this error every time


Traceback (most recent call last):
  File "/usr/bin/kolibri", line 11, in <module>
    load_entry_point('kolibri==0.13.1', 'console_scripts', 'kolibri')()
  File "/usr/lib/python3/dist-packages/kolibri/dist/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/kolibri/dist/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3/dist-packages/kolibri/dist/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3/dist-packages/kolibri/utils/cli.py", line 243, in invoke
    return super(KolibriDjangoCommand, self).invoke(ctx)
  File "/usr/lib/python3/dist-packages/kolibri/dist/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3/dist-packages/kolibri/dist/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/kolibri/dist/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/usr/lib/python3/dist-packages/kolibri/utils/cli.py", line 641, in manage
    execute_from_command_line(["kolibri manage"] + ctx.args)
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/core/management/__init__.py", line 364, in execute_from_command_line
    utility.execute()
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/core/management/__init__.py", line 356, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/core/management/base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "/usr/lib/python3/dist-packages/kolibri/core/auth/management/commands/importusers.py", line 188, in handle
    default_facility = Facility.objects.get(pk=options["facility"])
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/db/models/query.py", line 374, in get
    num = len(clone)
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/db/models/query.py", line 232, in __len__
    self._fetch_all()
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/db/models/query.py", line 1121, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/db/models/query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/db/models/sql/compiler.py", line 876, in execute_sql
    sql, params = self.as_sql()
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/db/models/sql/compiler.py", line 441, in as_sql
    where, w_params = self.compile(self.where) if self.where is not None else ("", [])
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/db/models/sql/compiler.py", line 373, in compile
    sql, params = node.as_sql(self, self.connection)
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/db/models/sql/where.py", line 79, in as_sql
    sql, params = compiler.compile(child)
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/db/models/sql/compiler.py", line 373, in compile
    sql, params = node.as_sql(self, self.connection)
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/db/models/lookups.py", line 170, in as_sql
    rhs_sql, rhs_params = self.process_rhs(compiler, connection)
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/db/models/lookups.py", line 103, in process_rhs
    return self.get_db_prep_lookup(value, connection)
  File "/usr/lib/python3/dist-packages/kolibri/dist/django/db/models/lookups.py", line 196, in get_db_prep_lookup
    [get_db_prep_value(value, connection, prepared=True)]
  File "/usr/lib/python3/dist-packages/kolibri/dist/morango/models/fields/uuids.py", line 38, in get_db_prep_value
    value = uuid.UUID(value)
  File "/usr/lib/python3.6/uuid.py", line 140, in __init__
    raise ValueError('badly formed hexadecimal UUID string')
ValueError: badly formed hexadecimal UUID string
------------------------------------------------------------------------------
users.csv 
full_name,username,password,facility,class
Marc,marcg,password,facility,
Peter,peterb,password,facility,
Neela,neelar,password,facility,
Karry,karryw,password,facility,
Michael,michaelg,password,facility,
Susan,susanl,password,facility,

I was able to get around this error by using the uuid of the facility instead of the facility name from the database in the csv file and --facility option

Hello @safi_khan!

We are glad that you managed to find the solution for your needs.

The command you used is obsolete (you most probably found it cited somewhere on our code repository), and we discourage its usage to import users in Kolibri. For future reference, please follow the steps from our user guide:

https://kolibri.readthedocs.io/en/latest/manage/data.html#csv-import

Hi @RadinaMatic,

SO then should I be using the bulkimportusers command line option? I want to use the command line because then I run a crontab to import users without user intervention.

@safi_khan

Yes, in case you want to try updating the users on a Kolibri facility with a cronjob (we recommend scheduling it during the server downtime), bulkimportusers command can be an option.

Make sure to properly format the CSV file with data to include all required values (and keep it well formatted when changed externally), to avoid running into issues during the automated user import. Read carefully all the requirements in the Import and Export Users from a CSV file section in our user guide.

Got it, thank you so much for the detailed instructions!