175 lines
4.2 KiB
Python
Executable file
175 lines
4.2 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
import json as _json
|
|
import datetime as _datetime
|
|
|
|
|
|
def sql_format(
|
|
value
|
|
):
|
|
if (value is None):
|
|
return "NULL"
|
|
else:
|
|
if (type(value) == bool):
|
|
return ('TRUE' if value else 'FALSE')
|
|
elif (type(value) == int):
|
|
return ("%u" % value)
|
|
elif (type(value) == str):
|
|
return ("'%s'" % value)
|
|
else:
|
|
raise ValueError("unhandled type: " + str(type(value)))
|
|
|
|
|
|
def string_coin(
|
|
template,
|
|
arguments
|
|
):
|
|
result = template
|
|
for (key, value, ) in arguments.items():
|
|
result = result.replace("{{%s}}" % key, value)
|
|
return result
|
|
|
|
|
|
def file_read(
|
|
path
|
|
):
|
|
handle = open(path, "r")
|
|
content = handle.read()
|
|
handle.close()
|
|
return content
|
|
|
|
|
|
def datetime_convert(
|
|
datetime
|
|
):
|
|
return (
|
|
None
|
|
if
|
|
(datetime is None)
|
|
else
|
|
string_coin(
|
|
"{{timezone_shift}}|{{year}}-{{month}}-{{day}}{{macro_time}}",
|
|
{
|
|
"timezone_shift": ("%02u" % datetime["timezone_shift"]),
|
|
"year": ("%04u" % datetime["date"]["year"]),
|
|
"month": ("%02u" % datetime["date"]["month"]),
|
|
"day": ("%02u" % datetime["date"]["day"]),
|
|
"macro_time": (
|
|
""
|
|
if
|
|
(datetime["time"] is None)
|
|
else
|
|
string_coin(
|
|
"T{{hour}}:{{minute}}:{{second}}",
|
|
{
|
|
"hour": ("%02u" % datetime["time"]["hour"]),
|
|
"minute": ("%02u" % datetime["time"]["minute"]),
|
|
"second": ("%02u" % datetime["time"]["second"]),
|
|
}
|
|
)
|
|
)
|
|
}
|
|
)
|
|
)
|
|
|
|
|
|
def main(
|
|
):
|
|
data = _json.loads(file_read("data/example.kal.json"))
|
|
for user in data["users"]:
|
|
print(
|
|
string_coin(
|
|
"INSERT INTO users(id,name) VALUES ({{id}},{{name}});\n",
|
|
{
|
|
"id": sql_format(user["id"]),
|
|
"name": sql_format(user["object"]["name"]),
|
|
}
|
|
)
|
|
)
|
|
ids = {
|
|
"calendars": 0,
|
|
"local_resource": 0,
|
|
"caldav_resource": 0,
|
|
}
|
|
for calendar in data["calendars"]:
|
|
ids["calendars"] += 1
|
|
if (calendar["object"]["kind"] == "concrete"):
|
|
ids["local_resource"] += 1
|
|
print(
|
|
string_coin(
|
|
"INSERT INTO local_resources(id) VALUES ({{id}});\n",
|
|
{
|
|
"id": sql_format(ids["local_resource"])
|
|
}
|
|
)
|
|
)
|
|
for event in calendar["object"]["data"]["events"]:
|
|
print(
|
|
string_coin(
|
|
"INSERT INTO local_resource_events(local_resource_id,name,begin,end,location,description) VALUES ({{local_resource_id}},{{name}},{{begin}},{{end}},{{location}},{{description}});\n",
|
|
{
|
|
"local_resource_id": sql_format(ids["local_resource"]),
|
|
"name": sql_format(event["name"]),
|
|
"begin": sql_format(datetime_convert(event["begin"])),
|
|
"end": sql_format(datetime_convert(event["end"])),
|
|
"location": sql_format(event["location"]),
|
|
"description": sql_format(event["description"]),
|
|
}
|
|
)
|
|
)
|
|
print(
|
|
string_coin(
|
|
"INSERT INTO resources(kind,sub_id) VALUES ({{kind}},{{sub_id}});\n",
|
|
{
|
|
"kind": sql_format("local"),
|
|
"sub_id": sql_format(ids["local_resource"])
|
|
}
|
|
)
|
|
)
|
|
elif (calendar["object"]["kind"] == "caldav"):
|
|
ids["caldav_resource"] += 1
|
|
print(
|
|
string_coin(
|
|
"INSERT INTO caldav_resources(id,url,read_only) VALUES ({{id}},{{url}},{{read_only}});\n",
|
|
{
|
|
"id": sql_format(ids["caldav_resource"]),
|
|
"url": sql_format(calendar["object"]["data"]["url"]),
|
|
"read_only": sql_format(calendar["object"]["data"]["read_only"]),
|
|
}
|
|
)
|
|
)
|
|
print(
|
|
string_coin(
|
|
"INSERT INTO resources(kind,sub_id) VALUES ({{kind}},{{sub_id}});\n",
|
|
{
|
|
"kind": sql_format("caldav"),
|
|
"sub_id": sql_format(ids["caldav_resource"])
|
|
}
|
|
)
|
|
)
|
|
else:
|
|
raise ValueError("invalid")
|
|
print(
|
|
string_coin(
|
|
"INSERT INTO calendars(id,name,public,resource_id) VALUES ({{id}},{{name}},{{public}},LAST_INSERT_ROWID());\n",
|
|
{
|
|
"id": sql_format(ids["calendars"]),
|
|
"name": sql_format(calendar["object"]["data"]["name"]),
|
|
"public": sql_format(not calendar["object"]["data"]["private"]),
|
|
}
|
|
)
|
|
)
|
|
for member in calendar["object"]["data"].get("users", []):
|
|
print(
|
|
string_coin(
|
|
"INSERT INTO calendar_members(calendar_id,user_id,role) VALUES ({{calendar_id}},{{user_id}},{{role}});\n",
|
|
{
|
|
"calendar_id": sql_format(ids["calendars"]),
|
|
"user_id": sql_format(member["id"]),
|
|
"role": sql_format(member["role"]),
|
|
}
|
|
)
|
|
)
|
|
|
|
|
|
main()
|