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