lib/site.py
author Tero Marttila <terom@fixme.fi>
Sun, 08 Feb 2009 02:55:53 +0200
branchsites
changeset 184 a3d9aa76790d
parent 177 578eab5dafdc
permissions -rw-r--r--
implement channel_view count, the query stuff, css, layout all need some cleanup :(
170
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    Per-site stuff
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
171
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
     5
import imp
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
     6
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
     7
import handler
170
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
     9
class Site (handler.RequestHandler) :
170
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    """
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
        A site is a website and its configuration
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    12
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    13
        XXX: need to somehow communicate the site name to our downstream handler
170
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    """
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    16
    def __init__ (self, name, handler) :
171
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    17
        """
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    18
            The given name must be like a valid hostname, e.g. 'www.qmsk.net'
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    19
        """
170
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
171
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    21
        # store
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    22
        self.name = name
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    23
        self.handler = handler
170
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    25
    def handle_request (self, request) :
171
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    26
        """
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    27
            Map the request through our handler...
171
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    28
        """
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    29
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    30
        return self.handler.handle_request(request)
171
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    31
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    32
class SiteModule (Site) :
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    33
    """
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    34
        A site, represented as python module/package, with the following module attributes:
171
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    35
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    36
            handler     - the RequestHandler to use
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    37
    """
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    38
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    39
    def __init__ (self, name, module) :
171
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    40
        """
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    41
            Create the Site based on the given module
171
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    42
        """
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    43
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    44
        super(SiteModule, self).__init__(name,
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    45
            module.handler
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    46
        )
171
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    47
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    48
class SiteModuleCollection (handler.RequestHandler) :
171
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    49
    """
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    50
        A collection of SiteModules, looking up the correct site to use based on the request hostname
171
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    51
    """
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    52
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    53
    def __init__ (self, path) :
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    54
        """
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    55
            Initialize to load site modules from the given path
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    56
        """
171
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    57
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    58
        self.path = path
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    59
        self.site_cache = dict()
171
5ad9e9459cab route requests through sites/www.qmsk.net, although still hardcoded
Tero Marttila <terom@fixme.fi>
parents: 170
diff changeset
    60
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    61
    def handle_request (self, request) :
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    62
        """
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    63
            Lookup and return a Site object for the given request
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    64
        """
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    65
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    66
        # request hostnmae
177
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 172
diff changeset
    67
        name = request.env['HTTP_HOST']
172
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    68
        
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    69
        # already loaded?
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    70
        if name in self.site_cache :
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    71
            site = self.site_cache[name]
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    72
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    73
        else :
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    74
            # first, we need to find it
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    75
            file, pathname, description = imp.find_module(name, [self.path])
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    76
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    77
            # then, we can load the module
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    78
            module = imp.load_module(name, file, pathname, description)
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    79
            
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    80
            # then build+cache the SiteModule
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    81
            site = self.site_cache[name] = SiteModule(name, module)
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    82
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    83
        # then execute the site's request handler
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    84
        return site.handle_request(request)
0797aa26beaf bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 171
diff changeset
    85