urltree.py
author Tero Marttila <terom@fixme.fi>
Mon, 09 Feb 2009 05:44:12 +0200
changeset 51 a1da82870a6b
parent 50 e4fbf480fbee
child 52 2136cdc95b86
permissions -rw-r--r--
implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    Tree-based URL mapping
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
import re
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
import os.path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
46
54c5f5f340de reduce to qmsk.web lib
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
     8
from qmsk.web import map
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
class URLError (Exception) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
        Error with an URL definition
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    pass
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
class LabelValue (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
        Represents the value of a ValueLabel... love these names
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    22
    def __init__ (self, label, value, is_default) :
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
            Just store
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
        self.label = label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
        self.value = value
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    29
        self.is_default = is_default
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    def __str__ (self) :
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    32
        return "%s%s" % (self.label.key, "=%r" % (self.value, ) if not self.is_default else '')
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
    def __repr__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
        return "<%s>" % self
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
class Label (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        Base class for URL labels (i.e. the segments of the URL between /s)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    @staticmethod
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
    43
    def parse (mask, defaults, config) :
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
        """
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
    45
            Parse the given label-segment, and return a *Label instance. Config is the URLConfig to use
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
        # empty?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
        if not mask :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
            return EmptyLabel()
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        # simple value?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
        match = SimpleValueLabel.EXPR.match(mask)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        if match :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
            # key
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
            key = match.group('key')
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
            # type
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    60
            type_name = match.group("type")
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
            
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
    62
            # lookup type, None -> default
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    63
            type = config.get_type(type_name)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
            # defaults?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
            default = defaults.get(key)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
            if not default :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
                default = match.group('default')
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
                if default :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
                    # apply type to default
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
    73
                    default = type.parse(default)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
            # build
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    76
            return SimpleValueLabel(key, type_name, type, default)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
        # static?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
        match = StaticLabel.EXPR.match(mask)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        if match :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
            return StaticLabel(match.group('name'))
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
        # invalid
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        raise URLError("Invalid label: %r" % (mask, ))
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
            Match this label against the given value, returning either True to match without a value, a LabelValue
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
            object, or boolean false to not match.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
            If value is None, this means that only a default value should be returned.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
        abstract
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    96
    
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    97
    def build (self, value_dict) :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    98
        """
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    99
            Return a string representing this label, using the values in the given value_dict if needed
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   100
        """
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   101
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   102
        abstract
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   104
    def build_default (self, value_dict) :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   105
        """
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   106
            Return an (is_default, value) tuple
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   107
        """
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   108
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   109
        abstract
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   110
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   111
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
class EmptyLabel (Label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
        An empty label, i.e. just a slash in the URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    def __eq__ (self, other) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
            Just compares type
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
        return isinstance(other, EmptyLabel)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
            Match empty string -> True
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
        # no default
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
        if value is None :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
            return False
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
        # only empty segments
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
        if value == '' :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
            return True
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   136
    
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   137
    def build (self, values) :
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   138
        return ''
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   139
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   140
    def build_default (self, values) :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   141
        return (False, '')
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
        return ''
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
class StaticLabel (Label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
        A simple literal Label, used for fixed terms in the URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
    EXPR = re.compile(r'^(?P<name>[a-zA-Z_.-]+)$')
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
    def __init__ (self, name) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
            The given name is the literal name of this label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
        self.name = name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
    def __eq__ (self, other) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
            Compares names
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
        return isinstance(other, StaticLabel) and self.name == other.name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
            Match exactly -> True
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
        # no defaults
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
        if value is None :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
            return False
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
        # match name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
        if value == self.name :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
            return True
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   180
    def build (self, values) :
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   181
        return self.name
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   182
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   183
    def build_default (self, values) :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   184
        return (False, self.name)
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   185
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
        return self.name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
class ValueLabel (Label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
        A label with a key and a value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
        XXX: do we even need this?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
    def __init__ (self, key, default) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
            Set the key and default value. Default value may be None if there is no default value defined
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
        self.key = key
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
        self.default = default
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
    def __eq__ (self, other) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
            Compares keys
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
        return isinstance(other, ValueLabel) and self.key == other.key
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   210
    
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   211
    def build (self, values) :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   212
        """
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   213
            Return either the assigned value from values, our default value, or raise an error
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   214
        """
48
480adab03749 fix to use URLtype for building URL ValueLabels
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   215
        
480adab03749 fix to use URLtype for building URL ValueLabels
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   216
        # lookup the value obj to use
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   217
        value = values.get(self.key)
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   218
        
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   219
        if not value and self.default is not None :
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   220
            value = self.default
48
480adab03749 fix to use URLtype for building URL ValueLabels
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   221
        
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   222
        elif not value :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   223
            raise URLError("No value given for label %r" % (self.key, ))
48
480adab03749 fix to use URLtype for building URL ValueLabels
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   224
        
480adab03749 fix to use URLtype for building URL ValueLabels
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   225
        # convert value back to str
480adab03749 fix to use URLtype for building URL ValueLabels
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   226
        value = self.type.build(value)
480adab03749 fix to use URLtype for building URL ValueLabels
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   227
        
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   228
        return value
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   230
    def build_default (self, values) :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   231
        """
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   232
            Check if we have a value in values, and return based on that
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   233
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   234
            XXX: copy-paste from build()
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   235
        """
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   236
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   237
        # state
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   238
        is_default = False
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   239
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   240
        # lookup the value obj to use
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   241
        value = values.get(self.key)
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   242
        
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   243
        if not value and self.default is not None :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   244
            is_default = True
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   245
            value = self.default
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   246
        
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   247
        elif not value :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   248
            raise URLError("No value given for label %r" % (self.key, ))
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   249
        
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   250
        # convert value back to str
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   251
        value = self.type.build(value)
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   252
        
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   253
        # return
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   254
        return (is_default, value)
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   255
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   256
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
class SimpleValueLabel (ValueLabel) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
        A label that has a name and a simple string value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   260
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
    EXPR = re.compile(r'^\{(?P<key>[a-zA-Z_][a-zA-Z0-9_]*)(:(?P<type>[a-zA-Z_][a-zA-Z0-9_]*))?(=(?P<default>[^}]+))?\}$')
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   264
    def __init__ (self, key, type_name, type, default) :
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   265
        """
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   266
            The given key is the name of this label's value.
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   267
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   268
            The given type_name is is None for the default type, otherwise the type's name. Type is a URLType.
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
        # type
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   272
        self.type_name = type_name
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
        self.type = type
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
        # store
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
        self.key = key
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   277
        self.default = default
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   278
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   281
            Match -> LabelValue
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   282
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   284
        # default?
50
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   285
        if value is None and self.default is not None :
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   286
            return LabelValue(self, self.default, True)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   287
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   288
        # only non-empty values!
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
        elif value :
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   290
            # test
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   291
            if not self.type.test(value) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   292
                return False
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   293
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
            # convert with type
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   295
            value = self.type.parse(value)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   296
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   297
            return LabelValue(self, value, False)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   298
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   299
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   300
        return '{%s%s%s}' % (
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   301
            self.key, 
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   302
            (':%s' % (self.type_name, ) if self.type_name else ''),
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   303
            '=%s' % (self.default, ) if self.default else '',
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   304
        )
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   305
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   306
class URLType (object) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   307
    """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   308
        Handles the type-ness of values in the URL
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   309
    """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   310
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   311
    def test (self, value) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   312
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   313
            Tests if the given value is valid for this type.
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   314
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   315
            Defaults to calling parse(), and returning False on errors, True otherwise
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   316
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   317
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   318
        try :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   319
            self.parse(value)
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   320
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   321
        except :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   322
            return False
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   323
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   324
        else :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   325
            return True
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   326
    
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   327
    def parse (self, value) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   328
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   329
            Parse the given value, which was tested earlier with test(), and return the value object
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   330
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   331
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   332
        abstract
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   333
    
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   334
   
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   335
    def build (self, obj) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   336
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   337
            Reverse of parse(), return an url-value built from the given object
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   338
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   339
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   340
        abstract
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   341
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   342
class URLStringType (URLType) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   343
    """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   344
        The default URLType, just plain strings.
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   345
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   346
        Note that this does not accept empty strings as valid
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   347
    """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   348
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   349
    def parse (self, value) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   350
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   351
            Identitiy
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   352
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   353
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   354
        return value
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   355
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   356
    def build (self, obj) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   357
        if not obj :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   358
            raise ValueError("String must not be empty")
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   359
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   360
        return str(obj)
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   361
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   362
class URLIntegerType (URLType) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   363
    """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   364
        A URLType for simple integers
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   365
    """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   366
50
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   367
    def __init__ (self, allow_negative=True, allow_zero=True, max=None) :
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   368
        """
50
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   369
            Pass in allow_negative=False to disallow negative numbers, allow_zero=False to disallow zero, or non-zero
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   370
            max to specifiy maximum value
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   371
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   372
50
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   373
        self.allow_negative = allow_negative
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   374
        self.allow_zero = allow_zero
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   375
        self.max = max
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   376
    
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   377
    def _validate (self, value) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   378
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   379
            Test to make sure value fits our criteria
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   380
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   381
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   382
        # negative?
50
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   383
        if not self.allow_negative and value < 0 :
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   384
            raise ValueError("value is negative")
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   385
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   386
        # zero?
50
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   387
        if not self.allow_zero and value == 0 :
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   388
            raise ValueError("value is zero")
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   389
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   390
        # max?
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   391
        if self.max is not None and value > max :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   392
            raise ValueError("value is too large: %d" % value)
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   393
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   394
        return value
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   395
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   396
    def parse (self, value) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   397
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   398
            Convert str -> int
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   399
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   400
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   401
        return self._validate(int(value))
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   402
    
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   403
    def build (self, obj) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   404
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   405
            Convert int -> str
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   406
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   407
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   408
        return unicode(self._validate(obj))
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   409
    
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   410
class URLConfig (object) :
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   411
    """
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   412
        Global configuration relevant to all URLs. This can be used to construct a set of URLs and then create an
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   413
        URLTree out of them. Simply call the url_config() instace with the normal URL arguments (except, of course,
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   414
        config), and finally just pass the url_config to URLTree (it's iterable).
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   415
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   416
        XXX: rename to URLFactory?
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   417
    """
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   418
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   419
    # built-in type codes
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   420
    BUILTIN_TYPES = {
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   421
        # default - string
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   422
        None    : URLStringType(),
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   423
43
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   424
        # string
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   425
        'str'   : URLStringType(),
43
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   426
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   427
        # integer
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   428
        'int'   : URLIntegerType(),
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   429
    }
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   430
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   431
    def __init__ (self, type_dict=None, ignore_extra_args=True) :
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   432
        """
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   433
            Create an URLConfig for use with URL
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   434
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   435
            If type_dict is given, it should be a dict of { type_names: URLType }, and they will be available for
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   436
            type specifications in addition to the defaults. This will call type._init_name with the key, so do
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   437
            *not* initialize the name yourself.
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   438
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   439
            If ignore_extra_args is given, unrecognized query arguments will be ignored.
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   440
        """
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   441
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   442
        # build our type_dict
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   443
        self.type_dict = self.BUILTIN_TYPES.copy()
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   444
        
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   445
        # apply the given type_dict
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   446
        if type_dict :
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   447
            # merge
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   448
            self.type_dict.update(type_dict)
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   449
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   450
        # init
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   451
        self.ignore_extra_args = ignore_extra_args
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   452
        self.urls = []
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   453
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   454
    def get_type (self, type_name=None) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   455
        """
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   456
            Lookup an URLType by type_name, None for default.
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   457
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   458
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   459
        # lookup + return
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   460
        return self.type_dict[type_name]
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   461
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   462
    def __call__ (self, *args, **kwargs) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   463
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   464
            Return new URL object with this config and the given args, adding it to our list of urls
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   465
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   466
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   467
        # build
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   468
        url = URL(self, *args, **kwargs)
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   469
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   470
        # store
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   471
        self.urls.append(url)
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   472
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   473
        # return
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   474
        return url
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   475
    
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   476
    def __iter__ (self) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   477
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   478
            Returns all defined URLs
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   479
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   480
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   481
        return iter(self.urls)
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   482
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   483
class URL (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   484
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   485
        Represents a specific URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   486
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   487
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   488
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   489
    def __init__ (self, config, url_mask, handler, **defaults) :
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   490
        """
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   491
            Create an URL using the given URLConfig, with the given url mask, handler, and default values.
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   492
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   493
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   494
        # store
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   495
        self.config = config
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   496
        self.url_mask = url_mask
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   497
        self.handler = handler
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   498
        self.defaults = defaults
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   499
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   500
        # query string
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   501
        self.query_args = dict()
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   502
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   503
        # remove prepending root /
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   504
        url_mask = url_mask.lstrip('/')
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   505
        
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   506
        # parse any query string
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   507
        # XXX: conflicts with regexp syntax
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   508
        if '/?' in url_mask :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   509
            url_mask, query_mask = url_mask.split('/?')
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   510
        
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   511
        else :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   512
            query_mask = None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   513
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   514
        # build our label path
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   515
        self.label_path = [Label.parse(mask, defaults, config) for mask in url_mask.split('/')]
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   516
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   517
        # build our query args list
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   518
        if query_mask :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   519
            # split into items
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   520
            for query_item in query_mask.split('&') :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   521
                # parse default
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   522
                if '=' in query_item :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   523
                    query_item, default = query_item.split('=')
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   524
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   525
                else :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   526
                    default = None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   527
                
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   528
                # parse type
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   529
                if ':' in query_item :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   530
                    query_item, type = query_item.split(':')
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   531
                else :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   532
                    type = None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   533
                
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   534
                # parse key
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   535
                key = query_item
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   536
43
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   537
                # type
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   538
                type = self.config.get_type(type)
43
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   539
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   540
                # add to query_args as (type, default) tuple
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   541
                self.query_args[key] = (type, type.parse(default) if default else default)
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   542
         
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   543
    def get_label_path (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   544
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   545
            Returns a list containing the labels in this url
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   546
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   547
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   548
        # copy self.label_path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   549
        return list(self.label_path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   550
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   551
    def execute (self, request, label_values) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   552
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   553
            Invoke the handler, using the given label values
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   554
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   555
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   556
        # start with the defaults
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   557
        kwargs = self.defaults.copy()
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   558
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   559
        # ...dict of those label values which are set to defaults
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   560
        default_labels = {}
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   561
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   562
        # then add all the values
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   563
        for label_value in label_values :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   564
            kwargs[label_value.label.key] = label_value.value
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   565
            
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   566
            # add key to default_values?
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   567
            if label_value.is_default :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   568
                default_labels[label_value.label.key] = label_value.label
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   569
       
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   570
        # then parse all query args
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   571
        for key, value in request.get_args() :
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   572
            # lookup in our defined query args
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   573
            if key in self.query_args :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   574
                # lookup spec
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   575
                type, default = self.query_args[key]
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   576
            
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   577
            # override URL params if they were not given
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   578
            elif key in default_labels :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   579
                type, default = default_labels[key].type, None
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   580
            
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   581
            # be strict about extraneous query args?
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   582
            elif self.config.ignore_extra_args :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   583
                raise URLError("Unrecognized query argument: %r" % (key, ))
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   584
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   585
            # normalize empty value to None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   586
            if not value :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   587
                value = None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   588
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   589
            else :
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   590
                # parse value
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   591
                value = type.parse(value)
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   592
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   593
            # set default?
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   594
            if not value :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   595
                if default :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   596
                    value = default
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   597
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   598
                if default == '' :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   599
                    # do not pass key at all
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   600
                    continue
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   601
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   602
                # otherwise, fail
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   603
                raise URLError("No value given for required argument: %r" % (key, ))
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   604
            
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   605
            # set key
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   606
            kwargs[key] = value
43
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   607
        
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   608
        # then check all query args
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   609
        for key, (type, default) in self.query_args.iteritems() :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   610
            # skip those already present
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   611
            if key in kwargs :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   612
                continue
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   613
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   614
            # apply default?
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   615
            if default is None :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   616
                raise URLError("Missing required argument: %r" % (key, ))
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   617
            
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   618
            elif default == '' :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   619
                # skip empty default
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   620
                continue
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   621
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   622
            else :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   623
                # set default
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   624
                kwargs[key] = default
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   625
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   626
        # execute the handler
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   627
        return self.handler(request, **kwargs)
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   628
    
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   629
    def build (self, request, **values) :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   630
        """
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   631
            Build an absolute URL pointing to this target, with the given values. Default values are left off if they
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   632
            are at the end of the URL.
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   633
        """
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   634
        
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   635
        # collect segments as a list of (is_default, segment) values
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   636
        segments = [(False, request.page_prefix)] + [label.build_default(values) for label in self.label_path]
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   637
        
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   638
        # trim default items off the end
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   639
        for is_default, segment in segments[::-1] :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   640
            if is_default :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   641
                segments.pop(-1)
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   642
            
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   643
            else :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   644
                break
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   645
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   646
        assert segments
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   647
        
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   648
        # join
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   649
        return '/'.join(segment for is_default, segment in segments)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   650
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   651
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   652
        return '/'.join(str(label) for label in self.label_path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   653
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   654
    def __repr__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   655
        return "URL(%r, %r)" % (str(self), self.handler)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   656
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   657
class URLNode (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   658
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   659
        Represents a node in the URLTree
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   660
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   661
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   662
    def __init__ (self, parent, label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   663
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   664
            Initialize with the given parent and label, empty children dict
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   665
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   666
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   667
        # the parent URLNode
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   668
        self.parent = parent
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   669
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   670
        # this node's Label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   671
        self.label = label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   672
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   673
        # list of child URLNodes
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   674
        self.children = []
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   675
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   676
        # this node's URL, set by add_url for an empty label_path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   677
        self.url = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   678
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   679
    def _build_child (self, label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   680
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   681
            Build, insert and return a new child Node
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   682
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   683
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   684
        # build new child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   685
        child = URLNode(self, label)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   686
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   687
        # add to children
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   688
        self.children.append(child)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   689
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   690
        # return
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   691
        return child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   692
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   693
    def add_url (self, url, label_path) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   694
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   695
            Add a URL object to this node under the given path. Uses recursion to process the path.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   696
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   697
            The label_path argument is a (partial) label path as returned by URL.get_label_path.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   698
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   699
            If label_path is empty (len zero, or begins with EmptyLabel), then the given url is assigned to this node, if no
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   700
            url was assigned before.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   701
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   702
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   703
        # matches this node?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   704
        if not label_path or isinstance(label_path[0], EmptyLabel) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   705
            if self.url :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   706
                raise URLError(url, "node already defined")
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   707
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   708
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   709
                # set
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   710
                self.url = url
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   711
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   712
        else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   713
            # pop child label from label_path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   714
            child_label = label_path.pop(0)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   715
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   716
            # look for the child to recurse into
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   717
            child = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   718
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   719
            # look for an existing child with that label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   720
            for child in self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   721
                if child.label == child_label :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   722
                    # found, use this
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   723
                    break
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   724
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   725
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   726
                # build a new child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   727
                child = self._build_child(child_label)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   728
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   729
            # recurse to handle the rest of the label_path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   730
            child.add_url(url, label_path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   731
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   732
    def match (self, label_path) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   733
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   734
            Locate the URL object corresponding to the given label_path value under this node.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   735
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   736
            Returns a (url, label_values) tuple
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   737
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   738
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   739
        # determine value to use
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   740
        value = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   741
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   742
        # empty label_path?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   743
        if not label_path or label_path[0] == '' :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   744
            # the search ends at this node
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   745
            if self.url :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   746
                # this URL is the best match
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   747
                return (self.url, [])
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   748
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   749
            elif not self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   750
                # incomplete URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   751
                raise URLError("no URL handler defined for this Node")
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   752
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   753
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   754
                # use default value, i.e. Label.match(None)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   755
                label = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   756
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   757
        else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   758
            # pop the next label from the label path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   759
            label = label_path.pop(0)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   760
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   761
        # return one match...
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   762
        match = value = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   763
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   764
        # recurse through our children, DFS
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   765
        for child in self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   766
            # match value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   767
            value = child.label.match(label)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   768
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   769
            # skip those that don't match at all
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   770
            if not value :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   771
                continue;
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   772
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   773
            # already found a match? :/
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   774
            if match :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   775
                raise URLError("Ambiguous URL")
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   776
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   777
            # ok, but continue looking to make sure there's no ambiguous URLs
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   778
            match = child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   779
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   780
        # found something?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   781
        if not match :
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   782
            raise URLError("No child found for label: %s + %s + %s" % (self.get_url(), label, '/'.join(str(l) for l in label_path)))
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   783
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   784
        # ok, recurse into the match
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   785
        url, label_value = match.match(label_path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   786
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   787
        # add our value?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   788
        if isinstance(value, LabelValue) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   789
            label_value.append(value)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   790
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   791
        # return the match
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   792
        return url, label_value
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   793
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   794
    def get_url (self) :
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   795
        """
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   796
            Returns the URL for this node, by iterating over our parents
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   797
        """
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   798
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   799
        # URL segments in reverse order
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   800
        segments = ['']
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   801
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   802
        # start with ourself
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   803
        node = self
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   804
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   805
        # iterate up to root
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   806
        while node :
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   807
            segments.append(str(node.label))
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   808
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   809
            node = node.parent
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   810
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   811
        # reverse
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   812
        segments.reverse()
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   813
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   814
        # return
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   815
        return '/'.join(segments)
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   816
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   817
    def dump (self, indent=0) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   818
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   819
            Returns a multi-line string representation of this Node
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   820
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   821
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   822
        return '\n'.join([
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   823
            "%-45s%s" % (
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   824
                ' '*indent + str(self.label) + ('/' if self.children else ''), 
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   825
                (' -> %r' % self.url) if self.url else ''
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   826
            )
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   827
        ] + [
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   828
            child.dump(indent + 4) for child in self.children
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   829
        ])
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   830
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   831
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   832
        return "%s/[%s]" % (self.label, ','.join(str(child) for child in self.children))
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   833
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   834
class URLTree (map.Mapper) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   835
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   836
        Map requests to handlers, using a defined tree of URLs
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   837
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   838
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   839
    def __init__ (self, url_list) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   840
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   841
            Initialize the tree using the given list of URLs
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   842
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   843
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   844
        # root node
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   845
        self.root = URLNode(None, EmptyLabel())
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   846
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   847
        # just add each URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   848
        for url in url_list :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   849
            self.add_url(url)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   850
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   851
    def add_url (self, url) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   852
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   853
            Adds the given URL to the tree. The URL must begin with a root slash.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   854
        """
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   855
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   856
        # get url's label path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   857
        path = url.get_label_path()
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   858
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   859
        # add to root
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   860
        self.root.add_url(url, path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   861
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   862
    def match (self, url) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   863
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   864
            Find the URL object best corresponding to the given url, matching any ValueLabels.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   865
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   866
            Returns an (URL, [LabelValue]) tuple.
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   867
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   868
            XXX: handle unicode on URLs
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   869
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   870
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   871
        # split it into labels
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   872
        path = url.split('/')
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   873
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   874
        # empty URL is empty
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   875
        if url :
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   876
            # ensure that it doesn't start with a /
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   877
            assert not self.root.label.match(path[0]), "URL must not begin with root"
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   878
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   879
        # just match starting at root
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   880
        return self.root.match(path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   881
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   882
    def handle_request (self, request) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   883
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   884
            Looks up the request's URL, and invokes its handler
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   885
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   886
        
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   887
        # get the requested URL
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   888
        request_url = request.get_page_name()
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   889
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   890
        # find the URL+values to use
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   891
        url, label_values = self.match(request_url)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   892
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   893
        # let the URL handle it
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   894
        return url.execute(request, label_values)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   895
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   896