mirror of
https://github.com/discourse/discourse.git
synced 2025-09-05 08:59:27 +08:00
DEV: Support phpBB 3.3 imports (#17641)
* handle polls with duplicate items * handle polls with incorrect poll_option_total values * handle group IDs in personal messages * support for version 3.3
This commit is contained in:
parent
994ca8f6de
commit
603f36ca4a
5 changed files with 29 additions and 11 deletions
|
@ -22,13 +22,13 @@ module ImportScripts::PhpBB3
|
||||||
if version.start_with?('3.0')
|
if version.start_with?('3.0')
|
||||||
require_relative 'database_3_0'
|
require_relative 'database_3_0'
|
||||||
Database_3_0.new(@database_client, @database_settings)
|
Database_3_0.new(@database_client, @database_settings)
|
||||||
elsif version.start_with?('3.1') || version.start_with?('3.2')
|
elsif version.start_with?('3.1') || version.start_with?('3.2') || version.start_with?('3.3')
|
||||||
require_relative 'database_3_1'
|
require_relative 'database_3_1'
|
||||||
Database_3_1.new(@database_client, @database_settings)
|
Database_3_1.new(@database_client, @database_settings)
|
||||||
else
|
else
|
||||||
raise UnsupportedVersionError, <<~TEXT
|
raise UnsupportedVersionError, <<~TEXT
|
||||||
Unsupported version (#{version}) of phpBB detected.
|
Unsupported version (#{version}) of phpBB detected.
|
||||||
Currently only version 3.0, 3.1 and 3.2 are supported by this importer.
|
Currently only version 3.0, 3.1, 3.2 and 3.3 are supported by this importer.
|
||||||
TEXT
|
TEXT
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -115,13 +115,13 @@ module ImportScripts::PhpBB3
|
||||||
def fetch_poll_options(topic_id)
|
def fetch_poll_options(topic_id)
|
||||||
query(<<-SQL)
|
query(<<-SQL)
|
||||||
SELECT o.poll_option_id, o.poll_option_text, o.poll_option_total AS total_votes,
|
SELECT o.poll_option_id, o.poll_option_text, o.poll_option_total AS total_votes,
|
||||||
o.poll_option_total - (
|
GREATEST(CAST(o.poll_option_total AS SIGNED) - (
|
||||||
SELECT COUNT(DISTINCT v.vote_user_id)
|
SELECT COUNT(DISTINCT v.vote_user_id)
|
||||||
FROM #{@table_prefix}poll_votes v
|
FROM #{@table_prefix}poll_votes v
|
||||||
JOIN #{@table_prefix}users u ON (v.vote_user_id = u.user_id)
|
JOIN #{@table_prefix}users u ON (v.vote_user_id = u.user_id)
|
||||||
JOIN #{@table_prefix}topics t ON (v.topic_id = t.topic_id)
|
JOIN #{@table_prefix}topics t ON (v.topic_id = t.topic_id)
|
||||||
WHERE v.poll_option_id = o.poll_option_id AND v.topic_id = o.topic_id
|
WHERE v.poll_option_id = o.poll_option_id AND v.topic_id = o.topic_id
|
||||||
) AS anonymous_votes
|
),0) AS anonymous_votes
|
||||||
FROM #{@table_prefix}poll_options o
|
FROM #{@table_prefix}poll_options o
|
||||||
WHERE o.topic_id = #{topic_id}
|
WHERE o.topic_id = #{topic_id}
|
||||||
ORDER BY o.poll_option_id
|
ORDER BY o.poll_option_id
|
||||||
|
|
|
@ -73,19 +73,37 @@ module ImportScripts::PhpBB3
|
||||||
def get_recipient_user_ids(to_address)
|
def get_recipient_user_ids(to_address)
|
||||||
return [] if to_address.blank?
|
return [] if to_address.blank?
|
||||||
|
|
||||||
# to_address looks like this: "u_91:u_1234:u_200"
|
# to_address looks like this: "u_91:u_1234:g_200"
|
||||||
# The "u_" prefix is discarded and the rest is a user_id.
|
# If there is a "u_" prefix, the prefix is discarded and the rest is a user_id
|
||||||
user_ids = to_address.split(':')
|
user_ids = to_address.split(':')
|
||||||
user_ids.uniq!
|
user_ids.uniq!
|
||||||
user_ids.map! { |u| u[2..-1].to_i }
|
user_ids.map! { |u| u[2..-1].to_i if u[0..1] == 'u_' }.compact
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_recipient_group_ids(to_address)
|
||||||
|
return [] if to_address.blank?
|
||||||
|
|
||||||
|
# to_address looks like this: "u_91:u_1234:g_200"
|
||||||
|
# If there is a "g_" prefix, the prefix is discarded and the rest is a group_id
|
||||||
|
group_ids = to_address.split(':')
|
||||||
|
group_ids.uniq!
|
||||||
|
group_ids.map! { |g| g[2..-1].to_i if g[0..1] == 'g_' }.compact
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_recipient_usernames(row)
|
def get_recipient_usernames(row)
|
||||||
import_user_ids = get_recipient_user_ids(row[:to_address])
|
import_user_ids = get_recipient_user_ids(row[:to_address])
|
||||||
|
usernames = import_user_ids.map do |import_user_id|
|
||||||
import_user_ids.map! do |import_user_id|
|
|
||||||
@lookup.find_user_by_import_id(@settings.prefix(import_user_id)).try(:username)
|
@lookup.find_user_by_import_id(@settings.prefix(import_user_id)).try(:username)
|
||||||
end.compact
|
end.compact
|
||||||
|
|
||||||
|
import_group_ids = get_recipient_group_ids(row[:to_address])
|
||||||
|
import_group_ids.each do |import_group_id|
|
||||||
|
group = @lookup.find_group_by_import_id(@settings.prefix(import_group_id))
|
||||||
|
next unless group
|
||||||
|
usernames = usernames + group.users.pluck(:username)
|
||||||
|
end
|
||||||
|
|
||||||
|
usernames.uniq
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_topic_title(row)
|
def get_topic_title(row)
|
||||||
|
|
|
@ -64,7 +64,7 @@ module ImportScripts::PhpBB3
|
||||||
arguments << "close=#{poll_data.close_time.iso8601}" if poll_data.close_time
|
arguments << "close=#{poll_data.close_time.iso8601}" if poll_data.close_time
|
||||||
|
|
||||||
if poll_data.max_options > 1
|
if poll_data.max_options > 1
|
||||||
arguments << "type=multiple" << "max=#{poll_data.max_options}"
|
arguments << "type=multiple" << "max=#{[poll_data.max_options, poll_data.options.count].min}"
|
||||||
else
|
else
|
||||||
arguments << "type=regular"
|
arguments << "type=regular"
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,7 +14,7 @@ module ImportScripts::PhpBB3
|
||||||
@database = database
|
@database = database
|
||||||
@smiley_processor = smiley_processor
|
@smiley_processor = smiley_processor
|
||||||
@he = HTMLEntities.new
|
@he = HTMLEntities.new
|
||||||
@use_xml_to_markdown = phpbb_config[:phpbb_version].start_with?('3.2')
|
@use_xml_to_markdown = phpbb_config[:phpbb_version].start_with?('3.2') || phpbb_config[:phpbb_version].start_with?('3.3')
|
||||||
|
|
||||||
@settings = settings
|
@settings = settings
|
||||||
@new_site_prefix = settings.new_site_prefix
|
@new_site_prefix = settings.new_site_prefix
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue