--- 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()