qmsk_www_pages: symlink support for page redirects
authorTero Marttila <terom@paivola.fi>
Sun, 14 Sep 2014 04:58:01 +0300
changeset 217 26df557482d8
parent 216 e89e3f3a60db
child 218 07b177a6d07c
qmsk_www_pages: symlink support for page redirects
qmsk_www_pages/pages.py
qmsk_www_pages/views.py
--- a/qmsk_www_pages/pages.py	Sun Sep 14 04:42:01 2014 +0300
+++ b/qmsk_www_pages/pages.py	Sun Sep 14 04:58:01 2014 +0300
@@ -181,10 +181,26 @@
         else:
             title_default = None
 
+        parents = self.parents + (self, )
+
         for path, file_name, file_type in self.scan():
             # match on name
-            if file_name != name:
+            if file_name != name and (file_name + '.' + file_type != name):
                 continue
+
+            # redirects?
+            if os.path.islink(path):
+                target = os.readlink(path)
+            
+                # XXX: this should be some kind of common code
+                if '.' in target:
+                    target, target_type = target.rsplit('.', 1)
+
+                log.info("%s: %s -> %s", self, name, target)
+
+                return RedirectPage(path, name, self, parents,
+                    target  = target,
+                )
             
             # match on type
             if not file_type:
@@ -198,12 +214,7 @@
             # out
             title = self.item_title(file_name) or title_default
 
-            return page_type(
-                path    = path,
-                name    = name,
-                tree    = self,
-                parents = self.parents + (self, ),
-
+            return page_type(path, name, self, parents,
                 title   = title,
             )
 
@@ -286,11 +297,27 @@
     def modified (self):
         return datetime.datetime.utcfromtimestamp(self.stat().st_mtime)
 
-    def render (self, request):
+    def redirect_page (self, request):
+        return None
+    
+    def render_html (self, request):
         raise NotImplementedError()
 
+# TODO: tree redirects
+class RedirectPage (Page):
+    def __init__ (self, path, name, tree, parents,
+            target,
+            **opts
+    ) :
+        super(RedirectPage, self).__init__(path, name, tree, parents, **opts)
+
+        self.target = target
+
+    def redirect_page (self, request):
+        return os.path.normpath(self.tree.url() + '/' + self.target)
+
 class HTML_Page (Page):
-    def render (self, request):
+    def render_html (self, request):
         return self.open().read()
 
 SITE = Site.lookup()
--- a/qmsk_www_pages/views.py	Sun Sep 14 04:42:01 2014 +0300
+++ b/qmsk_www_pages/views.py	Sun Sep 14 04:58:01 2014 +0300
@@ -1,5 +1,5 @@
 from django.http import Http404
-from django.shortcuts import render
+from django.shortcuts import render, redirect
 
 from qmsk_www_pages import pages
 
@@ -10,12 +10,17 @@
     except pages.NotFound:
         raise Http404
 
+    redirect_page = page.redirect_page(request)
+
+    if redirect_page:
+        return redirect('page', redirect_page)
+
     return render(request, 'pages/page.html', dict(
             site_name       = page.tree.site.name,
             page_name       = page.name,
             page_title      = page.title,
             page_breadcrumb = page.breadcrumb(),
             page_hierarchy  = list(page.hierarchy()),
-            page_html       = page.render(request),
+            page_html       = page.render_html(request),
             page_modified   = page.modified(),
     ))