mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 21:11:10 +08:00
DEV: Apply syntax_tree formatting to script/*
This commit is contained in:
@ -5,9 +5,8 @@ require "htmlentities"
|
||||
require File.expand_path(File.dirname(__FILE__) + "/base.rb")
|
||||
|
||||
class ImportScripts::Drupal < ImportScripts::Base
|
||||
|
||||
DRUPAL_DB = ENV['DRUPAL_DB'] || "drupal"
|
||||
VID = ENV['DRUPAL_VID'] || 1
|
||||
DRUPAL_DB = ENV["DRUPAL_DB"] || "drupal"
|
||||
VID = ENV["DRUPAL_VID"] || 1
|
||||
BATCH_SIZE = 1000
|
||||
ATTACHMENT_DIR = "/root/files/upload"
|
||||
|
||||
@ -16,25 +15,23 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
|
||||
@htmlentities = HTMLEntities.new
|
||||
|
||||
@client = Mysql2::Client.new(
|
||||
host: "localhost",
|
||||
username: "root",
|
||||
#password: "password",
|
||||
database: DRUPAL_DB
|
||||
)
|
||||
@client =
|
||||
Mysql2::Client.new(
|
||||
host: "localhost",
|
||||
username: "root",
|
||||
#password: "password",
|
||||
database: DRUPAL_DB,
|
||||
)
|
||||
end
|
||||
|
||||
def execute
|
||||
|
||||
import_users
|
||||
import_categories
|
||||
|
||||
# "Nodes" in Drupal are divided into types. Here we import two types,
|
||||
# and will later import all the comments/replies for each node.
|
||||
# You will need to figure out what the type names are on your install and edit the queries to match.
|
||||
if ENV['DRUPAL_IMPORT_BLOG']
|
||||
import_blog_topics
|
||||
end
|
||||
import_blog_topics if ENV["DRUPAL_IMPORT_BLOG"]
|
||||
|
||||
import_forum_topics
|
||||
|
||||
@ -56,7 +53,7 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
last_user_id = -1
|
||||
|
||||
batches(BATCH_SIZE) do |offset|
|
||||
users = mysql_query(<<-SQL
|
||||
users = mysql_query(<<-SQL).to_a
|
||||
SELECT uid,
|
||||
name username,
|
||||
mail email,
|
||||
@ -66,7 +63,6 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
ORDER BY uid
|
||||
LIMIT #{BATCH_SIZE}
|
||||
SQL
|
||||
).to_a
|
||||
|
||||
break if users.empty?
|
||||
|
||||
@ -80,12 +76,7 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
|
||||
username = @htmlentities.decode(user["username"]).strip
|
||||
|
||||
{
|
||||
id: user["uid"],
|
||||
name: username,
|
||||
email: email,
|
||||
created_at: Time.zone.at(user["created"])
|
||||
}
|
||||
{ id: user["uid"], name: username, email: email, created_at: Time.zone.at(user["created"]) }
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -99,35 +90,31 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
|
||||
puts "", "importing categories"
|
||||
|
||||
categories = mysql_query(<<-SQL
|
||||
categories = mysql_query(<<-SQL).to_a
|
||||
SELECT tid,
|
||||
name,
|
||||
description
|
||||
FROM taxonomy_term_data
|
||||
WHERE vid = #{VID}
|
||||
SQL
|
||||
).to_a
|
||||
|
||||
create_categories(categories) do |category|
|
||||
{
|
||||
id: category['tid'],
|
||||
name: @htmlentities.decode(category['name']).strip,
|
||||
description: @htmlentities.decode(category['description']).strip
|
||||
id: category["tid"],
|
||||
name: @htmlentities.decode(category["name"]).strip,
|
||||
description: @htmlentities.decode(category["description"]).strip,
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def import_blog_topics
|
||||
puts '', "importing blog topics"
|
||||
puts "", "importing blog topics"
|
||||
|
||||
create_category(
|
||||
{
|
||||
name: 'Blog',
|
||||
description: "Articles from the blog"
|
||||
},
|
||||
nil) unless Category.find_by_name('Blog')
|
||||
unless Category.find_by_name("Blog")
|
||||
create_category({ name: "Blog", description: "Articles from the blog" }, nil)
|
||||
end
|
||||
|
||||
blogs = mysql_query(<<-SQL
|
||||
blogs = mysql_query(<<-SQL).to_a
|
||||
SELECT n.nid nid, n.title title, n.uid uid, n.created created, n.sticky sticky,
|
||||
f.body_value body
|
||||
FROM node n,
|
||||
@ -136,38 +123,38 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
AND n.nid = f.entity_id
|
||||
AND n.status = 1
|
||||
SQL
|
||||
).to_a
|
||||
|
||||
category_id = Category.find_by_name('Blog').id
|
||||
category_id = Category.find_by_name("Blog").id
|
||||
|
||||
create_posts(blogs) do |topic|
|
||||
{
|
||||
id: "nid:#{topic['nid']}",
|
||||
user_id: user_id_from_imported_user_id(topic['uid']) || -1,
|
||||
id: "nid:#{topic["nid"]}",
|
||||
user_id: user_id_from_imported_user_id(topic["uid"]) || -1,
|
||||
category: category_id,
|
||||
raw: topic['body'],
|
||||
created_at: Time.zone.at(topic['created']),
|
||||
pinned_at: topic['sticky'].to_i == 1 ? Time.zone.at(topic['created']) : nil,
|
||||
title: topic['title'].try(:strip),
|
||||
custom_fields: { import_id: "nid:#{topic['nid']}" }
|
||||
raw: topic["body"],
|
||||
created_at: Time.zone.at(topic["created"]),
|
||||
pinned_at: topic["sticky"].to_i == 1 ? Time.zone.at(topic["created"]) : nil,
|
||||
title: topic["title"].try(:strip),
|
||||
custom_fields: {
|
||||
import_id: "nid:#{topic["nid"]}",
|
||||
},
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def import_forum_topics
|
||||
puts '', "importing forum topics"
|
||||
puts "", "importing forum topics"
|
||||
|
||||
total_count = mysql_query(<<-SQL
|
||||
total_count = mysql_query(<<-SQL).first["count"]
|
||||
SELECT COUNT(*) count
|
||||
FROM forum_index fi, node n
|
||||
WHERE n.type = 'forum'
|
||||
AND fi.nid = n.nid
|
||||
AND n.status = 1
|
||||
SQL
|
||||
).first['count']
|
||||
|
||||
batches(BATCH_SIZE) do |offset|
|
||||
results = mysql_query(<<-SQL
|
||||
results = mysql_query(<<-SQL).to_a
|
||||
SELECT fi.nid nid,
|
||||
fi.title title,
|
||||
fi.tid tid,
|
||||
@ -188,34 +175,33 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
LIMIT #{BATCH_SIZE}
|
||||
OFFSET #{offset};
|
||||
SQL
|
||||
).to_a
|
||||
|
||||
break if results.size < 1
|
||||
|
||||
next if all_records_exist? :posts, results.map { |p| "nid:#{p['nid']}" }
|
||||
next if all_records_exist? :posts, results.map { |p| "nid:#{p["nid"]}" }
|
||||
|
||||
create_posts(results, total: total_count, offset: offset) do |row|
|
||||
raw = preprocess_raw(row['body'])
|
||||
raw = preprocess_raw(row["body"])
|
||||
topic = {
|
||||
id: "nid:#{row['nid']}",
|
||||
user_id: user_id_from_imported_user_id(row['uid']) || -1,
|
||||
category: category_id_from_imported_category_id(row['tid']),
|
||||
id: "nid:#{row["nid"]}",
|
||||
user_id: user_id_from_imported_user_id(row["uid"]) || -1,
|
||||
category: category_id_from_imported_category_id(row["tid"]),
|
||||
raw: raw,
|
||||
created_at: Time.zone.at(row['created']),
|
||||
pinned_at: row['sticky'].to_i == 1 ? Time.zone.at(row['created']) : nil,
|
||||
title: row['title'].try(:strip),
|
||||
views: row['views']
|
||||
created_at: Time.zone.at(row["created"]),
|
||||
pinned_at: row["sticky"].to_i == 1 ? Time.zone.at(row["created"]) : nil,
|
||||
title: row["title"].try(:strip),
|
||||
views: row["views"],
|
||||
}
|
||||
topic[:custom_fields] = { import_solved: true } if row['solved'].present?
|
||||
topic[:custom_fields] = { import_solved: true } if row["solved"].present?
|
||||
topic
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def import_replies
|
||||
puts '', "creating replies in topics"
|
||||
puts "", "creating replies in topics"
|
||||
|
||||
total_count = mysql_query(<<-SQL
|
||||
total_count = mysql_query(<<-SQL).first["count"]
|
||||
SELECT COUNT(*) count
|
||||
FROM comment c,
|
||||
node n
|
||||
@ -224,10 +210,9 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
AND n.type IN ('article', 'forum')
|
||||
AND n.status = 1
|
||||
SQL
|
||||
).first['count']
|
||||
|
||||
batches(BATCH_SIZE) do |offset|
|
||||
results = mysql_query(<<-SQL
|
||||
results = mysql_query(<<-SQL).to_a
|
||||
SELECT c.cid, c.pid, c.nid, c.uid, c.created,
|
||||
f.comment_body_value body
|
||||
FROM comment c,
|
||||
@ -241,30 +226,29 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
LIMIT #{BATCH_SIZE}
|
||||
OFFSET #{offset}
|
||||
SQL
|
||||
).to_a
|
||||
|
||||
break if results.size < 1
|
||||
|
||||
next if all_records_exist? :posts, results.map { |p| "cid:#{p['cid']}" }
|
||||
next if all_records_exist? :posts, results.map { |p| "cid:#{p["cid"]}" }
|
||||
|
||||
create_posts(results, total: total_count, offset: offset) do |row|
|
||||
topic_mapping = topic_lookup_from_imported_post_id("nid:#{row['nid']}")
|
||||
topic_mapping = topic_lookup_from_imported_post_id("nid:#{row["nid"]}")
|
||||
if topic_mapping && topic_id = topic_mapping[:topic_id]
|
||||
raw = preprocess_raw(row['body'])
|
||||
raw = preprocess_raw(row["body"])
|
||||
h = {
|
||||
id: "cid:#{row['cid']}",
|
||||
id: "cid:#{row["cid"]}",
|
||||
topic_id: topic_id,
|
||||
user_id: user_id_from_imported_user_id(row['uid']) || -1,
|
||||
user_id: user_id_from_imported_user_id(row["uid"]) || -1,
|
||||
raw: raw,
|
||||
created_at: Time.zone.at(row['created']),
|
||||
created_at: Time.zone.at(row["created"]),
|
||||
}
|
||||
if row['pid']
|
||||
parent = topic_lookup_from_imported_post_id("cid:#{row['pid']}")
|
||||
if row["pid"]
|
||||
parent = topic_lookup_from_imported_post_id("cid:#{row["pid"]}")
|
||||
h[:reply_to_post_number] = parent[:post_number] if parent && parent[:post_number] > (1)
|
||||
end
|
||||
h
|
||||
else
|
||||
puts "No topic found for comment #{row['cid']}"
|
||||
puts "No topic found for comment #{row["cid"]}"
|
||||
nil
|
||||
end
|
||||
end
|
||||
@ -275,7 +259,7 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
puts "", "importing post likes"
|
||||
|
||||
batches(BATCH_SIZE) do |offset|
|
||||
likes = mysql_query(<<-SQL
|
||||
likes = mysql_query(<<-SQL).to_a
|
||||
SELECT flagging_id,
|
||||
fid,
|
||||
entity_id,
|
||||
@ -286,17 +270,20 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
LIMIT #{BATCH_SIZE}
|
||||
OFFSET #{offset}
|
||||
SQL
|
||||
).to_a
|
||||
|
||||
break if likes.empty?
|
||||
|
||||
likes.each do |l|
|
||||
identifier = l['fid'] == 5 ? 'nid' : 'cid'
|
||||
next unless user_id = user_id_from_imported_user_id(l['uid'])
|
||||
next unless post_id = post_id_from_imported_post_id("#{identifier}:#{l['entity_id']}")
|
||||
identifier = l["fid"] == 5 ? "nid" : "cid"
|
||||
next unless user_id = user_id_from_imported_user_id(l["uid"])
|
||||
next unless post_id = post_id_from_imported_post_id("#{identifier}:#{l["entity_id"]}")
|
||||
next unless user = User.find_by(id: user_id)
|
||||
next unless post = Post.find_by(id: post_id)
|
||||
PostActionCreator.like(user, post) rescue nil
|
||||
begin
|
||||
PostActionCreator.like(user, post)
|
||||
rescue StandardError
|
||||
nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -304,7 +291,8 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
def mark_topics_as_solved
|
||||
puts "", "marking topics as solved"
|
||||
|
||||
solved_topics = TopicCustomField.where(name: "import_solved").where(value: true).pluck(:topic_id)
|
||||
solved_topics =
|
||||
TopicCustomField.where(name: "import_solved").where(value: true).pluck(:topic_id)
|
||||
|
||||
solved_topics.each do |topic_id|
|
||||
next unless topic = Topic.find(topic_id)
|
||||
@ -336,8 +324,13 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
begin
|
||||
current_count += 1
|
||||
print_status(current_count, total_count, start_time)
|
||||
SingleSignOnRecord.create!(user_id: user.id, external_id: external_id, external_email: user.email, last_payload: '')
|
||||
rescue
|
||||
SingleSignOnRecord.create!(
|
||||
user_id: user.id,
|
||||
external_id: external_id,
|
||||
external_email: user.email,
|
||||
last_payload: "",
|
||||
)
|
||||
rescue StandardError
|
||||
next
|
||||
end
|
||||
end
|
||||
@ -350,14 +343,13 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
success_count = 0
|
||||
fail_count = 0
|
||||
|
||||
total_count = mysql_query(<<-SQL
|
||||
total_count = mysql_query(<<-SQL).first["count"]
|
||||
SELECT count(field_post_attachment_fid) count
|
||||
FROM field_data_field_post_attachment
|
||||
SQL
|
||||
).first["count"]
|
||||
|
||||
batches(BATCH_SIZE) do |offset|
|
||||
attachments = mysql_query(<<-SQL
|
||||
attachments = mysql_query(<<-SQL).to_a
|
||||
SELECT *
|
||||
FROM field_data_field_post_attachment fp
|
||||
LEFT JOIN file_managed fm
|
||||
@ -365,7 +357,6 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
LIMIT #{BATCH_SIZE}
|
||||
OFFSET #{offset}
|
||||
SQL
|
||||
).to_a
|
||||
|
||||
break if attachments.size < 1
|
||||
|
||||
@ -373,9 +364,11 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
current_count += 1
|
||||
print_status current_count, total_count
|
||||
|
||||
identifier = attachment['entity_type'] == "comment" ? "cid" : "nid"
|
||||
next unless user_id = user_id_from_imported_user_id(attachment['uid'])
|
||||
next unless post_id = post_id_from_imported_post_id("#{identifier}:#{attachment['entity_id']}")
|
||||
identifier = attachment["entity_type"] == "comment" ? "cid" : "nid"
|
||||
next unless user_id = user_id_from_imported_user_id(attachment["uid"])
|
||||
unless post_id = post_id_from_imported_post_id("#{identifier}:#{attachment["entity_id"]}")
|
||||
next
|
||||
end
|
||||
next unless user = User.find(user_id)
|
||||
next unless post = Post.find(post_id)
|
||||
|
||||
@ -392,9 +385,14 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
new_raw = "#{new_raw}\n\n#{upload_html}" unless new_raw.include?(upload_html)
|
||||
|
||||
if new_raw != post.raw
|
||||
PostRevisor.new(post).revise!(post.user, { raw: new_raw }, bypass_bump: true, edit_reason: "Import attachment from Drupal")
|
||||
PostRevisor.new(post).revise!(
|
||||
post.user,
|
||||
{ raw: new_raw },
|
||||
bypass_bump: true,
|
||||
edit_reason: "Import attachment from Drupal",
|
||||
)
|
||||
else
|
||||
puts '', 'Skipped upload: already imported'
|
||||
puts "", "Skipped upload: already imported"
|
||||
end
|
||||
|
||||
success_count += 1
|
||||
@ -406,13 +404,13 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
end
|
||||
|
||||
def create_permalinks
|
||||
puts '', 'creating permalinks...'
|
||||
puts "", "creating permalinks..."
|
||||
|
||||
Topic.listable_topics.find_each do |topic|
|
||||
begin
|
||||
tcf = topic.custom_fields
|
||||
if tcf && tcf['import_id']
|
||||
node_id = tcf['import_id'][/nid:(\d+)/, 1]
|
||||
if tcf && tcf["import_id"]
|
||||
node_id = tcf["import_id"][/nid:(\d+)/, 1]
|
||||
slug = "/node/#{node_id}"
|
||||
Permalink.create(url: slug, topic_id: topic.id)
|
||||
end
|
||||
@ -424,18 +422,16 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
end
|
||||
|
||||
def find_upload(post, attachment)
|
||||
uri = attachment['uri'][/public:\/\/upload\/(.+)/, 1]
|
||||
uri = attachment["uri"][%r{public://upload/(.+)}, 1]
|
||||
real_filename = CGI.unescapeHTML(uri)
|
||||
file = File.join(ATTACHMENT_DIR, real_filename)
|
||||
|
||||
unless File.exist?(file)
|
||||
puts "Attachment file #{attachment['filename']} doesn't exist"
|
||||
puts "Attachment file #{attachment["filename"]} doesn't exist"
|
||||
|
||||
tmpfile = "attachments_failed.txt"
|
||||
filename = File.join('/tmp/', tmpfile)
|
||||
File.open(filename, 'a') { |f|
|
||||
f.puts attachment['filename']
|
||||
}
|
||||
filename = File.join("/tmp/", tmpfile)
|
||||
File.open(filename, "a") { |f| f.puts attachment["filename"] }
|
||||
end
|
||||
|
||||
upload = create_upload(post.user.id || -1, file, real_filename)
|
||||
@ -452,13 +448,13 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
def preprocess_raw(raw)
|
||||
return if raw.blank?
|
||||
# quotes on new lines
|
||||
raw.gsub!(/\[quote\](.+?)\[\/quote\]/im) { |quote|
|
||||
quote.gsub!(/\[quote\](.+?)\[\/quote\]/im) { "\n#{$1}\n" }
|
||||
raw.gsub!(%r{\[quote\](.+?)\[/quote\]}im) do |quote|
|
||||
quote.gsub!(%r{\[quote\](.+?)\[/quote\]}im) { "\n#{$1}\n" }
|
||||
quote.gsub!(/\n(.+?)/) { "\n> #{$1}" }
|
||||
}
|
||||
end
|
||||
|
||||
# [QUOTE=<username>]...[/QUOTE]
|
||||
raw.gsub!(/\[quote=([^;\]]+)\](.+?)\[\/quote\]/im) do
|
||||
raw.gsub!(%r{\[quote=([^;\]]+)\](.+?)\[/quote\]}im) do
|
||||
username, quote = $1, $2
|
||||
"\n[quote=\"#{username}\"]\n#{quote}\n[/quote]\n"
|
||||
end
|
||||
@ -468,7 +464,7 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
end
|
||||
|
||||
def postprocess_posts
|
||||
puts '', 'postprocessing posts'
|
||||
puts "", "postprocessing posts"
|
||||
|
||||
current = 0
|
||||
max = Post.count
|
||||
@ -479,7 +475,7 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
new_raw = raw.dup
|
||||
|
||||
# replace old topic to new topic links
|
||||
new_raw.gsub!(/https:\/\/site.com\/forum\/topic\/(\d+)/im) do
|
||||
new_raw.gsub!(%r{https://site.com/forum/topic/(\d+)}im) do
|
||||
post_id = post_id_from_imported_post_id("nid:#{$1}")
|
||||
next unless post_id
|
||||
topic = Post.find(post_id).topic
|
||||
@ -487,7 +483,7 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
end
|
||||
|
||||
# replace old comment to reply links
|
||||
new_raw.gsub!(/https:\/\/site.com\/comment\/(\d+)#comment-\d+/im) do
|
||||
new_raw.gsub!(%r{https://site.com/comment/(\d+)#comment-\d+}im) do
|
||||
post_id = post_id_from_imported_post_id("cid:#{$1}")
|
||||
next unless post_id
|
||||
post_ref = Post.find(post_id)
|
||||
@ -498,8 +494,8 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
post.raw = new_raw
|
||||
post.save
|
||||
end
|
||||
rescue
|
||||
puts '', "Failed rewrite on post: #{post.id}"
|
||||
rescue StandardError
|
||||
puts "", "Failed rewrite on post: #{post.id}"
|
||||
ensure
|
||||
print_status(current += 1, max)
|
||||
end
|
||||
@ -507,15 +503,15 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
end
|
||||
|
||||
def import_gravatars
|
||||
puts '', 'importing gravatars'
|
||||
puts "", "importing gravatars"
|
||||
current = 0
|
||||
max = User.count
|
||||
User.find_each do |user|
|
||||
begin
|
||||
user.create_user_avatar(user_id: user.id) unless user.user_avatar
|
||||
user.user_avatar.update_gravatar!
|
||||
rescue
|
||||
puts '', 'Failed avatar update on user #{user.id}'
|
||||
rescue StandardError
|
||||
puts "", 'Failed avatar update on user #{user.id}'
|
||||
ensure
|
||||
print_status(current += 1, max)
|
||||
end
|
||||
@ -523,15 +519,12 @@ class ImportScripts::Drupal < ImportScripts::Base
|
||||
end
|
||||
|
||||
def parse_datetime(time)
|
||||
DateTime.strptime(time, '%s')
|
||||
DateTime.strptime(time, "%s")
|
||||
end
|
||||
|
||||
def mysql_query(sql)
|
||||
@client.query(sql, cache_rows: true)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if __FILE__ == $0
|
||||
ImportScripts::Drupal.new.perform
|
||||
end
|
||||
ImportScripts::Drupal.new.perform if __FILE__ == $0
|
||||
|
Reference in New Issue
Block a user