Импорт скриптов vbulletin5.rb

Я использую официальный скрипт импорта для vBulletin v5 и столкнулся с проблемой.

Структура моего форума vBulletin выглядит следующим образом:

/forum/
/forum/sub-category1/
/forum/sub-category1/thread1/
/forum/sub-category1/thread2/
/forum/sub-category2/
/forum/sub-category2/thread1/
/forum/sub-category2/thread2/

При запуске скрипта импорта в Discourse создаются две категории без каких-либо тем:

/c/sub-category1
/c/sub-category2

Я проверил другой форум на vBulletin и заметил, что у них URL-адреса не вложены. Теперь я предполагаю, что это изменение, которое мне нужно внести в свой форум перед использованием скрипта:

/forum/
/forum/sub-category1/
/forum/sub-category2/
/forum/thread1a/
/forum//thread2a/
/forum/thread1b/
/forum//thread2b/

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

У кого-нибудь есть опыт использования этого скрипта?

Может быть, в скрипте есть что-то, что бросается в глаза и что можно изменить, чтобы он мог обрабатывать более вложенную структуру? Возможно, я вообще иду не по тому пути.

Под «тредом» вы имеете в виду тему в Discourse? Темы создаются, но не в правильных категориях?

Привет, Джей,

спасибо за твой ответ.

Ах да — я имею в виду темы Discourse. Там ничего нет, кроме этих пустых категорий. И все пользователи успешно импортированы.

Майк

Что-то мешает импортированию тем и сообщений. Я бы подумал, что вы увидите ошибки при выполнении. Темы и сообщения создаются после пользователей. Я считаю, что темы и сообщения обрабатываются в отдельных функциях. Импортёр должен показывать прогресс по ним так же, как и по пользователям.

При импорте ошибок не возникает — только несколько предупреждений о некорректных адресах электронной почты пользователей при выполнении функции create_users. Однако в итоге импорт пользователей проходит успешно. Вот лог (я удалил предупреждения, так как они содержали адреса электронной почты клиентов):

importing posts...
5 / 5 (100.0%)  [290527 items/min]                                                            
importing attachments...   
20182 / 5 (403640.0%)

Мне кажется, что система воспринимает мои пять категорий как посты и импортирует их. А что делать со всеми вложениями к реальным темам, которые не были импортированы, она не знает?

Отказ от ответственности:

Изначально импорт не удавался, потому что предоставленная мне база данных vBulletin не содержала таблицы customprofilepic — я добавил пустую таблицу.

Также не было пользовательских аватаров, поэтому AVATAR_DIR, на который ссылается скрипт импорта, — это просто созданная мной пустая папка. Я закомментировал следующие строки в скрипте импорта, которые ссылались на эти ресурсы:

create_users(users, total: user_count, offset: offset) do |user|
        username = @htmlentities.decode(user["username"]).strip
        {
          id: user["userid"],
          name: username,
          username: username,
          email: user["email"].presence || fake_email,
          admin: user['admin'] == 1,
          password: user["password"],
          website: user["homepage"].strip,
          title: @htmlentities.decode(user["usertitle"]).strip,
          primary_group_id: group_id_from_imported_group_id(user["usergroupid"]),
          created_at: parse_timestamp(user["joindate"])
          # post_create_action: proc do |u|
          #   @old_username_to_new_usernames[user["username"]] = u.username
          #   import_profile_picture(user, u)
          #   import_profile_background(user, u)
          # end
        }
      end

Но, насколько я понимаю, эти изменения влияют только на создание пользователей. А пользователи создаются успешно.

Вот полный скрипт импорта, который я использую:

Скрипт собирает все темы из таблицы node в базе данных vBulletin, которая существует и содержит около 34 тысяч записей. Имена столбцов совпадают с теми, на которые ссылается скрипт:

Кажется, что всё должно работать как надо :roll_eyes:

Скрипт импорта ищет contenttypeid=23 и contenttypeid=22 для создания записей.

Пробежавшись по таблице node, я могу сказать, что 23 обозначает запись с вложением, а 22 — само вложение.

Большинство записей имеют contenttypeid=21 — это записи без вложений. Я не вижу импорта для них. Или это покрывается следующим кодом:

post_count = mysql_query("SELECT COUNT(nodeid) cnt FROM #{DBPREFIX}node WHERE parentid NOT IN (
SELECT nodeid FROM #{DBPREFIX}node WHERE contenttypeid=23 ) AND contenttypeid=22;").first["cnt"]

Этот запрос обрабатывает всё, что осталось после завершения импорта для 23/22. Однако существуют и другие идентификаторы типов контента, помимо 23/22/21, поэтому этот запрос затронет и их.


Категории импортируются относительно ROOT_NODE, который по умолчанию установлен в 2. Возможно, мне придётся изменить его на 3, чтобы поддержать мои URL с «трёхуровневой вложенностью»?

ОБНОВЛЕНИЕ: Я только что перезапустил импорт с ROOT_NODE=3, но это ничего не изменило.

Похоже, ваша версия vBulletin отличается от той, которую ожидает скрипт. Прежде чем вы сможете импортировать сообщения, вам нужно выяснить, почему не было создано ни одной темы.

Хорошо. Проблема в contenttypeid:

def import_categories
    puts "", "importing top level categories..."

    categories = mysql_query("SELECT nodeid AS forumid, title, description, displayorder, parentid
	      FROM #{DBPREFIX}node
          WHERE parentid=#{ROOT_NODE}
        UNION
          SELECT nodeid, title, description, displayorder, parentid
          FROM #{DBPREFIX}node
          WHERE contenttypeid = 20
            AND parentid IN (SELECT nodeid FROM #{DBPREFIX}node WHERE parentid=#{ROOT_NODE})").to_a

Например, функция import_categories использует contenttypeid = 23, что соответствует тому же идентификатору, который скрипт применяет для сообщений. Идентификатор для категорий — 20. Изменив это значение в скрипте, я наконец смог увидеть свои подкатегории / темы :raised_hands:

Теперь осталось только восстановить ветки / сообщения.

Я создал pull request с некоторыми обновлениями для импортера VBulletin5. Одно из самых важных изменений — отказ от этих жестко заданных идентификаторов.

Также улучшена поддержка загрузки файлов: теперь импортер обрабатывает теги и создает постоянные ссылки для тем и (под)категорий.