qmsk_www_pages/pages.py
changeset 202 da5de3a97efb
parent 201 edcbbc94f90d
child 68 023b9a9d6c76
--- a/qmsk_www_pages/pages.py	Sun Sep 14 01:45:17 2014 +0300
+++ b/qmsk_www_pages/pages.py	Sun Sep 14 02:15:25 2014 +0300
@@ -1,15 +1,28 @@
 from django.conf import settings
 
 import codecs
+import datetime
 import logging; log = logging.getLogger('qmsk_www_pages.pages')
 import os, os.path
 
+class Site (object):
+    @classmethod
+    def lookup (cls):
+        return cls(
+            root        = settings.QMSK_WWW_PAGES_DIR,
+            name        = settings.QMSK_WWW_PAGES_SITE,
+        )
+
+    def __init__ (self, root, name):
+        self.root = root
+        self.name = name
+
 class Tree (object):
     INDEX = 'index'
 
     @classmethod
-    def lookup (cls, parts):
-        path = settings.QMSK_WWW_PAGES_DIR
+    def lookup (cls, site, parts):
+        path = site.root
 
         for part in parts:
             if part.startswith('.'):
@@ -27,12 +40,12 @@
             if not os.path.isdir(path):
                 return None
         
-        return cls(path, parts)
+        return cls(path, parts, site)
 
-    def __init__ (self, path, parts):
+    def __init__ (self, path, parts, site):
         self.path = path
         self.parts = parts
-
+        self.site = site
 
     def url (self, tree=None, page=None):
         path = '/'.join(self.parts)
@@ -51,7 +64,7 @@
     def breadcrumb (self):
         path = []
 
-        yield '', 'Home'
+        yield '', self.site.name
 
         for part in self.parts:
             path.append(part)
@@ -88,7 +101,7 @@
         for path, file_name, file_type in self.scan():
             # trees
             if os.path.isdir(path):
-                yield self.url(tree=file_name), file_name
+                yield self.url(tree=file_name), file_name, None
 
             if file_name == self.INDEX:
                 continue
@@ -100,7 +113,7 @@
             if file_type not in TYPES:
                 continue
             
-            yield self.url(page=file_name), file_name
+            yield self.url(page=file_name), file_name, file_type
 
     def page (self, name):
         """
@@ -137,7 +150,7 @@
     ENCODING = 'utf-8'
 
     @classmethod
-    def lookup (cls, page):
+    def lookup (cls, site, page):
         """
             Lookup a Page from disk.
 
@@ -159,7 +172,7 @@
             tree_parts = []
 
         # scan dir
-        tree = Tree.lookup(tree_parts)
+        tree = Tree.lookup(site, tree_parts)
 
         if not tree:
             return None
@@ -184,6 +197,9 @@
     def open (self):
         return codecs.open(self.path, encoding=self.encoding)
 
+    def stat (self):
+        return os.stat(self.path)
+
     def breadcrumb (self):
         for path, name in self.tree.breadcrumb():
             yield path, name
@@ -191,6 +207,9 @@
         if self.name != self.tree.INDEX:
             yield self.url(), self.name
 
+    def modified (self):
+        return datetime.datetime.utcfromtimestamp(self.stat().st_mtime)
+
     def render (self, request):
         raise NotImplementedError()
 
@@ -198,6 +217,12 @@
     def render (self, request):
         return self.open().read()
 
+SITE = Site.lookup()
+
 TYPES = {
     'html':         HTML_Page,
 }
+
+def page (page):
+    return Page.lookup(SITE, page)
+