2015-06-08 17:38:05 +05:30
require " csv "
require File . expand_path ( File . dirname ( __FILE__ ) + " /base.rb " )
# Edit the constants and initialize method for your import data.
class ImportScripts :: Muut < ImportScripts :: Base
JSON_FILE_PATH = " /path/to/json/file "
CSV_FILE_PATH = " /path/to/csv/file "
def initialize
super
@imported_users = load_csv
@imported_json = load_json
end
def execute
puts " " , " Importing from Muut... "
import_users
import_categories
import_discussions
puts " " , " Done "
end
def load_json
JSON . parse ( repair_json ( File . read ( JSON_FILE_PATH ) ) )
end
def load_csv
CSV . parse ( File . read ( CSV_FILE_PATH ) )
end
def repair_json ( arg )
arg . gsub! ( / ^ \ ( / , " " ) # content of file is surround by ( )
arg . gsub! ( / \ )$ / , " " )
arg . gsub! ( / \ ] \ ]$ / , " ] " ) # there can be an extra ] at the end
arg . gsub! ( / \ } \ { / , " },{ " ) # missing commas sometimes!
arg . gsub! ( " }]{ " , " },{ " ) # surprise square brackets
arg . gsub! ( " }[{ " , " },{ " ) # :troll:
arg
end
def import_users
puts '' , " Importing users "
create_users ( @imported_users ) do | u |
{
id : u [ 0 ] ,
email : u [ 1 ] ,
created_at : Time . now
}
end
end
def import_categories
puts " " , " Importing categories "
create_categories ( @imported_json [ 'categories' ] ) do | category |
{
id : category [ 'path' ] , # muut has no id for categories, so use the path
name : category [ 'title' ] ,
slug : category [ 'path' ]
}
end
end
def import_discussions
puts " " , " Importing discussions "
topics = 0
posts = 0
@imported_json [ 'categories' ] . each do | category |
@imported_json [ 'threads' ] [ category [ 'path' ] ] . each do | thread |
next if thread [ " seed " ] [ " key " ] == " skip-this-topic "
mapped = { }
mapped [ :id ] = " #{ thread [ " seed " ] [ " key " ] } - #{ thread [ " seed " ] [ " date " ] } "
if thread [ " seed " ] [ " author " ] && user_id_from_imported_user_id ( thread [ " seed " ] [ " author " ] [ " path " ] ) != " "
mapped [ :user_id ] = user_id_from_imported_user_id ( thread [ " seed " ] [ " author " ] [ " path " ] ) || - 1
else
mapped [ :user_id ] = - 1
end
# update user display name
if thread [ " seed " ] [ " author " ] && thread [ " seed " ] [ " author " ] [ " displayname " ] != " " && mapped [ :user_id ] != - 1
user = User . find_by ( id : mapped [ :user_id ] )
if user
user . name = thread [ " seed " ] [ " author " ] [ " displayname " ]
user . save!
end
end
mapped [ :created_at ] = Time . zone . at ( thread [ " seed " ] [ " date " ] )
mapped [ :category ] = category_id_from_imported_category_id ( thread [ " seed " ] [ " path " ] )
mapped [ :title ] = CGI . unescapeHTML ( thread [ " seed " ] [ " title " ] )
mapped [ :raw ] = process_muut_post_body ( thread [ " seed " ] [ " body " ] )
mapped [ :raw ] = CGI . unescapeHTML ( thread [ " seed " ] [ " title " ] ) if mapped [ :raw ] == " "
parent_post = create_post ( mapped , mapped [ :id ] )
unless parent_post . is_a? ( Post )
puts " Error creating topic #{ mapped [ :id ] } . Skipping. "
puts parent_post . inspect
end
# uncomment below line to create permalink
# Permalink.create(url: "#{thread["seed"]["path"]}:#{thread["seed"]["key"]}", topic_id: parent_post.topic_id)
# create replies
if thread [ " replies " ] . present? && thread [ " replies " ] . count > 0
2016-08-09 16:29:33 +03:00
thread [ " replies " ] . reverse_each do | post |
2015-06-08 17:38:05 +05:30
if post_id_from_imported_post_id ( post [ " id " ] )
next # already imported this post
end
new_post = create_post ( {
id : " #{ post [ " key " ] } - #{ post [ " date " ] } " ,
topic_id : parent_post . topic_id ,
user_id : user_id_from_imported_user_id ( post [ " author " ] [ " path " ] ) || - 1 ,
raw : process_muut_post_body ( post [ " body " ] ) ,
created_at : Time . zone . at ( post [ " date " ] )
} , post [ " id " ] )
if new_post . is_a? ( Post )
posts += 1
else
puts " Error creating post #{ post [ " id " ] } . Skipping. "
puts new_post . inspect
end
end
end
topics += 1
end
end
puts " " , " Imported #{ topics } topics with #{ topics + posts } posts. "
end
def process_muut_post_body ( arg )
raw = arg . dup
raw = raw . to_s
raw = raw [ 2 .. - 3 ]
# new line
raw . gsub! ( / \\ n / , " \n " )
# code block
raw . gsub! ( " --- " , " ``` \n " )
# tab
raw . gsub! ( / \\ t / , ' ' )
# double quote
raw . gsub! ( / \\ \ " / , '"' )
raw = CGI . unescapeHTML ( raw )
raw
end
def file_full_path ( relpath )
File . join JSON_FILES_DIR , relpath . split ( " ? " ) . first
end
end
if __FILE__ == $0
ImportScripts :: Muut . new . perform
end