pages: Site, footer with modified, basic css styles, page tree types
authorTero Marttila <terom@paivola.fi>
Sun, 14 Sep 2014 02:15:25 +0300
changeset 202 da5de3a97efb
parent 201 edcbbc94f90d
child 203 8bfe3ab5e7fb
pages: Site, footer with modified, basic css styles, page tree types
qmsk_www/settings.py
qmsk_www/templates/site.html
qmsk_www_pages/pages.py
qmsk_www_pages/static/pages/pages.css
qmsk_www_pages/templates/pages/page.html
qmsk_www_pages/views.py
--- 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(),
     ))