Объединение пользователей не удалось: повреждённые записи в базе данных из-за стороннего плагина

OK, получаю это… У меня проблемы с подключением. Проверю через safe_mode, чтобы увидеть, поможет ли это.
Режим safe_mode не помогает…

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/discourse/discourse-bbb.git
          - git clone https://github.com/discourse/discourse-calendar.git
          - git clone https://github.com/discourse/discourse-canned-replies.git
          - git clone https://github.com/discourse/discourse-checklist.git
          - git clone https://github.com/discourse/discourse-code-review.git
          - git clone https://github.com/discourse/discourse-footnote.git
          - git clone https://github.com/discourse/discourse-github.git
          - git clone https://github.com/discourse/discourse-graphviz.git
          - git clone https://github.com/discourse/discourse-math.git
          - git clone https://github.com/discourse/discourse-policy.git
          - git clone https://github.com/discourse/discourse-prometheus.git
          - git clone https://github.com/discourse/discourse-prometheus-alert-receiver.git
          - git clone https://github.com/discourse/discourse-push-notifications.git
          - git clone https://github.com/discourse/discourse-saved-searches.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-voting.git
          - git clone https://github.com/discourse/discourse-yearly-review.git
          - git clone https://github.com/angusmcleod/discourse-events.git
          - git clone https://github.com/angusmcleod/discourse-locations.git
          - git clone https://github.com/davidtaylorhq/discourse-whos-online.git

Я уже вижу, что можно обновить URL для последних плагинов. (но пересборку можно выполнить только сегодня ночью по UTC, около полуночи)
Возможно, стоит написать @angus или @merefield по поводу плагинов events и locations.

Скорее всего, это плагин discourse-assign, так как, судя по всему, он единственный в вашем списке, который модифицирует класс TopicQuery. И я подозреваю, что ошибка возникает именно там.

Не могли бы вы проверить моё предположение, отключив плагин и убедившись, что категория работает? После этого вы сможете снова его включить. Также было бы интересно узнать, ссылается ли какое-либо из пользовательских полей темы на объединённого пользователя тем или иным образом. Не могли бы вы проверить и это?

./launcher enter app
rails c

id_of_problematic_topic = 123
Topic.find(id_of_problematic_topic).custom_fields

После отключения discourse-assign:

  • «latest» работает
  • «top» не работает
  • /t/951 всё ещё не работает

Запускаю запрос… Ага! Вы попали в точку!

{"event_start"=>1601748000, "event_end"=>1601749800, "event_all_day"=>false, "event_timezone"=>"Etc/UTC", "event_rsvp"=>true, "event_going_max"=>100, "event_version"=>1, "event_going"=>[36, 50]}

Похоже, что плагин событий пропускается при слиянии. Но это может быть и нормально, так как мы используем его старую версию. Дайте знать, если я смогу помочь протестировать этот случай.

Спасибо за решение проблемы, @gerhard!

Вы можете обновить пользовательское поле этой темы и удалить несуществующий ID. @angus, возможно, захочет добавить поддержку слияния пользователей в свой плагин.

Для справки:

tcf = TopicCustomField.where(topic_id: problematic_topic_id)
c = tcf.last # в моём случае, YMMV
c.value = "[295,50]"
c.save

Для сохранения истории, если у темы несколько пользовательских полей, следует использовать:

tcf = TopicCustomField.where(plugin_name: 'discourse-events', topic_id: problematic_topic_id)
c = tcf.first
c.value = "[295,50]"
c.save

@hellekin, я бы рекомендовал перейти на Creating and managing events.

На самом деле, возможно, вы могли бы вместе с @fzngagan разработать скрипт миграции с Events на Discourse Events? Было бы полезно иметь реальный кейс для работы. Файз, нам стоит приоритизировать это; я хотел бы официально объявить Events устаревшим.

@angus, @fzngagan: как вы думаете, могу ли я изменить строку плагина в конфигурации контейнера, пересобрать его, а затем запустить скрипт? Поскольку мне также нужно изменить репозитории Git для «Кто есть кто» и «Чародеи», я мог бы сделать это всё сразу. С другой стороны, мы посреди хакатона, и если проблема решена, я могу подождать неделю.

@hellekin
Недавно я исправил похожую проблему, когда удаление пользователя вызывало сбои.

Мне очень нравится идея миграции на Creating and managing events. Возникает вопрос: хотите ли вы сохранять истёкшие события и сколько у вас предстоящих событий?

@fzngagan @hellekin Вы можете продолжить обсуждение здесь, чтобы уточнить детали: Pavilion

Я готов принять участие в разработке скрипта миграции.

Я активно использую события. Мой плагин для школ, где обучаются дети с поведенческими трудностями, создаёт 7 тем в день для более чем 10 детей в нескольких филиалах и работает уже более двух лет. Каждая тема соответствует определённому периоду школьного дня, и мне необходимо иметь возможность выполнять запросы по дате события темы, поэтому я надеюсь, что данные событий в Discourse хранятся в удобном месте.

Я присоединюсь к обсуждению, о котором вы упомянули ниже.

Рады видеть это прекрасное сотрудничество. Я обожаю Discourse за это! Спасибо всем за ваши усилия и участие :heart:

Да, мы хотели бы сохранить прошлые события, так как они связаны с темами, особенно с теми, что относятся к текущей (все еще продолжающейся) конференции ActivityPub 2020 — на этой неделе проходит хакатон.
Помимо них у нас не так много событий, но мы ознакомимся с информацией о миграции — вероятно, на следующей неделе, так как эта уже более чем насыщена. Ура! И то, что сказал @aschrijver: сообщество Discourse великолепно!