qmsk_www_pages/pages.py
changeset 217 26df557482d8
parent 215 d72e797a8977
child 85 aa437984ddc5
--- 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()