qmsk_www_pages/pages.py
changeset 63 468a152ad623
parent 62 a2f29d787bea
child 64 295ba0fb02b5
--- a/qmsk_www_pages/pages.py	Sun Sep 14 01:17:41 2014 +0300
+++ b/qmsk_www_pages/pages.py	Sun Sep 14 01:37:10 2014 +0300
@@ -5,6 +5,8 @@
 import os, os.path
 
 class Tree (object):
+    INDEX = 'index'
+
     @classmethod
     def lookup (cls, parts):
         path = settings.QMSK_WWW_PAGES_DIR
@@ -31,37 +33,90 @@
         self.path = path
         self.parts = parts
 
+
+    def url (self, tree=None, page=None):
+        path = '/'.join(self.parts)
+
+        if path:
+            path += '/'
+
+        if tree:
+            path = tree + '/'
+
+        if page:
+            path += page
+
+        return path
+
+    def scan (self):
+        """
+            Scan for files in tree.
+        """
+
+        for filename in os.listdir(self.path):
+            if filename.startswith('.'):
+                continue
+            
+            if '.' in filename:
+                file_name, file_type = filename.rsplit('.', 1)
+            else:
+                file_name = filename
+                file_type = None
+
+            if not file_name:
+                continue
+
+            path = os.path.join(self.path, filename)
+            
+            yield path, file_name, file_type
+
+    def list (self):
+        """
+            Lists all Trees and Pages for this Tree
+        """
+        
+        for path, file_name, file_type in self.scan():
+            # trees
+            if os.path.isdir(path):
+                yield self.url(tree=file_name), file_name
+
+            if file_name == self.INDEX:
+                continue
+            
+            # pages
+            if not file_type:
+                continue
+
+            if file_type not in TYPES:
+                continue
+            
+            yield self.url(page=file_name), file_name
+
     def page (self, name):
         """
             Scans through tree looking for a matching page.
             
             Returns Page.
         """
-
-        page_type = None
+        
+        if not name:
+            name = self.INDEX
 
-        for filename in os.listdir(self.path):
-            if filename.startswith('.'):
-                continue
-            
-            if '.' not in filename:
-                continue
-
-            file_name, file_type = filename.rsplit('.', 1)
-            path = os.path.join(self.path, filename)
-
-            if not file_name:
-                continue
-
+        for path, file_name, file_type in self.scan():
+            # match on name
             if file_name != name:
                 continue
             
-            # page_name matches
+            # match on type
+            if not file_type:
+                continue
+
             page_type = TYPES.get(file_type)
 
             if not page_type:
                 continue
-
+            
+            # out
             return page_type(
                 path    = path,
                 name    = name,
@@ -93,9 +148,6 @@
             page_name = ''
             tree_parts = []
 
-        if not page_name:
-            page_name = 'index'
-
         # scan dir
         tree = Tree.lookup(tree_parts)
 
@@ -122,10 +174,17 @@
     def breadcrumb (self):
         path = []
 
-        for part in self.tree.parts + [ self.name ]:
+        yield '', 'Home'
+
+        for part in self.tree.parts:
             path.append(part)
 
-            yield '/'.join(path), part
+            yield '/'.join(path) + '/', part
+        
+        if self.name != self.tree.INDEX:
+            path.append(self.name)
+
+            yield '/'.join(path), self.name
 
     def render (self, request):
         raise NotImplementedError()