site/request.py
author Tero Marttila <terom@fixme.fi>
Tue, 02 Dec 2008 03:16:22 +0200
changeset 3 84a149e35cbe
parent 2 ec68a0f75c58
permissions -rw-r--r--
fix get_site_url to not return trailing slashes
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 os.path
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
def get_site_url (script_name) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
    """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
        Get the URL that points to the site root (i.e. where style.css is) using the given value of SCRIPT_NAME
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
        /foo/bar/quux.py                -> /foo
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
        /~terom/qmsk.net/site/index.py  -> /~terom/qmsk.net
3
84a149e35cbe fix get_site_url to not return trailing slashes
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    10
        /                               -> ""
84a149e35cbe fix get_site_url to not return trailing slashes
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    11
        None                            -> ""
2
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    if script_name :
3
84a149e35cbe fix get_site_url to not return trailing slashes
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    15
        return os.path.dirname(os.path.dirname(script_name)).rstrip("/")
2
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    else :
3
84a149e35cbe fix get_site_url to not return trailing slashes
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    17
        return ""
2
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
def get_page_path (path_info, default) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
        Get the path of the page that was requested, or the given default is empty/invalid.
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
        The path will never begin with an /.
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
        /quux       -> quux
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        /           -> <default>
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        None        -> <default>
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    if path_info :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
        # remove prefixed slashes
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        path_info = path_info.lstrip('/')
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    if path_info :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
        return path_info
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    else :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
        return default
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
class Request (object) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    # The name of the site itself, this can be used to reference e.g. style.css
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    site_url = None
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
    # The page root url, for links to pages
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    page_root = None
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
    # The full path to the requested page
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    page_path = None
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 __init__ (self, environ, default_page='main') :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
        self.site_url = get_site_url(environ.get("SCRIPT_NAME"))
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
        self.page_root = environ.get("SCRIPT_NAME")
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        self.page_path = get_page_path(environ.get("PATH_INFO"), default_page)
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
    
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    def page_name_parts (self) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
            Returns a list of page name components
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
        """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
        return self.page_path.split('/')
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    def page_name_prefixes (self) :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
            Iterate over the components of the page name, yielding (prefix, suffix) pairs
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
        """
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
        
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        prefix = self.page_name_parts()
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
        suffix = []
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
        while prefix :
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
            yield ('/'.join(prefix), '/'.join(suffix))
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
            suffix.insert(0, prefix.pop(-1))
ec68a0f75c58 python functionality...
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73