]> git.openstreetmap.org Git - osqa.git/blob - forum_modules/sximporter/importer.py
3952e3b344d9a206d199da5e387ff56690017667
[osqa.git] / forum_modules / sximporter / importer.py
1 # -*- coding: utf-8 -*-\r
2 \r
3 from xml.dom import minidom\r
4 from datetime import datetime, timedelta\r
5 import time\r
6 import re\r
7 from django.utils.translation import ugettext as _\r
8 from django.template.defaultfilters import slugify\r
9 from forum.models.utils import dbsafe_encode\r
10 from orm import orm\r
11 \r
12 def getText(el):\r
13     rc = ""\r
14     for node in el.childNodes:\r
15         if node.nodeType == node.TEXT_NODE:\r
16             rc = rc + node.data\r
17     return rc.strip()\r
18 \r
19 msstrip = re.compile(r'^(.*)\.\d+')\r
20 def readTime(ts):\r
21     noms = msstrip.match(ts)\r
22     if noms:\r
23         ts = noms.group(1)\r
24 \r
25     return datetime(*time.strptime(ts, '%Y-%m-%dT%H:%M:%S')[0:6])\r
26 \r
27 def readEl(el):\r
28     return dict([(n.tagName.lower(), getText(n)) for n in el.childNodes if n.nodeType == el.ELEMENT_NODE])\r
29 \r
30 def readTable(dump, name):\r
31     return [readEl(e) for e in minidom.parseString(dump.read("%s.xml" % name)).getElementsByTagName('row')]\r
32 \r
33 google_accounts_lookup = re.compile(r'^https?://www.google.com/accounts/')\r
34 yahoo_accounts_lookup = re.compile(r'^https?://me.yahoo.com/a/')\r
35 \r
36 openid_lookups = [\r
37         re.compile(r'^https?://www.google.com/profiles/(?P<uname>\w+(\.\w+)*)/?$'),\r
38         re.compile(r'^https?://me.yahoo.com/(?P<uname>\w+(\.\w+)*)/?$'),\r
39         re.compile(r'^https?://openid.aol.com/(?P<uname>\w+(\.\w+)*)/?$'),\r
40         re.compile(r'^https?://(?P<uname>\w+(\.\w+)*).myopenid.com/?$'),\r
41         re.compile(r'^https?://flickr.com/(\w+/)*(?P<uname>\w+(\.\w+)*)/?$'),\r
42         re.compile(r'^https?://technorati.com/people/technorati/(?P<uname>\w+(\.\w+)*)/?$'),\r
43         re.compile(r'^https?://(?P<uname>\w+(\.\w+)*).wordpress.com/?$'),\r
44         re.compile(r'^https?://(?P<uname>\w+(\.\w+)*).blogspot.com/?$'),\r
45         re.compile(r'^https?://(?P<uname>\w+(\.\w+)*).livejournal.com/?$'),\r
46         re.compile(r'^https?://claimid.com/(?P<uname>\w+(\.\w+)*)/?$'),\r
47         re.compile(r'^https?://(?P<uname>\w+(\.\w+)*).pip.verisignlabs.com/?$'),\r
48         re.compile(r'^https?://getopenid.com/(?P<uname>\w+(\.\w+)*)/?$'),\r
49         re.compile(r'^https?://[\w\.]+/(\w+/)*(?P<uname>\w+(\.\w+)*)/?$'),\r
50         re.compile(r'^https?://(?P<uname>[\w\.]+)/?$'),\r
51         ]\r
52 \r
53 def final_username_attempt(sxu):\r
54     openid = sxu.get('openid', None)\r
55 \r
56     if openid:\r
57         if google_accounts_lookup.search(openid):\r
58             return UnknownGoogleUser(sxu.get('id'))\r
59         if yahoo_accounts_lookup.search(openid):\r
60             return UnknownYahooUser(sxu.get('id'))\r
61 \r
62         for lookup in openid_lookups:\r
63             if lookup.search(openid):\r
64                 return lookup.search(openid).group('uname')\r
65 \r
66     return UnknownUser(sxu.get('id'))\r
67 \r
68 class UnknownUser(object):\r
69     def __init__(self, id):\r
70         self._id = id\r
71 \r
72     def __str__(self):\r
73         return _("user-%(id)s") % {'id': self._id}\r
74 \r
75     def __unicode__(self):\r
76         return self.__str__()\r
77 \r
78     def encode(self, *args):\r
79         return self.__str__()\r
80 \r
81 class UnknownGoogleUser(UnknownUser):\r
82     def __str__(self):\r
83         return _("user-%(id)s (google)") % {'id': self._id}\r
84 \r
85 class UnknownYahooUser(UnknownUser):\r
86     def __str__(self):\r
87         return _("user-%(id)s (yahoo)") % {'id': self._id}\r
88 \r
89 \r
90 class IdMapper(dict):\r
91     def __getitem__(self, key):\r
92         key = int(key)\r
93         return super(IdMapper, self).get(key, 1)\r
94 \r
95     def __setitem__(self, key, value):\r
96         super(IdMapper, self).__setitem__(int(key), int(value))\r
97 \r
98 openidre = re.compile('^https?\:\/\/')\r
99 def userimport(dump, options):\r
100     users = readTable(dump, "Users")\r
101 \r
102     user_by_name = {}\r
103     uidmapper = IdMapper()\r
104     merged_users = []\r
105 \r
106     owneruid = options.get('owneruid', None)\r
107     #check for empty values\r
108     if not owneruid:\r
109         owneruid = None\r
110 \r
111     for sxu in users:\r
112         create = True\r
113 \r
114         if sxu.get('id') == '-1':\r
115             continue\r
116 \r
117         if int(sxu.get('id')) == int(owneruid):\r
118             osqau = orm.User.objects.get(id=1)\r
119             uidmapper[owneruid] = 1\r
120             uidmapper[-1] = 1\r
121             create = False\r
122         else:\r
123             username = sxu.get('displayname',\r
124                                sxu.get('displaynamecleaned', sxu.get('realname', final_username_attempt(sxu))))\r
125 \r
126             if not isinstance(username, UnknownUser) and username in user_by_name:\r
127             #if options.get('mergesimilar', False) and sxu.get('email', 'INVALID') == user_by_name[username].email:\r
128             #    osqau = user_by_name[username]\r
129             #    create = False\r
130             #    uidmapper[sxu.get('id')] = osqau.id\r
131             #else:\r
132                 inc = 1\r
133                 while ("%s %d" % (username, inc)) in user_by_name:\r
134                     inc += 1\r
135 \r
136                 username = "%s %d" % (username, inc)\r
137 \r
138         sxbadges = sxu.get('badgesummary', None)\r
139         badges = {'1':'0', '2':'0', '3':'0'}\r
140 \r
141         if sxbadges:\r
142             badges.update(dict([b.split('=') for b in sxbadges.split()]))\r
143 \r
144         if create:\r
145             osqau = orm.User(\r
146                     id           = sxu.get('id'),\r
147                     username     = unicode(username),\r
148                     password     = '!',\r
149                     email        = sxu.get('email', ''),\r
150                     is_superuser = sxu.get('usertypeid') == '5',\r
151                     is_staff     = sxu.get('usertypeid') == '4',\r
152                     is_active    = True,\r
153                     date_joined  = readTime(sxu.get('creationdate')),\r
154                     last_seen    = readTime(sxu.get('lastaccessdate')),\r
155                     about         = sxu.get('aboutme', ''),\r
156                     date_of_birth = sxu.get('birthday', None) and readTime(sxu['birthday']) or None,\r
157                     email_isvalid = int(sxu.get('usertypeid')) > 2,\r
158                     website       = sxu.get('websiteurl', ''),\r
159                     reputation    = int(sxu.get('reputation')),\r
160                     gold          = int(badges['1']),\r
161                     silver        = int(badges['2']),\r
162                     bronze        = int(badges['3']),\r
163                     real_name     = sxu.get('realname', ''),\r
164                     location      = sxu.get('location', ''),\r
165                     )\r
166 \r
167             osqau.save()\r
168 \r
169             user_joins = orm.Action(\r
170                     action_type = "userjoins",\r
171                     action_date = osqau.date_joined,\r
172                     user = osqau\r
173                     )\r
174             user_joins.save()\r
175 \r
176             rep = orm.ActionRepute(\r
177                     value = 1,\r
178                     user = osqau,\r
179                     date = osqau.date_joined,\r
180                     action = user_joins\r
181                     )\r
182             rep.save()\r
183 \r
184             try:\r
185                 orm.SubscriptionSettings.objects.get(user=osqau)\r
186             except:\r
187                 s = orm.SubscriptionSettings(user=osqau)\r
188                 s.save()\r
189 \r
190             uidmapper[osqau.id] = osqau.id\r
191         else:\r
192             new_about = sxu.get('aboutme', None)\r
193             if new_about and osqau.about != new_about:\r
194                 if osqau.about:\r
195                     osqau.about = "%s\n|\n%s" % (osqau.about, new_about)\r
196                 else:\r
197                     osqau.about = new_about\r
198 \r
199             osqau.username = sxu.get('displayname',\r
200                                      sxu.get('displaynamecleaned', sxu.get('realname', final_username_attempt(sxu))))\r
201             osqau.email = sxu.get('email', '')\r
202             osqau.reputation += int(sxu.get('reputation'))\r
203             osqau.gold += int(badges['1'])\r
204             osqau.silver += int(badges['2'])\r
205             osqau.bronze += int(badges['3'])\r
206 \r
207             osqau.date_joined = readTime(sxu.get('creationdate'))\r
208             osqau.website = sxu.get('websiteurl', '')\r
209             osqau.date_of_birth = sxu.get('birthday', None) and readTime(sxu['birthday']) or None\r
210             osqau.location = sxu.get('location', '')\r
211             osqau.real_name = sxu.get('realname', '')\r
212 \r
213             merged_users.append(osqau.id)\r
214             osqau.save()\r
215 \r
216         user_by_name[osqau.username] = osqau\r
217 \r
218         openid = sxu.get('openid', None)\r
219         if openid and openidre.match(openid):\r
220             assoc = orm.AuthKeyUserAssociation(user=osqau, key=openid, provider="openidurl")\r
221             assoc.save()\r
222 \r
223     if uidmapper[-1] == -1:\r
224         uidmapper[-1] = 1\r
225 \r
226     return (uidmapper, merged_users)\r
227 \r
228 def tagsimport(dump, uidmap):\r
229     tags = readTable(dump, "Tags")\r
230 \r
231     tagmap = {}\r
232 \r
233     for sxtag in tags:\r
234         otag = orm.Tag(\r
235                 id = int(sxtag['id']),\r
236                 name = sxtag['name'],\r
237                 used_count = int(sxtag['count']),\r
238                 created_by_id = uidmap[sxtag.get('userid', 1)],\r
239                 )\r
240         otag.save()\r
241 \r
242         tagmap[otag.name] = otag\r
243 \r
244     return tagmap\r
245 \r
246 def add_post_state(name, post, action):\r
247     if not "(%s)" % name in post.state_string:\r
248         post.state_string = "%s(%s)" % (post.state_string, name)\r
249         post.save()\r
250 \r
251     try:\r
252         state = orm.NodeState.objects.get(node=post, state_type=name)\r
253         state.action = action\r
254         state.save()\r
255     except:\r
256         state = orm.NodeState(node=post, state_type=name, action=action)\r
257         state.save()\r
258 \r
259 def remove_post_state(name, post):\r
260     if "(%s)" % name in post.state_string:\r
261         try:\r
262             state = orm.NodeState.objects.get(state_type=name, post=post)\r
263             state.delete()\r
264         except:\r
265             pass\r
266     post.state_string = "".join("(%s)" % s for s in re.findall('\w+', post.state_string) if s != name)\r
267 \r
268 def postimport(dump, uidmap, tagmap):\r
269     history = {}\r
270     accepted = {}\r
271     all = {}\r
272 \r
273     for h in readTable(dump, "PostHistory"):\r
274         if not history.get(h.get('postid'), None):\r
275             history[h.get('postid')] = []\r
276 \r
277         history[h.get('postid')].append(h)\r
278 \r
279     posts = readTable(dump, "Posts")\r
280 \r
281     for sxpost in posts:\r
282         nodetype = (sxpost.get('posttypeid') == '1') and "nodetype" or "answer"\r
283 \r
284         post = orm.Node(\r
285                 node_type = nodetype,\r
286                 id = sxpost['id'],\r
287                 added_at = readTime(sxpost['creationdate']),\r
288                 body = sxpost['body'],\r
289                 score = sxpost.get('score', 0),\r
290                 author_id = sxpost.get('deletiondate', None) and 1 or uidmap[sxpost.get('owneruserid', 1)]\r
291                 )\r
292 \r
293         post.save()\r
294 \r
295         create_action = orm.Action(\r
296                 action_type = (nodetype == "nodetype") and "ask" or "answer",\r
297                 user_id = post.author_id,\r
298                 node = post,\r
299                 action_date = post.added_at\r
300                 )\r
301 \r
302         create_action.save()\r
303 \r
304         if sxpost.get('lasteditoruserid', None):\r
305             revise_action = orm.Action(\r
306                     action_type = "revise",\r
307                     user_id = uidmap[sxpost.get('lasteditoruserid')],\r
308                     node = post,\r
309                     action_date = readTime(sxpost['lasteditdate']),\r
310                     )\r
311 \r
312             revise_action.save()\r
313             post.last_edited = revise_action\r
314 \r
315         if sxpost.get('communityowneddate', None):\r
316             wikify_action = orm.Action(\r
317                     action_type = "wikify",\r
318                     user_id = 1,\r
319                     node = post,\r
320                     action_date = readTime(sxpost['communityowneddate'])\r
321                     )\r
322 \r
323             wikify_action.save()\r
324             add_post_state("wiki", post, wikify_action)\r
325 \r
326         if sxpost.get('lastactivityuserid', None):\r
327             post.last_activity_by_id = uidmap[sxpost['lastactivityuserid']]\r
328             post.last_activity_at = readTime(sxpost['lastactivitydate'])\r
329 \r
330         if sxpost.get('posttypeid') == '1': #question\r
331             post.node_type = "question"\r
332             post.title = sxpost['title']\r
333 \r
334             tagnames = sxpost['tags'].replace(u'ö', '-').replace(u'é', '').replace(u'à', '')\r
335             post.tagnames = tagnames\r
336 \r
337             post.extra_count = sxpost.get('viewcount', 0)\r
338 \r
339         else:\r
340             post.parent_id = sxpost['parentid']\r
341 \r
342         post.save()\r
343 \r
344         all[int(post.id)] = post\r
345 \r
346     return all\r
347 \r
348 def comment_import(dump, uidmap, posts):\r
349     comments = readTable(dump, "PostComments")\r
350     currid = max(posts.keys())\r
351     mapping = {}\r
352 \r
353     for sxc in comments:\r
354         currid += 1\r
355         oc = orm.Node(\r
356                 id = currid,\r
357                 node_type = "comment",\r
358                 added_at = readTime(sxc['creationdate']),\r
359                 author_id = uidmap[sxc.get('userid', 1)],\r
360                 body = sxc['text'],\r
361                 parent_id = sxc.get('postid'),\r
362                 )\r
363 \r
364         if sxc.get('deletiondate', None):\r
365             delete_action = orm.Action(\r
366                     action_type = "delete",\r
367                     user_id = uidmap[sxc['deletionuserid']],\r
368                     action_date = readTime(sxc['deletiondate'])\r
369                     )\r
370 \r
371             oc.author_id = uidmap[sxc['deletionuserid']]\r
372             oc.save()\r
373 \r
374             delete_action.node = oc\r
375             delete_action.save()\r
376 \r
377             add_post_state("deleted", oc, delete_action)\r
378         else:\r
379             oc.author_id = uidmap[sxc.get('userid', 1)]\r
380             oc.save()\r
381 \r
382         create_action = orm.Action(\r
383                 action_type = "comment",\r
384                 user_id = oc.author_id,\r
385                 node = oc,\r
386                 action_date = oc.added_at\r
387                 )\r
388 \r
389         create_action.save()\r
390         oc.save()\r
391 \r
392         posts[oc.id] = oc\r
393         mapping[int(sxc['id'])] = int(oc.id)\r
394 \r
395     return posts, mapping\r
396 \r
397 \r
398 def add_tags_to_posts(posts, tagmap):\r
399     for post in posts.values():\r
400         if post.node_type == "question":\r
401             tags = [tag for tag in [tagmap.get(name.strip()) for name in post.tagnames.split(u' ') if name] if tag]\r
402             post.tagnames = " ".join([t.name for t in tags]).strip()\r
403             post.tags = tags\r
404 \r
405         create_and_activate_revision(post)\r
406 \r
407 \r
408 def create_and_activate_revision(post):\r
409     rev = orm.NodeRevision(\r
410             author_id = post.author_id,\r
411             body = post.body,\r
412             node_id = post.id,\r
413             revised_at = post.added_at,\r
414             revision = 1,\r
415             summary = 'Initial revision',\r
416             tagnames = post.tagnames,\r
417             title = post.title,\r
418             )\r
419 \r
420     rev.save()\r
421     post.active_revision_id = rev.id\r
422     post.save()\r
423 \r
424 def post_vote_import(dump, uidmap, posts):\r
425     votes = readTable(dump, "Posts2Votes")\r
426     close_reasons = dict([(r['id'], r['name']) for r in readTable(dump, "CloseReasons")])\r
427 \r
428     user2vote = []\r
429 \r
430     for sxv in votes:\r
431         action = orm.Action(\r
432                 user_id=uidmap[sxv['userid']],\r
433                 action_date = readTime(sxv['creationdate']),\r
434                 )\r
435 \r
436         node = posts.get(int(sxv['postid']), None)\r
437         if not node: continue\r
438         action.node = node\r
439 \r
440         if sxv['votetypeid'] == '1':\r
441             answer = node\r
442             question = posts.get(int(answer.parent_id), None)\r
443 \r
444             action.action_type = "acceptanswer"\r
445             action.save()\r
446 \r
447             answer.marked = True\r
448 \r
449             question.extra_ref_id = answer.id\r
450 \r
451             answer.save()\r
452             question.save()\r
453 \r
454         elif sxv['votetypeid'] in ('2', '3'):\r
455             if not (action.node.id, action.user_id) in user2vote:\r
456                 user2vote.append((action.node.id, action.user_id))\r
457 \r
458                 action.action_type = (sxv['votetypeid'] == '2') and "voteup" or "votedown"\r
459                 action.save()\r
460 \r
461                 ov = orm.Vote(\r
462                         node_id = action.node.id,\r
463                         user_id = action.user_id,\r
464                         voted_at = action.action_date,\r
465                         value = sxv['votetypeid'] == '2' and 1 or -1,\r
466                         action = action\r
467                         )\r
468                 ov.save()\r
469             else:\r
470                 action.action_type = "unknown"\r
471                 action.save()\r
472 \r
473         elif sxv['votetypeid'] in ('4', '12', '13'):\r
474             action.action_type = "flag"\r
475             action.save()\r
476 \r
477             of = orm.Flag(\r
478                     node = action.node,\r
479                     user_id = action.user_id,\r
480                     flagged_at = action.action_date,\r
481                     reason = '',\r
482                     action = action\r
483                     )\r
484 \r
485             of.save()\r
486 \r
487         elif sxv['votetypeid'] == '5':\r
488             action.action_type = "favorite"\r
489             action.save()\r
490 \r
491         elif sxv['votetypeid'] == '6':\r
492             action.action_type = "close"\r
493             action.extra = dbsafe_encode(close_reasons[sxv['comment']])\r
494             action.save()\r
495 \r
496             node.marked = True\r
497             node.save()\r
498 \r
499         elif sxv['votetypeid'] == '7':\r
500             action.action_type = "unknown"\r
501             action.save()\r
502 \r
503             node.marked = False\r
504             node.save()\r
505 \r
506             remove_post_state("closed", node)\r
507 \r
508         elif sxv['votetypeid'] == '10':\r
509             action.action_type = "delete"\r
510             action.save()\r
511 \r
512         elif sxv['votetypeid'] == '11':\r
513             action.action_type = "unknown"\r
514             action.save()\r
515 \r
516             remove_post_state("deleted", node)\r
517 \r
518         else:\r
519             action.action_type = "unknown"\r
520             action.save()\r
521 \r
522         if sxv.get('targetrepchange', None):\r
523             rep = orm.ActionRepute(\r
524                     action = action,\r
525                     date = action.action_date,\r
526                     user_id = uidmap[sxv['targetuserid']],\r
527                     value = int(sxv['targetrepchange'])\r
528                     )\r
529 \r
530             rep.save()\r
531 \r
532         if sxv.get('voterrepchange', None):\r
533             rep = orm.ActionRepute(\r
534                     action = action,\r
535                     date = action.action_date,\r
536                     user_id = uidmap[sxv['userid']],\r
537                     value = int(sxv['voterrepchange'])\r
538                     )\r
539 \r
540             rep.save()\r
541 \r
542         if action.action_type in ("acceptanswer", "delete", "close"):\r
543             state = {"acceptanswer": "accepted", "delete": "deleted", "close": "closed"}[action.action_type]\r
544             add_post_state(state, node, action)\r
545 \r
546 \r
547 def comment_vote_import(dump, uidmap, comments, posts):\r
548     votes = readTable(dump, "Comments2Votes")\r
549     user2vote = []\r
550 \r
551     for sxv in votes:\r
552         if sxv['votetypeid'] == "2":\r
553             comment_id = comments[int(sxv['postcommentid'])]\r
554             user_id = uidmap[sxv['userid']]\r
555 \r
556             if not (comment_id, user_id) in user2vote:\r
557                 user2vote.append((comment_id, user_id))\r
558 \r
559                 action = orm.Action(\r
560                         action_type = "voteupcomment",\r
561                         user_id = user_id,\r
562                         action_date = readTime(sxv['creationdate']),\r
563                         node_id = comment_id\r
564                         )\r
565                 action.save()\r
566 \r
567                 ov = orm.Vote(\r
568                         node_id = comment_id,\r
569                         user_id = user_id,\r
570                         voted_at = action.action_date,\r
571                         value = 1,\r
572                         action = action\r
573                         )\r
574 \r
575                 ov.save()\r
576 \r
577                 posts[int(action.node_id)].score += 1\r
578                 posts[int(action.node_id)].save()\r
579 \r
580 \r
581 def badges_import(dump, uidmap, post_list):\r
582     node_ctype = orm['contenttypes.contenttype'].objects.get(name='node')\r
583     obadges = dict([(b.cls, b) for b in orm.Badge.objects.all()])\r
584     sxbadges = dict([(int(b['id']), b) for b in readTable(dump, "Badges")])\r
585     user_badge_count = {}\r
586 \r
587     sx_to_osqa = {}\r
588 \r
589     for id, sxb in sxbadges.items():\r
590         cls = "".join(sxb['name'].replace('&', 'And').split(' '))\r
591 \r
592         if cls in obadges:\r
593             sx_to_osqa[id] = obadges[cls]\r
594         else:\r
595             osqab = orm.Badge(\r
596                     cls = cls,\r
597                     awarded_count = 0,\r
598                     type = sxb['class']\r
599                     )\r
600             osqab.save()\r
601             sx_to_osqa[id] = osqab\r
602 \r
603     sxawards = readTable(dump, "Users2Badges")\r
604     osqaawards = []\r
605 \r
606     for sxa in sxawards:\r
607         badge = sx_to_osqa[int(sxa['badgeid'])]\r
608 \r
609         user_id = uidmap[sxa['userid']]\r
610         if not user_badge_count.get(user_id, None):\r
611             user_badge_count[user_id] = 0\r
612 \r
613         action = orm.Action(\r
614                 action_type = "award",\r
615                 user_id = user_id,\r
616                 action_date = readTime(sxa['date'])\r
617                 )\r
618 \r
619         action.save()\r
620 \r
621         osqaa = orm.Award(\r
622                 user_id = uidmap[sxa['userid']],\r
623                 badge = badge,\r
624                 node = post_list[user_badge_count[user_id]],\r
625                 awarded_at = action.action_date,\r
626                 action = action\r
627                 )\r
628 \r
629         osqaa.save()\r
630         badge.awarded_count += 1\r
631         user_badge_count[user_id] += 1\r
632 \r
633     for badge in obadges.values():\r
634         badge.save()\r
635 \r
636 \r
637 def reset_sequences():\r
638     from south.db import db\r
639     if db.backend_name == "postgres":\r
640         db.start_transaction()\r
641         db.execute_many(PG_SEQUENCE_RESETS)\r
642         db.commit_transaction()\r
643 \r
644 def sximport(dump, options):\r
645     uidmap, merged_users = userimport(dump, options)\r
646     tagmap = tagsimport(dump, uidmap)\r
647     posts = postimport(dump, uidmap, tagmap)\r
648     posts, comments = comment_import(dump, uidmap, posts)\r
649     add_tags_to_posts(posts, tagmap)\r
650     post_vote_import(dump, uidmap, posts)\r
651     comment_vote_import(dump, uidmap, comments, posts)\r
652     badges_import(dump, uidmap, posts.values())\r
653 \r
654     from south.db import db\r
655     db.commit_transaction()\r
656 \r
657     reset_sequences()\r
658 \r
659 \r
660 PG_SEQUENCE_RESETS = """\r
661 SELECT setval('"auth_user_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "auth_user";\r
662 SELECT setval('"auth_user_groups_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "auth_user_groups";\r
663 SELECT setval('"auth_user_user_permissions_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "auth_user_user_permissions";\r
664 SELECT setval('"forum_keyvalue_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_keyvalue";\r
665 SELECT setval('"forum_action_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_action";\r
666 SELECT setval('"forum_actionrepute_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_actionrepute";\r
667 SELECT setval('"forum_subscriptionsettings_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_subscriptionsettings";\r
668 SELECT setval('"forum_validationhash_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_validationhash";\r
669 SELECT setval('"forum_authkeyuserassociation_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_authkeyuserassociation";\r
670 SELECT setval('"forum_tag_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_tag";\r
671 SELECT setval('"forum_markedtag_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_markedtag";\r
672 SELECT setval('"forum_node_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_node";\r
673 SELECT setval('"forum_nodestate_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_nodestate";\r
674 SELECT setval('"forum_node_tags_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_node_tags";\r
675 SELECT setval('"forum_noderevision_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_noderevision";\r
676 SELECT setval('"forum_node_tags_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_node_tags";\r
677 SELECT setval('"forum_questionsubscription_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_questionsubscription";\r
678 SELECT setval('"forum_node_tags_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_node_tags";\r
679 SELECT setval('"forum_node_tags_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_node_tags";\r
680 SELECT setval('"forum_vote_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_vote";\r
681 SELECT setval('"forum_flag_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_flag";\r
682 SELECT setval('"forum_badge_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_badge";\r
683 SELECT setval('"forum_award_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_award";\r
684 SELECT setval('"forum_openidnonce_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_openidnonce";\r
685 SELECT setval('"forum_openidassociation_id_seq"', coalesce(max("id"), 1) + 2, max("id") IS NOT null) FROM "forum_openidassociation";\r
686 """\r
687 \r
688 \r
689     \r
690