120 lines
3.0 KiB
Python
120 lines
3.0 KiB
Python
#!/usr/bin/env python
|
|
|
|
"""Migrate blog database files from a PerlSiikir site to Rophako.
|
|
|
|
Usage: scripts/siikir-blog-migrate.py <path/to/siikir/db/root>
|
|
|
|
Rophako supports one global blog, so the blog of UserID 1 in Siikir is used."""
|
|
|
|
import sys
|
|
import os
|
|
import codecs
|
|
import json
|
|
import glob
|
|
|
|
sys.path.append(".")
|
|
import rophako.jsondb as JsonDB
|
|
|
|
# Path to Siikir DB root.
|
|
siikir = None
|
|
|
|
def main():
|
|
if len(sys.argv) == 1:
|
|
print "Usage: {} <path/to/siikir/db/root>".format(__file__)
|
|
sys.exit(1)
|
|
|
|
global siikir
|
|
siikir = sys.argv[1]
|
|
print "Siikir DB:", siikir
|
|
if raw_input("Confirm? [yN] ") != "y":
|
|
sys.exit(1)
|
|
|
|
convert_index()
|
|
convert_posts()
|
|
convert_comments()
|
|
convert_subscriptions()
|
|
|
|
|
|
def convert_index():
|
|
print "Converting blog index"
|
|
index = json_get("blog/index/1.json")
|
|
new = {}
|
|
for post_id, data in index.iteritems():
|
|
del data["id"]
|
|
|
|
# Enforce data types.
|
|
data["author"] = int(data["author"])
|
|
data["time"] = int(data["time"])
|
|
data["sticky"] = bool(data["sticky"])
|
|
|
|
new[post_id] = data
|
|
|
|
JsonDB.commit("blog/index", new)
|
|
|
|
|
|
def convert_posts():
|
|
print "Converting blog entries..."
|
|
|
|
for name in glob.glob(os.path.join(siikir, "blog/entries/1/*.json")):
|
|
name = name.split("/")[-1]
|
|
post = json_get("blog/entries/1/{}".format(name))
|
|
post_id = post["id"]
|
|
del post["id"]
|
|
|
|
# Enforce data types.
|
|
post["time"] = int(post["time"])
|
|
post["author"] = int(post["author"])
|
|
post["comments"] = bool(post["comments"])
|
|
post["sticky"] = bool(post["sticky"])
|
|
post["emoticons"] = bool(post["emoticons"])
|
|
|
|
print "*", post["subject"]
|
|
JsonDB.commit("blog/entries/{}".format(post_id), post)
|
|
|
|
|
|
def convert_comments():
|
|
print "Converting comments..."
|
|
|
|
for name in glob.glob(os.path.join(siikir, "comments/1/*.json")):
|
|
name = name.split("/")[-1]
|
|
if name.startswith("photos-"): continue
|
|
data = json_get("comments/1/{}".format(name))
|
|
|
|
thread = name[:len(name)-5]
|
|
|
|
# Enforce data types.
|
|
for cid in data:
|
|
data[cid]["time"] = int(data[cid]["time"])
|
|
data[cid]["uid"] = int(data[cid]["uid"])
|
|
|
|
print "*", thread
|
|
JsonDB.commit("comments/threads/{}".format(thread), data)
|
|
|
|
|
|
def convert_subscriptions():
|
|
print "Converting subscriptions..."
|
|
|
|
for name in glob.glob(os.path.join(siikir, "subscribers/1/*.json")):
|
|
name = name.split("/")[-1]
|
|
if name.startswith("photos-"): continue
|
|
data = json_get("subscribers/1/{}".format(name))
|
|
|
|
thread = name[:len(name)-5]
|
|
|
|
# Enforce data types.
|
|
for email in data:
|
|
data[email] = int(data[email])
|
|
|
|
print "*", thread
|
|
JsonDB.commit("comments/subscribers/{}".format(thread), data)
|
|
|
|
|
|
def json_get(document):
|
|
fh = codecs.open(os.path.join(siikir, document), 'r', 'utf-8')
|
|
text = fh.read()
|
|
fh.close()
|
|
return json.loads(text)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |