I agree with Graham on all points. And may be this is a good chance for us to start checking some stuff in after this long while.... :)
Grisha On Mon, Mar 1, 2010 at 5:41 PM, Graham Dumpleton <[email protected] > wrote: > Please log a bug report at: > > https://issues.apache.org/jira/browse/MODPYTHON > > No one else has likely found this because deleting stuff out of > FieldStorage is not the norm. People would normally translate the > contents into some other data structure and manipulate it there. > > Do note that there has been no active development on mod_python for > quite a long time, so don't expect to see any updated version until > someone new decides to take ownership of the project. > > Graham > > On 2 March 2010 02:04, Anders Blomdell <[email protected]> > wrote: > > Anders Blomdell wrote: > >> Hi, > >> > >> When a FieldStorage has two (or more) Filed instances with the same > value but > >> different names, the behaviour of programs like this is (more or less) > undefined: > >> > >> fs = util.FieldStorage(req) > >> fs['id1'] = 'New value' > >> del fs['id2'] > >> > >> The reason for the undefinedness, is this code in __delitem__ (and the > similar > >> in __setitem__): > >> > >> table = self.list.table() > >> values = table[key] > >> for value in values: > >> self.list.remove(value) > >> > >> What happens is that the self.list.remove(value) will remove the first > field > >> with a matching value, regardless of that fields name. Here is an > example from > >> real life: > >> > >> form.clear() > >> form['id1'] = 'x' > >> form['id2'] = 'x' > >> form['id3'] = 'x' > >> # Form now contains {'id2': [Field('id2', 'x')], > >> # 'id3': [Field('id3', 'x')], > >> # 'id1': [Field('id1', 'x')]} > >> form['id2'] = 'y' > >> # Form now contains {'id2': [Field('id2', 'x'), Field('id2', 'y')], > >> # 'id3': [Field('id3', 'x')]} > >> # which is not what I would have expected > >> > >> > >> In my simple example, one solution, is to add the following method to > StringField: > >> > >> def __eq__(self, other): > >> return self.value == other.value and self.name == other.name > >> > >> but this does not properly handle mixing Field and StringField. Anybody > has a > >> better solution? > > > > Some more thinking made me come up with the patch below. > > > > Regards > > > > Anders > > > > --- /usr/lib/python2.6/site-packages/mod_python/util.py.orig > 2006-11-22 > > 12:15:54.000000000 +0100 > > +++ /usr/lib/python2.6/site-packages/mod_python/util.py 2010-03-01 > > 16:00:30.000000000 +0100 > > @@ -145,6 +145,12 @@ > > self.__table[item.name] = [item] > > return self.__table > > > > + def delete_name(self, name): > > + self.__table = None > > + for i in range(len(self) - 1, -1, -1): > > + if self[i].name == name: > > + self.pop(i) > > + > > def __delitem__(self, *args): > > self.__table = None > > return list.__delitem__(self, *args) > > @@ -348,11 +354,8 @@ > > self.list.append(item) > > > > def __setitem__(self, key, value): > > - table = self.list.table() > > - if table.has_key(key): > > - items = table[key] > > - for item in items: > > - self.list.remove(item) > > + if self.list.table().has_key(key): > > + self.list.delete_name(key) > > item = StringField(value) > > item.name = key > > self.list.append(item) > > @@ -460,10 +463,8 @@ > > return [(item.name, item) for item in self.list] > > > > def __delitem__(self, key): > > - table = self.list.table() > > - values = table[key] > > - for value in values: > > - self.list.remove(value) > > + if self.list.table().has_key(key): > > + self.list.delete_name(key) > > > > def clear(self): > > self.list = FieldList() > > > > > > > > -- > > Anders Blomdell Email: [email protected] > > Department of Automatic Control > > Lund University Phone: +46 46 222 4625 > > P.O. Box 118 Fax: +46 46 138118 > > SE-221 00 Lund, Sweden > > > >
