comparison legacy/management/commands/import_old_topics.py @ 581:ee87ea74d46b

For Django 1.4, rearranged project structure for new manage.py.
author Brian Neal <bgneal@gmail.com>
date Sat, 05 May 2012 17:10:48 -0500
parents gpp/legacy/management/commands/import_old_topics.py@254db4cb6a86
children
comparison
equal deleted inserted replaced
580:c525f3e0b5d0 581:ee87ea74d46b
1 """
2 import_old_topics.py - For importing forum topics (threads) from SG101 1.0 as
3 csv files.
4
5 """
6 from __future__ import with_statement
7 import csv
8 import optparse
9 import sys
10 from datetime import datetime
11
12 from django.core.management.base import LabelCommand, CommandError
13 from django.contrib.auth.models import User
14
15 from forums.models import Forum, Topic
16 from legacy.phpbb import unescape
17
18
19 class Command(LabelCommand):
20 args = '<filename filename ...>'
21 help = 'Imports forum topics from the old database in CSV format'
22 option_list = LabelCommand.option_list + (
23 optparse.make_option("-p", "--progress", action="store_true",
24 help="Output a . after every 20 topics to show progress"),
25 )
26
27 def handle_label(self, filename, **options):
28 """
29 Process each line in the CSV file given by filename by
30 creating a new topic.
31
32 """
33 self.show_progress = options.get('progress')
34 self.users = {}
35
36 # Create a mapping from the old database's forums to our
37 # forums
38 self.forums = {}
39 try:
40 self.forums[2] = Forum.objects.get(slug='suggestion-box')
41 self.forums[3] = Forum.objects.get(slug='surf-music')
42 self.forums[4] = Forum.objects.get(slug='surf-musician')
43 self.forums[5] = Forum.objects.get(slug='gear')
44 self.forums[6] = Forum.objects.get(slug='recording-corner')
45 self.forums[7] = Forum.objects.get(slug='shallow-end')
46 self.forums[8] = Forum.objects.get(slug='surfguitar101-website')
47 self.forums[9] = Forum.objects.get(id=15)
48 self.forums[10] = Forum.objects.get(slug='for-sale-trade')
49 self.forums[11] = Forum.objects.get(slug='musicians-gigs-wanted')
50 self.forums[12] = Forum.objects.get(slug='surf-videos')
51 self.forums[13] = Forum.objects.get(slug='sg101-podcast')
52 self.forums[14] = Forum.objects.get(slug='gigs')
53 self.forums[15] = Forum.objects.get(slug='music-reviews')
54 self.forums[18] = Forum.objects.get(slug='best-sg101')
55 except Forum.DoesNotExist:
56 sys.exit("Forum does not exist; check forum mapping.")
57
58 try:
59 with open(filename, "rb") as f:
60 self.reader = csv.DictReader(f)
61 num_rows = 0
62 try:
63 for row in self.reader:
64 self.process_row(row)
65 num_rows += 1
66 if self.show_progress and num_rows % 20 == 0:
67 sys.stdout.write('.')
68 sys.stdout.flush()
69 except csv.Error, e:
70 raise CommandError("CSV error: %s %s %s" % (
71 filename, self.reader.line_num, e))
72
73 print
74
75 except IOError:
76 raise CommandError("Could not open file: %s" % filename)
77
78 def process_row(self, row):
79 """
80 Process one row from the CSV file: create a Story object for
81 the row and save it in the database.
82
83 """
84 row = dict((k, v if v != 'NULL' else '') for k, v in row.iteritems())
85
86 if row['topic_moved_id'] != '0':
87 return
88
89 try:
90 user = User.objects.get(id=int(row['topic_poster']))
91 except User.DoesNotExist:
92 print "Could not find user %s for topic %s; skipping." % (
93 row['topic_poster'], row['topic_id'])
94 return
95
96 creation_date = datetime.fromtimestamp(float(row['topic_time']))
97
98 title = row['topic_title'].decode('latin-1', 'replace')
99
100 try:
101 forum = self.forums[int(row['forum_id'])]
102 except KeyError:
103 print 'skipping topic "%s"' % title
104 return
105
106 topic = Topic(id=int(row['topic_id']),
107 forum=forum,
108 name=unescape(title),
109 creation_date=creation_date,
110 user=user,
111 view_count=int(row['topic_views']),
112 sticky=(int(row['topic_type']) != 0),
113 locked=(int(row['topic_status']) != 0),
114 update_date=creation_date)
115
116 topic.save()
117