Mercurial > p > roundup > code
diff roundup/mailgw.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 | 9d8d5fa0d9ad |
| children | 20cfd25cffda |
line wrap: on
line diff
--- a/roundup/mailgw.py Mon Nov 10 03:56:39 2003 +0000 +++ b/roundup/mailgw.py Tue Nov 11 00:35:14 2003 +0000 @@ -73,7 +73,7 @@ an exception, the original message is bounced back to the sender with the explanatory message given in the exception. -$Id: mailgw.py,v 1.136 2003-11-03 18:34:03 jlgijsbers Exp $ +$Id: mailgw.py,v 1.137 2003-11-11 00:35:13 richard Exp $ """ import string, re, os, mimetools, cStringIO, smtplib, socket, binascii, quopri @@ -851,11 +851,10 @@ return nodeid -def setPropArrayFromString(self, cl, propString, nodeid = None): +def setPropArrayFromString(self, cl, propString, nodeid=None): ''' takes string of form prop=value,value;prop2=value and returns (error, prop[..]) ''' - properties = cl.getprops() props = {} errors = [] for prop in string.split(propString, ';'): @@ -866,100 +865,13 @@ errors.append('not of form [arg=value,value,...;' 'arg=value,value,...]') return (errors, props) - - # ensure it's a valid property name + # convert the value to a hyperdb-usable value propname = propname.strip() try: - proptype = properties[propname] - except KeyError: - errors.append('refers to an invalid property: "%s"'%propname) - continue - - # convert the string value to a real property value - if isinstance(proptype, hyperdb.String): - props[propname] = value.strip() - if isinstance(proptype, hyperdb.Password): - props[propname] = password.Password(value.strip()) - elif isinstance(proptype, hyperdb.Date): - try: - props[propname] = date.Date(value.strip()).local(self.db.getUserTimezone()) - except ValueError, message: - errors.append('contains an invalid date for %s.'%propname) - elif isinstance(proptype, hyperdb.Interval): - try: - props[propname] = date.Interval(value) - except ValueError, message: - errors.append('contains an invalid date interval for %s.'% - propname) - elif isinstance(proptype, hyperdb.Link): - linkcl = self.db.classes[proptype.classname] - propkey = linkcl.labelprop(default_to_id=1) - try: - props[propname] = linkcl.lookup(value) - except KeyError, message: - errors.append('"%s" is not a value for %s.'%(value, propname)) - elif isinstance(proptype, hyperdb.Multilink): - # get the linked class - linkcl = self.db.classes[proptype.classname] - propkey = linkcl.labelprop(default_to_id=1) - if nodeid: - curvalue = cl.get(nodeid, propname) - else: - curvalue = [] - - # handle each add/remove in turn - # keep an extra list for all items that are - # definitely in the new list (in case of e.g. - # <propname>=A,+B, which should replace the old - # list with A,B) - set = 0 - newvalue = [] - for item in value.split(','): - item = item.strip() - - # handle +/- - remove = 0 - if item.startswith('-'): - remove = 1 - item = item[1:] - elif item.startswith('+'): - item = item[1:] - else: - set = 1 - - # look up the value - try: - item = linkcl.lookup(item) - except KeyError, message: - errors.append('"%s" is not a value for %s.'%(item, - propname)) - continue - - # perform the add/remove - if remove: - try: - curvalue.remove(item) - except ValueError: - errors.append('"%s" is not currently in for %s.'%(item, - propname)) - continue - else: - newvalue.append(item) - if item not in curvalue: - curvalue.append(item) - - # that's it, set the new Multilink property value, - # or overwrite it completely - if set: - props[propname] = newvalue - else: - props[propname] = curvalue - elif isinstance(proptype, hyperdb.Boolean): - value = value.strip() - props[propname] = value.lower() in ('yes', 'true', 'on', '1') - elif isinstance(proptype, hyperdb.Number): - value = value.strip() - props[propname] = float(value) + props[propname] = hyperdb.rawToHyperdb(self.db, cl, nodeid, + propname, value) + except hyperdb.HyperdbValueError, message: + errors.append(message) return errors, props
