lib/page.py
author Tero Marttila <terom@fixme.fi>
Sat, 07 Feb 2009 04:57:22 +0200
changeset 26 9d3beac1b196
parent 21 b05979822dee
permissions -rw-r--r--
remove foo.html page, and rice up the footer a bit
5
9ed4c7d2bdd2 older work
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
7
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
     2
"""
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
     3
    Handling page requests
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
     4
"""
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
     5
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
     6
# for filesystem ops
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
     7
import os, os.path
21
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
     8
import time
7
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
     9
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    10
# for ResponseError
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    11
import http
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    12
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    13
# for TemplatePage
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    14
import template
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    15
16
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
    16
from page_tree import page_tree
26
9d3beac1b196 remove foo.html page, and rice up the footer a bit
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    17
import config
16
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
    18
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    19
# path to directory containing the page heirarcy
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    20
PAGE_DIR = "pages"
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    21
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    22
class PageError (http.ResponseError) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    23
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    24
        Error looking up/handling a page
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    25
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    26
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    27
    pass
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    28
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    29
# XXX: should inherit from PageInfo
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    30
class Page (object) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    31
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    32
        This object represents the information about our attempt to render some specific page
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    33
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    34
21
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
    35
    def __init__ (self, url, path, basename, url_tail, charset='utf8') :
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    36
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    37
            Initialize the page at the given location
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    38
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    39
            @param url the URL leading to this page
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    40
            @param path the filesystem path to this page's file
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    41
            @param basename the filesystem name of this page's file, without the file extension
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    42
            @param url_trail trailing URL for this page
21
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
    43
            @param charset file charset
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    44
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    45
        
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    46
        # store
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    47
        self.url = url
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    48
        self.path = path
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    49
        self.basename = basename
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    50
        self.url_tail = url_tail
21
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
    51
        self.charset = charset
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    52
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    53
        # unbound
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    54
        self.request = None
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    55
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    56
        # sub-init
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    57
        self._init()
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    58
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    59
    def _init (self) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    60
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    61
            Do initial data loading, etc
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    62
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    63
        
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    64
        pass
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    65
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    66
    def bind_request (self, request) :
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    67
        """
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    68
            Bind this page-render to the given request
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    69
        """
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    70
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    71
        self.request = request
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    72
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    73
    @property
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    74
    def title (self) :
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    75
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    76
            Return the page's title
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    77
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    78
            Defaults to the retreiving the page title from page_list, or basename in Titlecase.
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    79
        """
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    80
        
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    81
        # lookup in page_list
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    82
        page_info = page_tree.get_page(self.url)
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    83
        
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    84
        # fallback to titlecase
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    85
        if page_info :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    86
            title = page_info.title
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    87
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    88
        else :
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    89
            title = self.basename.title()
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    90
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    91
        return title
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    92
    
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    93
    @property
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    94
    def content (self) :
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    95
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    96
            Return the page content as a string
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    97
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    98
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    99
        abstract
21
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   100
    
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   101
    @property
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   102
    def modified (self) :
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   103
        """
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   104
            Returns the page modification timestamp
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   105
        """
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   106
        
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   107
        # stat
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   108
        timestamp = os.stat(self.path).st_mtime
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   109
26
9d3beac1b196 remove foo.html page, and rice up the footer a bit
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   110
        return time.strftime(config.DATETIME_FMT, time.gmtime(timestamp))
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   111
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   112
class HTMLPage (Page) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   113
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   114
        A simple .html page that's just passed through directly
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   115
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   116
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   117
    @property
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   118
    def content (self) :
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   119
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   120
            Opens the .html file, reads and returns contents
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   121
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   122
21
b05979822dee some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   123
        return open(self.path, 'rb').read().decode(self.charset)
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   124
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   125
class TemplatePage (Page) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   126
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   127
        A template that's rendered using our template library
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   128
    """
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   129
    
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   130
    @property
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   131
    def content (self) :
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   132
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   133
            Loads the .tmpl file, and renders it
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   134
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   135
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   136
        return template.render_file(self.path,
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   137
            request     = self.request,
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   138
            page_tree   = page_tree
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   139
        )
7
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   140
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   141
# list of page handlers, by type
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   142
TYPE_HANDLERS = [
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   143
    ('html',                    HTMLPage        ),
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   144
    (template.TEMPLATE_EXT,     TemplatePage    ),
7
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   145
]
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   146
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   147
def _lookup_handler (url, path, filename, basename, extension, tail) :
5
9ed4c7d2bdd2 older work
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
    """
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   149
        We found the file that we looked for, now get its handler
5
9ed4c7d2bdd2 older work
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
    """
9ed4c7d2bdd2 older work
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   152
    # find appropriate handler
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   153
    for handler_ext, handler in TYPE_HANDLERS :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   154
        # match against file extension?
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   155
        if handler_ext == extension :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   156
            # found handler, return instance
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   157
            return handler(url, path, basename, tail)
5
9ed4c7d2bdd2 older work
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   159
    # no handler found
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   160
    raise PageError("No handler found for page %r of type %r" % (url, extension))
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   161
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   162
def lookup (name) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   163
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   164
        Look up and return a Page object for the given page, or raise an error
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   165
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   166
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   167
    # inital path
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   168
    path = PAGE_DIR
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   169
    url_segments = []
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   170
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   171
    # name segments
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   172
    segments = name.split('/')
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   173
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   174
    # iterate through the parts of the page segments
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   175
    while True :
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   176
        segment = None
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   177
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   178
        # pop segment
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   179
        if segments :
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   180
            segment = segments.pop(0)
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   181
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   182
            url_segments.append(segment)
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   183
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   184
        # translate empty -> index
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   185
        if not segment :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   186
            segment = 'index'
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   187
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   188
        # look for it in the dir
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   189
        for filename in os.listdir(path) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   190
            # build full file path
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   191
            file_path = os.path.join(path, filename)
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   192
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   193
            # stat, recurse into subdirectory?
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   194
            if os.path.isdir(file_path) and filename == segment :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   195
                # use new dir
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   196
                path = file_path
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   197
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   198
                # break for-loop to look at next segment
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   199
                break
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   200
 
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   201
            # split into basename + extension
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   202
            basename, extension = os.path.splitext(filename)
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   203
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   204
            # ...remove that dot
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   205
            extension = extension.lstrip('.')
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   206
            
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   207
            # match against requested page name?
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   208
            if basename == segment :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   209
                # found the file we wanted
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   210
                return _lookup_handler('/'.join(url_segments), file_path, filename, basename, extension, '/'.join(segments))
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   211
            
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   212
            else :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   213
                # inspect next file in dir
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   214
                continue
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   215
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   216
        else :
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   217
            # did not find any dir or file, break out of while loop
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   218
            break
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   219
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   220
    # did not find the filename we were looking for in os.listdir
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   221
    raise PageError("Page not found: %s" % name, status='404 Not Found')
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   222