--- 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),
+ ))