SQL: mongokit like interface
[mediagoblin.git] / mediagoblin / db / sql / convert.py
1 from sqlalchemy import create_engine
2 from sqlalchemy.orm import sessionmaker
3
4 from mediagoblin.init import setup_global_and_app_config, setup_database
5 from mediagoblin.db.util import ObjectId
6
7 from mediagoblin.db.sql.models import (Base, User, MediaEntry, MediaComment,
8 Tag, MediaTag)
9
10 # Session = sessionmaker()
11 from mediagoblin.db.sql.base import Session
12
13
14 obj_id_table = dict()
15
16 def add_obj_ids(entry, new_entry):
17 global obj_id_table
18 print "%r -> %r" % (entry._id, new_entry.id)
19 obj_id_table[entry._id] = new_entry.id
20
21
22 def copy_attrs(entry, new_entry, attr_list):
23 for a in attr_list:
24 val = entry[a]
25 setattr(new_entry, a, val)
26
27 def copy_reference_attr(entry, new_entry, ref_attr):
28 val = entry[ref_attr]
29 val = obj_id_table[val]
30 setattr(new_entry, ref_attr, val)
31
32
33 def convert_users(mk_db):
34 session = Session()
35
36 for entry in mk_db.User.find():
37 print entry.username
38
39 new_entry = User()
40 copy_attrs(entry, new_entry,
41 ('username', 'email', 'created', 'pw_hash', 'email_verified',
42 'status', 'verification_key', 'is_admin', 'url',
43 'bio', 'bio_html',
44 'fp_verification_key', 'fp_token_expire',))
45 # new_entry.fp_verification_expire = entry.fp_token_expire
46
47 session.add(new_entry)
48 session.flush()
49 add_obj_ids(entry, new_entry)
50
51 session.commit()
52 session.close()
53
54
55 def convert_media_entries(mk_db):
56 session = Session()
57
58 for entry in mk_db.MediaEntry.find():
59 print repr(entry.title)
60
61 new_entry = MediaEntry()
62 copy_attrs(entry, new_entry,
63 ('title', 'slug', 'created',
64 'description', 'description_html',
65 'media_type',
66 'fail_error',
67 'queued_task_id',))
68 copy_reference_attr(entry, new_entry, "uploader")
69
70 session.add(new_entry)
71 session.flush()
72 add_obj_ids(entry, new_entry)
73
74 session.commit()
75 session.close()
76
77
78 def convert_media_tags(mk_db):
79 session = Session()
80 session.autoflush = False
81
82 for media in mk_db.MediaEntry.find():
83 print repr(media.title)
84
85 for otag in media.tags:
86 print " ", repr((otag["slug"], otag["name"]))
87
88 nslug = session.query(Tag).filter_by(slug=otag["slug"]).first()
89 print " ", repr(nslug)
90 if nslug is None:
91 nslug = Tag(slug=otag["slug"])
92 session.add(nslug)
93 session.flush()
94 print " ", repr(nslug), nslug.id
95
96 ntag = MediaTag()
97 ntag.tag = nslug.id
98 ntag.name = otag["name"]
99 ntag.media_entry = obj_id_table[media._id]
100 session.add(ntag)
101
102 session.commit()
103 session.close()
104
105
106 def convert_media_comments(mk_db):
107 session = Session()
108
109 for entry in mk_db.MediaComment.find():
110 print repr(entry.content)
111
112 new_entry = MediaComment()
113 copy_attrs(entry, new_entry,
114 ('created',
115 'content', 'content_html',))
116 copy_reference_attr(entry, new_entry, "media_entry")
117 copy_reference_attr(entry, new_entry, "author")
118
119 session.add(new_entry)
120 session.flush()
121 add_obj_ids(entry, new_entry)
122
123 session.commit()
124 session.close()
125
126
127 def main():
128 engine = create_engine('sqlite:///mediagoblin.db', echo=True)
129 Session.configure(bind=engine)
130
131 setup_global_and_app_config("mediagoblin.ini")
132
133 mk_conn, mk_db = setup_database()
134
135 Base.metadata.create_all(engine)
136
137 convert_users(mk_db)
138 Session.remove()
139 convert_media_entries(mk_db)
140 Session.remove()
141 convert_media_tags(mk_db)
142 Session.remove()
143 convert_media_comments(mk_db)
144 Session.remove()
145
146
147 if __name__ == '__main__':
148 main()