site/pages/__init__.py
author Tero Marttila <terom@fixme.fi>
Tue, 02 Dec 2008 03:05:04 +0200
changeset 2 ec68a0f75c58
child 5 9ed4c7d2bdd2
permissions -rw-r--r--
python functionality...
2
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
import templates as _templates
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
class _Page (object) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
    """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
        A page is kind of like a controller, I guess
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
    """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
    # the page title, used in the HTML <title>
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    title = None
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    # the page name, used in the menu
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    name = None
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    # the page path, used in the URL
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    path = None
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    def __init__ (self, req, path_suffix) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
        self.req = req
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
        self.path_suffix = path_suffix
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    def _build_template (self, template_class) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
        tpl = template_class(searchList=[self.req])
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
        
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        tpl.page_title = self.title
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        tpl.page_name = self.name
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
        tpl.page_path = self.path
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        tpl.page_menu = root_menu
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
        tpl.page = self
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        tpl.page_children = self.get_children()
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
        
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
        return tpl
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    def get_children (self) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
        """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
            Returns a list of page objects that are children of this one. May return None if there are none
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
        """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
        return None
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    def get_response_code (self) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
        """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
            Returns the HTTP response code to be used
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
        """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
        return 200
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    def render_template (self) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
        """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
            Returns an instance of Cheetah.Template, prepopulated with whatever variables it needs, ready to be rendered
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
        abstract
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
class StaticHTML (_Page) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    # the path to the .html file
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    file_path = None
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    def __init__ (self, *args) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
        super(StaticHTML, self).__init__(*args)
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
        # open the .html and read in the contents
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
        fh = open(self.file_path, "r")
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        self.file_data = fh.read()
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
        fh.close()
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    def render_template (self) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
        tpl = self._build_template(_templates.layout)
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
        
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
        tpl.page_content = self.file_data
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
        return tpl
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
def html_page (_file_path, _title, _name, _path) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
    class _anon_html_page (StaticHTML) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
        file_path = _file_path
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
        title = _title
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        name = _name
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
        path = _path
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
    return _anon_html_page
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
class Main (_Page) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        Main page with simple stuff
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
    title = "Main Page"
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
    name = "Main"
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
    path = ""
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
    def render_template (self) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
        return self._build_template(_templates.main)
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
class Error404 (_Page) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    title = "Error 404 - Not Found"
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    def get_response_code (self) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
        return 404
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
    def render_template (self) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
        return self._build_template(_templates.error_404)
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
# load HTML pages
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
About = html_page("pages/about.html", "About", "About", "about")
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
pages = {
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
    'main': Main,
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
    'about': About,
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
}
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
root_menu = [
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    Main,
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
    About
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
]
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
def find (req) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
    """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
        This finds the page to use for the given req and reuturns an instance of it
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
    """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
    for prefix, suffix in req.page_name_prefixes() :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
        if prefix in pages :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
            return pages[prefix](req, suffix)
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
    
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
    return Error404(req, req.page_path)
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131