qmsk_www_pages: pages.Page.lookup() and .html support; logging
authorTero Marttila <terom@paivola.fi>
Sun, 14 Sep 2014 00:59:07 +0300
changeset 60 bd9cea0b5b11
parent 59 c3eaf9fc74a0
child 61 308b2e3dfd6a
qmsk_www_pages: pages.Page.lookup() and .html support; logging
qmsk_www/settings.py
qmsk_www_pages/pages.py
qmsk_www_pages/templates/pages/page.html
qmsk_www_pages/views.py
--- a/qmsk_www/settings.py	Sun Sep 14 00:58:17 2014 +0300
+++ b/qmsk_www/settings.py	Sun Sep 14 00:59:07 2014 +0300
@@ -25,8 +25,6 @@
 ## Application definition
 INSTALLED_APPS = (
     'django.contrib.staticfiles',
-
-    'qmsk_www_pages',
 )
 
 MIDDLEWARE_CLASSES = (
@@ -69,3 +67,34 @@
 TEMPLATE_DIRS = (
     './qmsk_www/templates',
 )
+
+## Logging
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': False,
+    'formatters': {
+        'qmsk': {
+            'format': '[%(levelname)5s] %(module)20s:%(funcName)-20s : %(message)s',
+        },
+    },
+    'handlers': {
+        'console': {
+            'level':        'DEBUG',
+            'class':        'logging.StreamHandler',
+            'formatter':    'qmsk',
+        },
+    },
+    'loggers': {
+        'qmsk_www_pages': {
+            'handlers': [ 'console' ],
+            'level': 'INFO',
+        }
+    },
+}
+
+## Custom
+INSTALLED_APPS += (
+    'qmsk_www_pages',
+)
+
+QMSK_WWW_PAGES_DIR = './pages'
--- /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,
+}
--- a/qmsk_www_pages/templates/pages/page.html	Sun Sep 14 00:58:17 2014 +0300
+++ b/qmsk_www_pages/templates/pages/page.html	Sun Sep 14 00:59:07 2014 +0300
@@ -1,12 +1,12 @@
 {% extends "site.html" %}
 
-{% block title %}Hello World{% endblock %}
+{% block title %}qmsk.net :: {{ page_name }}{% endblock %}
 
 {% block content %}
     <div class="container">
         <div class="header">
             <h1 class="page-title">
-                Hello World
+                qmsk.net
             </h1>
         </div>
         <hr />
@@ -17,10 +17,9 @@
                 </ul>
             </div>
             <div class="col-sm-8 pages-content">
-                <h1>Hello World</h1>
-                <p>
-                    Hello World.
-                </p>
+                <!-- <h1>{{ page_name }}</h1> -->
+
+                {{ page_html|safe }}
             </div>
         </div>
     </div>
--- a/qmsk_www_pages/views.py	Sun Sep 14 00:58:17 2014 +0300
+++ b/qmsk_www_pages/views.py	Sun Sep 14 00:59:07 2014 +0300
@@ -1,6 +1,16 @@
+from django.http import Http404
 from django.shortcuts import render
 
+from qmsk_www_pages import pages
+
 # Create your views here.
 def page (request, page):
-    return render(request, 'pages/page.html', { })
+    page = pages.Page.lookup(page)
 
+    if not page:
+        raise Http404
+
+    return render(request, 'pages/page.html', dict(
+            page_name   = page.name,
+            page_html   = page.render(request),
+    ))