qmsk_www_pages/pages.py
changeset 60 bd9cea0b5b11
child 61 308b2e3dfd6a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qmsk_www_pages/pages.py	Sun Sep 14 00:59:07 2014 +0300
@@ -0,0 +1,101 @@
+from django.conf import settings
+
+import codecs
+import logging; log = logging.getLogger('qmsk_www_pages.pages')
+import os, os.path
+
+class Page (object):
+    ENCODING = 'utf-8'
+
+    @classmethod
+    def lookup (cls, page):
+        """
+            Lookup a Page from disk.
+
+            Returns None if there is no such page.
+        """
+        
+        log.info("page=%r", page)
+
+        root = settings.QMSK_WWW_PAGES_DIR
+
+        if page:
+            parts = page.split('/')
+        else:
+            parts = [ ]
+            
+        if parts:
+            page_name = parts.pop(-1)
+        else:
+            page_name = ''
+
+        if not page_name:
+            page_name = 'index'
+
+        # scan dir
+        dirpath = root
+
+        for part in parts:
+            if part.startswith('.'):
+                # evil
+                return None
+            
+            if not part:
+                continue
+        
+            dirpath = os.path.join(dirpath, part)
+
+            if not os.path.exists(dirpath):
+                return None
+            
+            if not os.path.isdir(dirpath):
+                return None
+
+        # scan for page
+        page_type = None
+
+        for filename in os.listdir(dirpath):
+            if filename.startswith('.'):
+                continue
+            
+            if '.' not in filename:
+                continue
+
+            file_name, file_type = filename.rsplit('.', 1)
+            page_path = os.path.join(dirpath, filename)
+
+            if not file_name:
+                continue
+
+            if file_name != page_name:
+                continue
+            
+            # page_name matches
+            page_type = TYPES.get(file_type)
+
+            if page_type:
+                break
+
+        if not page_type:
+            return None
+
+        return page_type(page_path, page_name)
+
+    def __init__ (self, path, name, encoding=ENCODING):
+        self.path = path
+        self.name = name
+        self.encoding = encoding
+
+    def open (self):
+        return codecs.open(self.path, encoding=self.encoding)
+
+    def render (self, request):
+        raise NotImplementedError()
+
+class HTML_Page (Page):
+    def render (self, request):
+        return self.open().read()
+
+TYPES = {
+    'html':         HTML_Page,
+}