--- a/qmsk_www/settings.py Sun Sep 14 01:45:17 2014 +0300
+++ b/qmsk_www/settings.py Sun Sep 14 02:15:25 2014 +0300
@@ -98,3 +98,4 @@
)
QMSK_WWW_PAGES_DIR = './pages'
+QMSK_WWW_PAGES_SITE = "qmsk.net"
--- a/qmsk_www/templates/site.html Sun Sep 14 01:45:17 2014 +0300
+++ b/qmsk_www/templates/site.html Sun Sep 14 02:15:25 2014 +0300
@@ -1,3 +1,4 @@
+{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
@@ -5,10 +6,11 @@
<title>{% block title %}{% endblock %}</title>
<!-- Bootstrap -->
- <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
- <!-- Bootstrap theme -->
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
+ <!-- qmsk.www.pages -->
+ <link rel="stylesheet" href="{% static "pages/pages.css" %}">
</head>
<body>
{% block content %}{% endblock %}
--- 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)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/qmsk_www_pages/static/pages/pages.css Sun Sep 14 02:15:25 2014 +0300
@@ -0,0 +1,11 @@
+div.page-header {
+ border-bottom: 1px solid #EEE;
+}
+
+div.page-footer {
+ border-top: 1px solid #EEE;
+
+ margin: 40px 0px 0px 0px;
+
+ padding: 20px 0px;
+}
--- a/qmsk_www_pages/templates/pages/page.html Sun Sep 14 01:45:17 2014 +0300
+++ b/qmsk_www_pages/templates/pages/page.html Sun Sep 14 02:15:25 2014 +0300
@@ -1,15 +1,14 @@
{% extends "site.html" %}
-{% block title %}qmsk.net :: {{ page_name }}{% endblock %}
+{% block title %}{{ site_name }} :: {{ page_name }}{% endblock %}
{% block content %}
<div class="container">
- <div class="header">
+ <div class="page-header">
<h1 class="page-title">
- qmsk.net
+ {{ site_name }}
</h1>
</div>
- <hr />
<div class="page-breadcrumb">
<ol class="breadcrumb">
{% for page, name in page_breadcrumb %}
@@ -18,7 +17,7 @@
</ol>
</div>
<div class="row">
- <div class="col-sm-2 pages-tree">
+ <div class="col-sm-2 page-tree">
{% for page, name in tree_breadcrumb %}
<ul class="nav">
<li><a href="{% url 'page' page %}">{{ name }}</a></li>
@@ -26,18 +25,23 @@
<hr />
{% endfor %}
<ul class="nav">
- {% for page, name in page_list %}
- <li class="page-tree-item {% if name == page_name %}page-tree-active{% endif %}">
+ {% for page, name, type in page_list %}
+ <li class="page-tree-item{% if name == page_name %} page-tree-active{% endif %}{% if type %} page-tree-{{type}}{% else %} page-tree-tree{% endif %}">
<a href="{% url 'page' page %}">{{ name }}</a>
</li>
{% endfor %}
</ul>
</div>
- <div class="col-sm-8 pages-content">
+ <div class="col-sm-8 page-content">
<!-- <h1>{{ page_name }}</h1> -->
{{ page_html|safe }}
</div>
</div>
+ <div class="page-footer">
+ <p class="page-footer-modified">
+ Page modified <span title="{{ page_modified|date:'DATETIME_FORMAT' }}">{{ page_modified|date }}</span>
+ </p>
+ </div>
</div>
{% endblock %}
--- a/qmsk_www_pages/views.py Sun Sep 14 01:45:17 2014 +0300
+++ b/qmsk_www_pages/views.py Sun Sep 14 02:15:25 2014 +0300
@@ -5,15 +5,17 @@
# Create your views here.
def page (request, page):
- page = pages.Page.lookup(page)
+ page = pages.page(page)
if not page:
raise Http404
return render(request, 'pages/page.html', dict(
+ site_name = page.tree.site.name,
tree_breadcrumb = page.tree.breadcrumb(),
page_name = page.name,
page_breadcrumb = page.breadcrumb(),
page_list = page.tree.list(),
page_html = page.render(request),
+ page_modified = page.modified(),
))