How does discourse get full names of imported users?

We have a database of users to be migrated into Discourse. All these users have only emails and random usernames.

After a migration, I noticed that most of the users got user.name fields, which are real full names.

First of all, I thought that Discours tries to generate a name from an email. But then I found some users with Chinese characters, and they emails and usernames are not even similar to the generated full name.

Again, we don’t have a full name, Discourse generates it itself and I don’t understand how. We only have an email and a username, which is random.

The question is, how does discourse generate a user.name? Thanks.

I’m assuming you are using one of the official import scripts or at least based your import script on the base importer.

At first it tries to guess the name from the email address:

https://github.com/discourse/discourse/blob/84ab825e41126c1954b714b245f45e3072878dea/script/import_scripts/base.rb#L299-L299

And, if the original username was changed during the import (e.g. because it contained Chinese characters, which aren’t allowed in usernames) then it will set the name to the original username.

https://github.com/discourse/discourse/blob/84ab825e41126c1954b714b245f45e3072878dea/script/import_scripts/base.rb#L315-L315

4 Likes

Yes, I use the official import script, forgot to mention that scripts/import_scripts/base.rb.

And import looks like:

  create_users(query) do |row|
    { 
      id: row['id'], 
      username: row['username'], 
      email: row['email'], 
      created_at: Time.zone.at(row['created_at'])
    }
  end

Ok, I get it. If I import a user:

{
  username: 'hel&^$lo',
  email: 'foo@bar.com'
}

It puts hel&^$lo into a user.name and generates new user.username without forbiden letters.

2 Likes