qmsk_www_pages/pages.py
author Tero Marttila <terom@paivola.fi>
Sun, 14 Sep 2014 02:28:42 +0300
changeset 204 99f9e50030ae
parent 202 da5de3a97efb
child 68 023b9a9d6c76
permissions -rw-r--r--
site layout: update style.css for use with bootstrap
197
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
from django.conf import settings
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
import codecs
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
     4
import datetime
197
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
import logging; log = logging.getLogger('qmsk_www_pages.pages')
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
import os, os.path
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
     8
class Site (object):
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
     9
    @classmethod
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    10
    def lookup (cls):
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    11
        return cls(
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    12
            root        = settings.QMSK_WWW_PAGES_DIR,
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    13
            name        = settings.QMSK_WWW_PAGES_SITE,
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    14
        )
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    15
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    16
    def __init__ (self, root, name):
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    17
        self.root = root
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    18
        self.name = name
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    19
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    20
class Tree (object):
200
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    21
    INDEX = 'index'
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    22
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    23
    @classmethod
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    24
    def lookup (cls, site, parts):
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    25
        path = site.root
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    26
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    27
        for part in parts:
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    28
            if part.startswith('.'):
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    29
                # evil
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    30
                return None
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    31
            
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    32
            if not part:
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    33
                continue
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    34
        
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    35
            path = os.path.join(path, part)
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    36
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    37
            if not os.path.exists(path):
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    38
                return None
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    39
            
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    40
            if not os.path.isdir(path):
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    41
                return None
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    42
        
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    43
        return cls(path, parts, site)
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    44
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    45
    def __init__ (self, path, parts, site):
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    46
        self.path = path
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
    47
        self.parts = parts
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    48
        self.site = site
200
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    49
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    50
    def url (self, tree=None, page=None):
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    51
        path = '/'.join(self.parts)
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    52
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    53
        if path:
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    54
            path += '/'
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    55
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    56
        if tree:
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    57
            path = tree + '/'
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    58
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    59
        if page:
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    60
            path += page
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    61
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    62
        return path
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    63
201
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
    64
    def breadcrumb (self):
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
    65
        path = []
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
    66
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
    67
        yield '', self.site.name
201
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
    68
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
    69
        for part in self.parts:
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
    70
            path.append(part)
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
    71
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
    72
            yield '/'.join(path) + '/', part
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
    73
200
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    74
    def scan (self):
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    75
        """
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    76
            Scan for files in tree.
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    77
        """
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    78
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    79
        for filename in os.listdir(self.path):
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    80
            if filename.startswith('.'):
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    81
                continue
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    82
            
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    83
            if '.' in filename:
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    84
                file_name, file_type = filename.rsplit('.', 1)
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    85
            else:
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    86
                file_name = filename
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    87
                file_type = None
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    88
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    89
            if not file_name:
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    90
                continue
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    91
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    92
            path = os.path.join(self.path, filename)
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    93
            
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    94
            yield path, file_name, file_type
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    95
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    96
    def list (self):
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    97
        """
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    98
            Lists all Trees and Pages for this Tree
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
    99
        """
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   100
        
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   101
        for path, file_name, file_type in self.scan():
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   102
            # trees
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   103
            if os.path.isdir(path):
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   104
                yield self.url(tree=file_name), file_name, None
200
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   105
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   106
            if file_name == self.INDEX:
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   107
                continue
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   108
            
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   109
            # pages
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   110
            if not file_type:
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   111
                continue
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   112
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   113
            if file_type not in TYPES:
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   114
                continue
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   115
            
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   116
            yield self.url(page=file_name), file_name, file_type
200
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   117
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   118
    def page (self, name):
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   119
        """
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   120
            Scans through tree looking for a matching page.
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   121
            
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   122
            Returns Page.
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   123
        """
200
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   124
        
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   125
        if not name:
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   126
            name = self.INDEX
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   127
200
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   128
        for path, file_name, file_type in self.scan():
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   129
            # match on name
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   130
            if file_name != name:
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   131
                continue
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   132
            
200
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   133
            # match on type
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   134
            if not file_type:
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   135
                continue
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   136
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   137
            page_type = TYPES.get(file_type)
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   138
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   139
            if not page_type:
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   140
                continue
200
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   141
            
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   142
            # out
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   143
            return page_type(
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   144
                path    = path,
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   145
                name    = name,
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   146
                tree    = self,
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   147
            )
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   148
197
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
class Page (object):
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
    ENCODING = 'utf-8'
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
    @classmethod
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   153
    def lookup (cls, site, page):
197
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
        """
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
            Lookup a Page from disk.
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
            Returns None if there is no such page.
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   158
        """
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
        
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
        log.info("page=%r", page)
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
        if page:
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   163
            parts = page.split('/')
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   164
        else:
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
            parts = [ ]
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
            
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
        if parts:
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
            page_name = parts.pop(-1)
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   169
            tree_parts = parts
197
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
        else:
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
            page_name = ''
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   172
            tree_parts = []
197
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
        # scan dir
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   175
        tree = Tree.lookup(site, tree_parts)
197
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   177
        if not tree:
197
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
            return None
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   180
        # scan page
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   181
        page = tree.page(page_name)
197
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   183
        if not page:
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   184
            return None
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   185
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   186
        return page
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   187
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   188
    def __init__ (self, path, name, tree, encoding=ENCODING):
197
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
        self.path = path
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
        self.name = name
199
9fd827df377f pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 198
diff changeset
   191
        self.tree = tree
197
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
        self.encoding = encoding
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
201
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
   194
    def url (self):
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
   195
        return self.tree.url(page=self.name)
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
   196
197
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
    def open (self):
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
        return codecs.open(self.path, encoding=self.encoding)
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   200
    def stat (self):
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   201
        return os.stat(self.path)
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   202
198
66cf32a10222 page breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 197
diff changeset
   203
    def breadcrumb (self):
201
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
   204
        for path, name in self.tree.breadcrumb():
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
   205
            yield path, name
200
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   206
        
1757261f2b95 pages: list
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   207
        if self.name != self.tree.INDEX:
201
edcbbc94f90d pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 200
diff changeset
   208
            yield self.url(), self.name
198
66cf32a10222 page breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 197
diff changeset
   209
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   210
    def modified (self):
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   211
        return datetime.datetime.utcfromtimestamp(self.stat().st_mtime)
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   212
197
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
    def render (self, request):
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
        raise NotImplementedError()
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
class HTML_Page (Page):
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
    def render (self, request):
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
        return self.open().read()
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   220
SITE = Site.lookup()
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   221
197
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
TYPES = {
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
    'html':         HTML_Page,
11a6d8fea463 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
}
202
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   225
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   226
def page (page):
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   227
    return Page.lookup(SITE, page)
da5de3a97efb pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 201
diff changeset
   228