qmsk/pages/pages.py
author Tero Marttila <terom@qmsk.net>
Mon, 10 Oct 2016 20:17:35 +0300
changeset 141 0ebc46106159
parent 107 4e0b53e960cd
permissions -rw-r--r--
masters: thesis link slides
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
from django.conf import settings
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
import codecs
65
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
     4
import datetime
107
4e0b53e960cd move qmsk_www_pages to qmsk.pages
Tero Marttila <terom@qmsk.net>
parents: 101
diff changeset
     5
import logging; log = logging.getLogger('qmsk.pages.pages')
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
import os, os.path
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
85
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
     8
import markdown
97
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
     9
import mako.template
85
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
    10
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    11
class NotFound (Exception):
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    12
    pass
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    13
97
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
    14
class RenderError (Exception):
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
    15
    pass
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
    16
65
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
    17
class Site (object):
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
    18
    @classmethod
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
    19
    def lookup (cls):
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
    20
        return cls(
107
4e0b53e960cd move qmsk_www_pages to qmsk.pages
Tero Marttila <terom@qmsk.net>
parents: 101
diff changeset
    21
            root        = settings.QMSK_PAGES_DIR,
4e0b53e960cd move qmsk_www_pages to qmsk.pages
Tero Marttila <terom@qmsk.net>
parents: 101
diff changeset
    22
            name        = settings.QMSK_PAGES_SITE,
65
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
    23
        )
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
    24
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
    25
    def __init__ (self, root, name):
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
    26
        self.root = root
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
    27
        self.name = name
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
    28
99
88fa55fa0194 qmsk_www_pages: pages: Site.tree()
Tero Marttila <terom@paivola.fi>
parents: 97
diff changeset
    29
    def tree (self):
88fa55fa0194 qmsk_www_pages: pages: Site.tree()
Tero Marttila <terom@paivola.fi>
parents: 97
diff changeset
    30
        return Tree(self.root, None, (), self,
88fa55fa0194 qmsk_www_pages: pages: Site.tree()
Tero Marttila <terom@paivola.fi>
parents: 97
diff changeset
    31
                title       = self.name,
88fa55fa0194 qmsk_www_pages: pages: Site.tree()
Tero Marttila <terom@paivola.fi>
parents: 97
diff changeset
    32
        )
88fa55fa0194 qmsk_www_pages: pages: Site.tree()
Tero Marttila <terom@paivola.fi>
parents: 97
diff changeset
    33
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
    34
class Tree (object):
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
    35
    INDEX = 'index'
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
    36
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
    37
    @classmethod
65
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
    38
    def lookup (cls, site, parts):
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    39
        """
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    40
            Returns Tree
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
    41
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    42
            Raises NotFound
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    43
        """
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    44
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    45
        parents = ( )
99
88fa55fa0194 qmsk_www_pages: pages: Site.tree()
Tero Marttila <terom@paivola.fi>
parents: 97
diff changeset
    46
        tree = site.tree()
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    47
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    48
        for name in parts:
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    49
            if name.startswith('.'):
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
    50
                # evil
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    51
                raise NotFound()
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
    52
            
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    53
            if not name:
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
    54
                continue
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
    55
        
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    56
            path = os.path.join(tree.path, name)
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
    57
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
    58
            if not os.path.exists(path):
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    59
                raise NotFound()
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
    60
            
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
    61
            if not os.path.isdir(path):
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    62
                raise NotFound()
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
    63
80
dc6e3fffcbe2 pages: Tree titles
Tero Marttila <terom@paivola.fi>
parents: 75
diff changeset
    64
            # title
dc6e3fffcbe2 pages: Tree titles
Tero Marttila <terom@paivola.fi>
parents: 75
diff changeset
    65
            title = tree.item_title(name)
dc6e3fffcbe2 pages: Tree titles
Tero Marttila <terom@paivola.fi>
parents: 75
diff changeset
    66
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    67
            parents += (tree, )
80
dc6e3fffcbe2 pages: Tree titles
Tero Marttila <terom@paivola.fi>
parents: 75
diff changeset
    68
            tree = cls(path, name, parents, site,
dc6e3fffcbe2 pages: Tree titles
Tero Marttila <terom@paivola.fi>
parents: 75
diff changeset
    69
                    title   = title,
dc6e3fffcbe2 pages: Tree titles
Tero Marttila <terom@paivola.fi>
parents: 75
diff changeset
    70
            )
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    71
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    72
        return tree
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    73
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    74
    def __init__ (self, path, name, parents, site,
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    75
            title   = None,
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    76
    ):
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    77
        """
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    78
            path:       filesystem path
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    79
            name:       subtree name, or None for root
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    80
            parents:    (Tree)
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    81
            site:       Site
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    82
        """
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    83
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
    84
        self.path = path
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    85
        self.name = name
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    86
        self.parents = parents
65
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
    87
        self.site = site
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
    88
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    89
        self.title = title or name
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    90
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    91
    def hierarchy (self):
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    92
        """
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    93
            Yield Tree.
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    94
        """
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    95
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    96
        for tree in self.parents:
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    97
            yield tree
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    98
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
    99
        yield self
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
   100
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   101
    def url (self, tree=None, page=None):
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
   102
        path = '/'.join(tree.name for tree in self.hierarchy() if tree.name is not None)
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   103
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   104
        if path:
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   105
            path += '/'
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   106
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   107
        if tree:
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   108
            path = tree + '/'
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   109
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   110
        if page:
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   111
            path += page
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   112
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   113
        return path
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   114
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   115
    def scan (self):
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   116
        """
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   117
            Scan for files in tree.
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   118
        """
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   119
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   120
        for filename in os.listdir(self.path):
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   121
            if filename.startswith('.'):
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   122
                continue
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   123
            
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   124
            if '.' in filename:
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   125
                file_name, file_type = filename.rsplit('.', 1)
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   126
            else:
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   127
                file_name = filename
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   128
                file_type = None
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   129
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   130
            if not file_name:
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   131
                continue
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   132
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   133
            path = os.path.join(self.path, filename)
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   134
            
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   135
            yield path, file_name, file_type
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   136
72
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   137
    def item_title (self, name):
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   138
        """
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   139
            Lookup item title if exists.
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   140
        """
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   141
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   142
        title_path = os.path.join(self.path, name + '.title')
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   143
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   144
        log.info("%s: %s title_path=%s", self, name, title_path)
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   145
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   146
        if os.path.exists(title_path):
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   147
            return open(title_path).read().strip()
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   148
        else:
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   149
            return None
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   150
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   151
    def list (self):
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   152
        """
75
9329ceafa15c pages: Tree.list_sorted
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   153
            Lists all Trees and Pages for this Tree.
9329ceafa15c pages: Tree.list_sorted
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   154
9329ceafa15c pages: Tree.list_sorted
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   155
            Yields (name, url, page_type or None, title)
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   156
        """
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   157
        
72
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   158
        for path, name, file_type in self.scan():
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   159
            title = self.item_title(name) or name
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   160
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   161
            # trees
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   162
            if os.path.isdir(path):
75
9329ceafa15c pages: Tree.list_sorted
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   163
                yield name, self.url(tree=name), None, title
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   164
72
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   165
            if name == self.INDEX:
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   166
                continue
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   167
            
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   168
            # pages
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   169
            if not file_type:
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   170
                continue
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   171
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   172
            if file_type not in TYPES:
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   173
                continue
72
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   174
75
9329ceafa15c pages: Tree.list_sorted
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   175
            yield name, self.url(page=name), file_type, title
9329ceafa15c pages: Tree.list_sorted
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   176
9329ceafa15c pages: Tree.list_sorted
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   177
    def list_sorted (self):
9329ceafa15c pages: Tree.list_sorted
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   178
        return sorted(list(self.list()))
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   179
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   180
    def page (self, name):
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   181
        """
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   182
            Scans through tree looking for a matching page.
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   183
            
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
   184
            Returns Page or None.
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   185
        """
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   186
        
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   187
        if not name:
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   188
            name = self.INDEX
80
dc6e3fffcbe2 pages: Tree titles
Tero Marttila <terom@paivola.fi>
parents: 75
diff changeset
   189
            title_default = self.title
dc6e3fffcbe2 pages: Tree titles
Tero Marttila <terom@paivola.fi>
parents: 75
diff changeset
   190
        else:
dc6e3fffcbe2 pages: Tree titles
Tero Marttila <terom@paivola.fi>
parents: 75
diff changeset
   191
            title_default = None
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   192
83
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   193
        parents = self.parents + (self, )
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   194
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   195
        for path, file_name, file_type in self.scan():
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   196
            # match on name
93
0ee39728e3f4 qmsk_www_pages: handle non-typed filenames when looking up
Tero Marttila <terom@paivola.fi>
parents: 85
diff changeset
   197
            if file_name == name:
0ee39728e3f4 qmsk_www_pages: handle non-typed filenames when looking up
Tero Marttila <terom@paivola.fi>
parents: 85
diff changeset
   198
                pass
0ee39728e3f4 qmsk_www_pages: handle non-typed filenames when looking up
Tero Marttila <terom@paivola.fi>
parents: 85
diff changeset
   199
            elif file_type and (file_name + '.' + file_type == name):
0ee39728e3f4 qmsk_www_pages: handle non-typed filenames when looking up
Tero Marttila <terom@paivola.fi>
parents: 85
diff changeset
   200
                pass
0ee39728e3f4 qmsk_www_pages: handle non-typed filenames when looking up
Tero Marttila <terom@paivola.fi>
parents: 85
diff changeset
   201
            else:
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   202
                continue
83
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   203
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   204
            # redirects?
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   205
            if os.path.islink(path):
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   206
                target = os.readlink(path)
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   207
            
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   208
                # XXX: this should be some kind of common code
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   209
                if '.' in target:
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   210
                    target, target_type = target.rsplit('.', 1)
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   211
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   212
                log.info("%s: %s -> %s", self, name, target)
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   213
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   214
                return RedirectPage(path, name, self, parents,
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   215
                    target  = target,
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   216
                )
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   217
            
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   218
            # match on type
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   219
            if not file_type:
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   220
                continue
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   221
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   222
            page_type = TYPES.get(file_type)
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   223
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   224
            if not page_type:
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   225
                continue
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   226
            
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   227
            # out
80
dc6e3fffcbe2 pages: Tree titles
Tero Marttila <terom@paivola.fi>
parents: 75
diff changeset
   228
            title = self.item_title(file_name) or title_default
72
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   229
83
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   230
            return page_type(path, name, self, parents,
72
752f4884d91a tree/page title support
Tero Marttila <terom@paivola.fi>
parents: 69
diff changeset
   231
                title   = title,
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   232
            )
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   233
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   234
class Page (object):
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   235
    ENCODING = 'utf-8'
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   236
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   237
    @classmethod
65
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   238
    def lookup (cls, site, page):
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   239
        """
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
   240
            Returns Page.
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
   241
            
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
   242
            Raises NotFound
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   243
        """
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   244
        
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   245
        log.info("page=%r", page)
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   246
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   247
        if page:
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   248
            parts = page.split('/')
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   249
        else:
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   250
            parts = [ ]
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   251
            
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   252
        if parts:
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   253
            page_name = parts.pop(-1)
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   254
            tree_parts = parts
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   255
        else:
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   256
            page_name = ''
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   257
            tree_parts = []
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   258
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   259
        # scan dir
65
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   260
        tree = Tree.lookup(site, tree_parts)
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   261
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   262
        # scan page
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   263
        page = tree.page(page_name)
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   264
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   265
        if not page:
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
   266
            raise NotFound()
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   267
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   268
        return page
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   269
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
   270
    def __init__ (self, path, name, tree, parents=(), encoding=ENCODING, title=None):
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   271
        self.path = path
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   272
        self.name = name
62
a2f29d787bea pages: Tree
Tero Marttila <terom@paivola.fi>
parents: 61
diff changeset
   273
        self.tree = tree
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
   274
        self.parents = parents
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
   275
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   276
        self.encoding = encoding
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
   277
        self.title = title or name
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   278
69
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   279
    def hierarchy (self):
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   280
        """
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   281
            Yield (Tree, name) pairs
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   282
        """
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   283
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   284
        parent = None
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   285
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   286
        for tree in self.parents:
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   287
            if parent:
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   288
                yield parent, tree.name
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   289
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   290
            parent = tree
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   291
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   292
        yield parent, self.name
4b8814ff6d6d pages: page.hierarchy() for navigation
Tero Marttila <terom@paivola.fi>
parents: 68
diff changeset
   293
64
295ba0fb02b5 pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   294
    def url (self):
295ba0fb02b5 pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   295
        return self.tree.url(page=self.name)
295ba0fb02b5 pages: tree breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   296
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   297
    def open (self):
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   298
        return codecs.open(self.path, encoding=self.encoding)
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   299
65
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   300
    def stat (self):
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   301
        return os.stat(self.path)
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   302
61
308b2e3dfd6a page breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 60
diff changeset
   303
    def breadcrumb (self):
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
   304
        for tree in self.tree.hierarchy():
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
   305
            yield tree.url(), tree.title
63
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   306
        
468a152ad623 pages: list
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   307
        if self.name != self.tree.INDEX:
68
023b9a9d6c76 pages: tree parents, hierarchy; tree/page titles
Tero Marttila <terom@paivola.fi>
parents: 65
diff changeset
   308
            yield self.url(), self.title
61
308b2e3dfd6a page breadcrumb
Tero Marttila <terom@paivola.fi>
parents: 60
diff changeset
   309
65
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   310
    def modified (self):
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   311
        return datetime.datetime.utcfromtimestamp(self.stat().st_mtime)
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   312
83
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   313
    def redirect_page (self, request):
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   314
        return None
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   315
    
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   316
    def render_html (self, request):
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   317
        raise NotImplementedError()
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   318
83
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   319
# TODO: tree redirects
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   320
class RedirectPage (Page):
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   321
    def __init__ (self, path, name, tree, parents,
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   322
            target,
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   323
            **opts
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   324
    ) :
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   325
        super(RedirectPage, self).__init__(path, name, tree, parents, **opts)
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   326
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   327
        self.target = target
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   328
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   329
    def redirect_page (self, request):
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   330
        return os.path.normpath(self.tree.url() + '/' + self.target)
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   331
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   332
class HTML_Page (Page):
83
f167c68d9f34 qmsk_www_pages: symlink support for page redirects
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   333
    def render_html (self, request):
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   334
        return self.open().read()
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   335
85
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   336
class MarkdownPage (Page):
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   337
    FORMAT = 'html5'
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   338
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   339
    def __init__ (self, path, name, tree, parents,
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   340
            format=FORMAT,
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   341
            **opts
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   342
    ) :
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   343
        super(MarkdownPage, self).__init__(path, name, tree, parents, **opts)
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   344
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   345
        self.format = format
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   346
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   347
    def render_html (self, request):
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   348
        return markdown.markdown(self.open().read(),
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   349
            output_format   = self.format,
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   350
        )
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   351
97
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   352
class TemplatePage (Page):
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   353
    def render_html (self, request):
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   354
        """
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   355
            Raises RenderError if !DEBUG, arbitrary error with stack trace otherwise.
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   356
        """
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   357
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   358
        try:
101
c9860074d4c9 qmsk_www_pages: pages.TemplatePage: pass in request
Tero Marttila <terom@paivola.fi>
parents: 99
diff changeset
   359
            return mako.template.Template(filename=self.path).render(
c9860074d4c9 qmsk_www_pages: pages.TemplatePage: pass in request
Tero Marttila <terom@paivola.fi>
parents: 99
diff changeset
   360
                    request = request,
c9860074d4c9 qmsk_www_pages: pages.TemplatePage: pass in request
Tero Marttila <terom@paivola.fi>
parents: 99
diff changeset
   361
            )
97
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   362
        except Exception as error:
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   363
            if settings.DEBUG:
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   364
                raise
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   365
            else:
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   366
                raise RenderError(error)
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   367
65
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   368
SITE = Site.lookup()
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   369
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   370
TYPES = {
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   371
    'html':         HTML_Page,
85
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   372
    'md':           MarkdownPage,
aa437984ddc5 qmsk_www_pages: markdown
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   373
    'markdown':     MarkdownPage,
97
bf230208ab8f qmsk_www_pages: pages TemplatePage handling for mako .tmpl pages, with DEBUG-dependent error handling
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   374
    'tmpl':         TemplatePage,
60
bd9cea0b5b11 qmsk_www_pages: pages.Page.lookup() and .html support; logging
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   375
}
65
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   376
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   377
def page (page):
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   378
    return Page.lookup(SITE, page)
67d8600fa0a1 pages: Site, footer with modified, basic css styles, page tree types
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   379