Rake task for merging users

If you’re using Wordpress as the authority for SSO what benefit is there to storing a second email in Discourse?

right-o. unless I store it in wordpress too for the same reasons. but I don’t know how to prevent this rake task from storing a secondary email when merging users.

If secondary emails are an issue can’t they just be removed?

1 лайк

Yes, that is one easy solution. Is there a rake task someone can share to list all the users with secondary emails, and to delete their secondary emails?

That said, I’d prefer to see discourse evolve to take advantage of a cool new feature like secondary emails rather than have to find ways to work around it. Other people are likely to bump up against this issue too at some point and wonder why the email address is not updating in discourse when updated in wordpress.

I don’t think there’s a rake task, but you could do it from the rails console. There should be some example queries about secondary emails for data explorer and some sample .update_all code for other rails examples. It’ll take more time than I can spare here today. If you’re stuck and want to pay, my contact info is in my profile.

See Additional email address per user account support - #34 by zogstrip

Here’s what you’re looking for: Additional email address per user account support - #34 by zogstrip

3 лайка

I’ve written a plugin which makes it easier to run this task:

8 лайков

Итак, если вы используете SSO на своем сайте, невозможно ли выполнить задачу rake merge? Специалисты из Communiteq (ранее DiscourseHosting) сообщают, что получают следующее сообщение об ошибке:

ActiveRecord::RecordNotSaved: Failed to save the new associated primary_email
/var/www/discourse/app/services/user_merger.rb:359:in `delete_source_user'

Это также вызывает проблемы при использовании плагина от @Dannii, поскольку, похоже, его процесс пытается выполнить этот шаг первым.

Есть ли какие-либо предложенные обходные пути для слияния пользователей на сайтах с SSO? У нас возникает следующая ситуация: человек переходит из одной организации в другую и получает новую учетную запись через процесс SSO (у него новый адрес электронной почты), но поскольку это один и тот же человек, мы хотели бы иметь возможность объединять учетные записи, как только он закрепится на новом месте.

Отключить SSO, выполнить слияние, а затем снова включить SSO?

Спасибо, я попробовал (отключить/объединить/включить), но безрезультатно. Возможно, после отключения требуется перезагрузка? Что, как я предполагаю, означает, что я больше не смогу войти в систему, так как я также использую SSO.

Я не понимаю этого. Я использую SSO через плагин WordPress wp_discourse и не сталкиваюсь с проблемами при выполнении этой задачи rake. После этого я удаляю пользователя WordPress, который был объединён.

3 лайка

У меня есть конкретный случай, в котором мне нужна помощь, похожий на упомянутый выше.

Я хочу объединить две учётные записи, но:

  • Учётная запись #1 содержит старое имя пользователя, которое пользователь хочет сохранить.
  • Учётная запись #2 содержит новый адрес электронной почты пользователя. (У пользователя нет доступа к электронной почте в учётной записи #1, так как это корпоративный аккаунт.)

Могу ли я использовать интерфейс «Объединить» для слияния двух учётных записей так, чтобы в результате получилась учётная запись со старым именем пользователя, но с новым адресом электронной почты?

Я не думаю, что это возможно сделать через Админку, но это можно выполнить с дополнительным шагом:

Объединить через Админку
Изменить email для этого пользователя через rails console:

cd /var/discourse
./launcher enter app
rails c
UserEmail.find_by(email: "old@example.com").update(email: "new@example.com")
7 лайков

При слиянии новый адрес электронной почты был добавлен как дополнительный. Я не был до конца уверен, как это может взаимодействовать с моим кастомным решением SSO. Поэтому сначала я удалил дополнительный адрес электронной почты (следуя этим шагам), а затем последовал вашему предложению.

Спасибо, @omarfilip!

7 лайков

Я сталкивался с такой ситуацией довольно часто. При слиянии пользователей основной адрес электронной почты исходного пользователя становится дополнительным адресом целевого пользователя. Если используется SSO и включена настройка sso overrides email, объединённый пользователь может не иметь возможности войти в систему, если дополнительный адрес не будет удалён через консоль Rails.

Интересует, не стоит ли добавить в задачу опцию, чтобы не устанавливать дополнительный адрес целевого пользователя на основе основного адреса исходного пользователя.

10 лайков

Или же предусмотреть удобный способ их замены местами.

9 лайков

У меня возникает эта ошибка, есть какие-то идеи?

cd /var/discourse
./launcher enter app

Процесс завис здесь!

1 лайк

Сложно сказать из-за размытия, но не могли бы вы дважды проверить, что перед первым именем пользователя стоит открывающая кавычка '? Похоже, консоль ожидает дальнейшего ввода (что может указывать на незакрытую строку).

10 лайков
> /var/www/discourse# rake users:merge['anon94132497','PavelCherenkovv'] --trace
** Invoke users:merge (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute users:merge
rake aborted!
ArgumentError: ArgumentError
/var/www/discourse/app/services/post_owner_changer.rb:12:in `initialize'
/var/www/discourse/app/services/user_merger.rb:63:in `new'
/var/www/discourse/app/services/user_merger.rb:63:in `change_post_owner'
/var/www/discourse/app/services/user_merger.rb:51:in `block in move_posts'
/var/www/discourse/app/services/user_merger.rb:49:in `each'
/var/www/discourse/app/services/user_merger.rb:49:in `move_posts'
/var/www/discourse/app/services/user_merger.rb:13:in `merge!'
/var/www/discourse/lib/tasks/users.rake:50:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:279:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:279:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:279:in `execute'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/usr/local/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:188:in `invoke'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:160:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `block (2 levels) in top_level'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:125:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:110:in `top_level'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:186:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:80:in `run'
bin/rake:13:in `<top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `kernel_load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:28:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:476:in `exec'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor.rb:399:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:30:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/base.rb:476:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:24:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:46:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/friendly_errors.rb:123:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:34:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => users:merge

У меня возникла эта ошибка?

1 лайк

Привет.
После слияния обнаружена небольшая ошибка. Значок «Добро пожаловать» отображается дважды в профиле пользователя, как будто он получил его впервые дважды :slight_smile:

4 лайка