diff core/management/commands/make_flatpage.py @ 584:ef4ef8c8ec8d

For bitbucket issue #8, insert .rst files into flatpages.
author Brian Neal <bgneal@gmail.com>
date Thu, 10 May 2012 20:03:26 -0500
parents
children 7ed2101df789
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/management/commands/make_flatpage.py	Thu May 10 20:03:26 2012 -0500
@@ -0,0 +1,80 @@
+"""make_flatpage.py
+
+A management command to update flatpage objects from restructured text files.
+
+"""
+import os.path
+
+import docutils.core
+from django.core.management.base import LabelCommand, CommandError
+from django.conf import settings
+from django.template.loader import render_to_string
+from django.template import TemplateDoesNotExist
+from django.contrib.flatpages.models import FlatPage
+
+
+class Command(LabelCommand):
+    help = "Update flatpage objects from restructured text files"
+    args = "<inputfile1> <inputfile2> ... | all"
+
+    def handle_label(self, filename, **kwargs):
+        """Process input file(s)"""
+
+        if not hasattr(settings, 'GPP_FLATPAGES'):
+            raise CommandError("Please add a GPP_FLATPAGES setting")
+        if not hasattr(settings, 'PROJECT_PATH'):
+            raise CommandError("Please add a PROJECT_PATH setting")
+
+        self.config = settings.GPP_FLATPAGES
+        self.src_dir = os.path.join(settings.PROJECT_PATH, 'flatpages')
+
+        if filename == 'all':
+            files = self.config.keys()
+        else:
+            files = [filename]
+
+        for f in files:
+            self.process_flatpage(f)
+
+
+    def process_flatpage(self, filename):
+        """Processes one flatpage"""
+
+        if filename not in self.config:
+            raise CommandError("No entry in GPP_FLATPAGES for %s" % filename)
+        url, template_name = self.config[filename]
+
+        # retrieve source text
+        src_path = os.path.join(self.src_dir, filename)
+        with open(src_path, 'r') as f:
+            src_text = f.read()
+
+        # transform text
+        content = self.transform_input(src_text)
+
+        # render through a template if requested
+        if template_name is not None:
+            try:
+                content = render_to_string(template_name, dict(content=content))
+            except TemplateDoesNotExist:
+                raise CommandError("template not found: %s" % template_name)
+
+        # update the flatpage object
+        try:
+            obj = FlatPage.objects.get(url=url)
+        except FlatPage.DoesNotExist:
+            raise CommandError("flatpage not found: %s" % url)
+
+        obj.content = content;
+        obj.save()
+
+        self.stdout.write("%s -> %s\n" % (filename, url))
+
+    def transform_input(self, src_text):
+        """Transforms input restructured text to HTML"""
+
+        return docutils.core.publish_parts(src_text, writer_name='html',
+                settings_overrides={
+                    'doctitle_xform': False,
+                    'initial_header_level': 3,
+                    })['html_body']