Mercurial > public > sg101
diff forums/management/commands/topic_export.py @ 646:73eb098761a1
Implement mgmt command to export forum topic. BB issue #36.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Sat, 23 Mar 2013 13:18:08 -0500 |
parents | |
children | 2a4e2e86c65e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/forums/management/commands/topic_export.py Sat Mar 23 13:18:08 2013 -0500 @@ -0,0 +1,67 @@ +""" +topic_export.py + +A management command to export a forum topic by rendering it through a given +template. + +""" +from optparse import make_option +import re + +from django.core.management.base import LabelCommand, CommandError +from django.template.loader import render_to_string, TemplateDoesNotExist + +from forums.models import Topic + + +SRC_RE = re.compile(r'src="/media/') +SRC_REPL = 'src="http://surfguitar101.com/media/' + + +class Command(LabelCommand): + help = "Exports a forum topic thread by rendering it through a given template" + option_list = LabelCommand.option_list + ( + make_option('-t', '--template', + default='forums/topic_export.html', + help='template to render'), + make_option('-o', '--output', + default=None, + help='output filename [default: stdout]'), + ) + + def handle_label(self, tid, **opts): + """Fetch the topic and related posts. Render through a template. + Optionally write content to an output file. + + """ + try: + tid = int(tid) + except ValueError: + raise CommandError('topic ID must be an integer') + + template_name = opts['template'] + output_filename = opts['output'] + + try: + topic = Topic.objects.get(pk=tid) + except Topic.DoesNotExist: + raise CommandError('topic ID does not exist') + + posts = topic.posts.select_related(depth=1) + + try: + content = render_to_string(template_name, {'topic': topic, 'posts': + posts}) + except TemplateDoesNotExist: + raise CommandError('template does not exist') + + # fix up smiley images + content = SRC_RE.sub(SRC_REPL, content) + + content = content.encode('utf-8') + + if output_filename: + with open(output_filename, 'w') as fp: + fp.write(content) + else: + self.stdout.write(content)