Mercurial > p > roundup > code
diff roundup/cgi/client.py @ 1905:dc43e339e607
Centralised conversion of user-input data to hyperdb values
(bug [SF#802405], bug [SF#817217], rfe [SF#816994])
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Tue, 11 Nov 2003 00:35:14 +0000 |
| parents | dc6f2155e5b4 |
| children | f5c804379c85 |
line wrap: on
line diff
--- a/roundup/cgi/client.py Mon Nov 10 03:56:39 2003 +0000 +++ b/roundup/cgi/client.py Tue Nov 11 00:35:14 2003 +0000 @@ -1,4 +1,4 @@ -# $Id: client.py,v 1.143 2003-10-24 09:32:19 jlgijsbers Exp $ +# $Id: client.py,v 1.144 2003-11-11 00:35:14 richard Exp $ __doc__ = """ WWW request handler (also used in the stand-alone server). @@ -1675,51 +1675,18 @@ if value != confirm.value: raise FormError, 'Password and confirmation text do '\ 'not match' - value = password.Password(value) + try: + value = password.Password(value) + except hyperdb.HyperdbValueError, msg: + raise FormError, msg - elif isinstance(proptype, hyperdb.Link): - # see if it's the "no selection" choice - if value == '-1' or not value: - # if we're creating, just don't include this property - if not nodeid or nodeid.startswith('-'): - continue - value = None - else: - # handle key values - link = proptype.classname - if not num_re.match(value): - try: - value = db.classes[link].lookup(value) - except KeyError: - raise FormError, _('property "%(propname)s": ' - '%(value)s not a %(classname)s')%{ - 'propname': propname, 'value': value, - 'classname': link} - except TypeError, message: - raise FormError, _('you may only enter ID values ' - 'for property "%(propname)s": %(message)s')%{ - 'propname': propname, 'message': message} elif isinstance(proptype, hyperdb.Multilink): - # perform link class key value lookup if necessary - link = proptype.classname - link_cl = db.classes[link] - l = [] - for entry in value: - if not entry: continue - if not num_re.match(entry): - try: - entry = link_cl.lookup(entry) - except KeyError: - raise FormError, _('property "%(propname)s": ' - '"%(value)s" not an entry of %(classname)s')%{ - 'propname': propname, 'value': entry, - 'classname': link} - except TypeError, message: - raise FormError, _('you may only enter ID values ' - 'for property "%(propname)s": %(message)s')%{ - 'propname': propname, 'message': message} - l.append(entry) - l.sort() + # convert input to list of ids + try: + l = hyperdb.rawToHyperdb(self.db, cl, nodeid, + propname, value) + except hyperdb.HyperdbValueError, msg: + raise FormError, msg # now use that list of ids to modify the multilink if mlaction == 'set': @@ -1753,13 +1720,10 @@ value.sort() elif value == '': - # if we're creating, just don't include this property - if not nodeid or nodeid.startswith('-'): - continue # other types should be None'd if there's no value value = None else: - # handle ValueErrors for all these in a similar fashion + # handle all other types try: if isinstance(proptype, hyperdb.String): if (hasattr(value, 'filename') and @@ -1777,23 +1741,17 @@ props['type'] = mimetypes.guess_type(fn)[0] if not props['type']: props['type'] = "application/octet-stream" - # finally, read the content + # finally, read the content RAW value = value.value else: - # normal String fix the CRLF/CR -> LF stuff - value = fixNewlines(value) + value = hyperdb.rawToHyperdb(self.db, cl, + nodeid, propname, value) - elif isinstance(proptype, hyperdb.Date): - value = date.Date(value, offset=timezone) - elif isinstance(proptype, hyperdb.Interval): - value = date.Interval(value) - elif isinstance(proptype, hyperdb.Boolean): - value = value.lower() in ('yes', 'true', 'on', '1') - elif isinstance(proptype, hyperdb.Number): - value = float(value) - except ValueError, msg: - raise FormError, _('Error with %s property: %s')%( - propname, msg) + else: + value = hyperdb.rawToHyperdb(self.db, cl, nodeid, + propname, value) + except hyperdb.HyperdbValueError, msg: + raise FormError, msg # register that we got this property if value: @@ -1881,16 +1839,6 @@ raise FormError, _('File is empty') return all_props, all_links -def fixNewlines(text): - ''' Homogenise line endings. - - Different web clients send different line ending values, but - other systems (eg. email) don't necessarily handle those line - endings. Our solution is to convert all line endings to LF. - ''' - text = text.replace('\r\n', '\n') - return text.replace('\r', '\n') - def extractFormList(value): ''' Extract a list of values from the form value.
