0001from UserDict import UserDict
0002from paste import httpexceptions
0003
0004class HTTPVariableNotFound(httpexceptions.HTTPBadRequest, KeyError):
0005    """
0006    Raised when a form variable can't be found.  Catching either of
0007    HTTPBadRequest or KeyError will work, plus this will turn into a
0008    better response when a variable isn't found.
0009    """
0010
0011class Fields(UserDict):
0012
0013    def __init__(self, field_dict):
0014        self.data = field_dict
0015
0016    def __getattr__(self, attr):
0017        if attr.startswith('_'):
0018            raise AttributeError
0019        return self.data[attr]
0020
0021    def __getitem__(self, key):
0022        try:
0023            return self.data[key]
0024        except KeyError:
0025            raise HTTPVariableNotFound(
0026                "The form variable %r was not received" % key)
0027
0028    def __contains__(self, key):
0029        return key in self.data
0030
0031    def __iter__(self):
0032        return iter(self.data)
0033
0034    def getlist(self, name):
0035        """
0036        Return the named item as a list ([] if name not found,
0037        [self[name]] if only one field passed in).
0038        """
0039        v = self.data.get(name, [])
0040        if isinstance(v, list):
0041            return v
0042        return [v]
0043
0044    def itemlist(self):
0045        """
0046        Return a list of (name, [values...]).  Like .items(),
0047        except all values becomes a list (like .getlist()).
0048        """
0049        items = []
0050        for name, value in self.iteritems():
0051            if isinstance(value, list):
0052                items.append((name, value))
0053            else:
0054                items.append((name, [value]))
0055        return items
0056
0057    __str__ = UserDict.__repr__