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__