I believe this problem was fixed in 1.65.10. Am I wrong?

Massimo

On Aug 4, 3:23 pm, Jonathan Lundell <jlund...@pobox.com> wrote:
> On Aug 4, 2009, at 9:38 AM, Jonathan Lundell wrote:
>
>
>
>
>
> > On Aug 3, 2009, at 8:33 AM, Jose wrote:
>
> >> I have just tried this in Windows XP(r1153) + python 2.5.x
>
> >> db.define_table('unatabla',
> >>   Field('nombre'),
> >>   Field('imagen', 'upload'),
> >> )
>
> >> The following mistake takes is produced when I do submit:
>
> >> Error traceback
> >> Traceback (most recent call last):
> >> File "E:\web2py2\gluon\restricted.py", line 178, in restricted
> >>   exec ccode in environment
> >> File "E:/web2py2/applications/prueba/controllers/appadmin.py", line
> >> 255, in <module>
> >> File "E:\web2py2\gluon\globals.py", line 101, in <lambda>
> >>   self._caller = lambda f: f()
> >> File "E:/web2py2/applications/prueba/controllers/appadmin.py", line
> >> 104, in insert
> >>   if form.accepts(request.vars, session):
> >> File "E:\web2py2\gluon\sqlhtml.py", line 809, in accepts
> >>   if not f:
> >> File "E:\Python25\lib\cgi.py", line 633, in __len__
> >>   return len(self.keys())
> >> File "E:\Python25\lib\cgi.py", line 609, in keys
> >>   raise TypeError, "not indexable"
> >> TypeError: not indexable
>
> > I took a quick look at the code behind this trace, and I can offer a
> > small clue. I don't know enough about what's going on to offer a
> > solution, but perhaps it'll ring a bell for someone who understands
> > the code better than I do.
>
> > Here's the code in the tree:
>
> >>            elif field.type == 'upload':
> >>                f = self.vars[fieldname]
> >>                fd = fieldname + '__delete'
> >>                if not f:
>
> > This used to be f == ''.
>
> >>                    if self.vars.get(fd, False) or not self.record:
> >>                        fields[fieldname] = ''
> >>                    else:
> >>                        fields[fieldname] = self.record[fieldname]
> >>                    continue
> >>                elif not isinstance(f, (str, unicode)):
> >>                    (source_file, original_filename) = (f.file,
> >> f.filename)
> >>                else:
> >>                    ### do not know why this happens, it should not
>
> > This comment bothers me, and I wonder if it might be related.
>
> >>                    (source_file, original_filename) = \
> >>                        (cStringIO.StringIO(f), 'file.txt')
> >>                logging.warn('here')
> >>                fields[fieldname] = field.store(source_file,
> >> original_filename)
> >>                logging.warn('there')
> >>                if field.uploadfield and not field.uploadfield==True:
> >>                    fields[field.uploadfield] = source_file.read()
> >>                continue
>
> > In the failing case, f appears to be an instance of FieldStorage, from
> > cgi.py. It appears that Python implements "if not f" as "if not
> > len(f)". FieldStorage defines __len__ as "len(self.keys()), and that's
> > where we run into trouble.
>
> >     def keys(self):
> >         """Dictionary style keys() method."""
> >         if self.list is None:
> >             raise TypeError, "not indexable"
> >         keys = []
> >         for item in self.list:
> >             if item.name not in keys: keys.append(item.name)
> >         return keys
>
> > And self.list is None unless one of two things happens:
>
> >         if ctype == 'application/x-www-form-urlencoded':
> >             self.read_urlencoded()
> >         elif ctype[:10] == 'multipart/':
> >             self.read_multi(environ, keep_blank_values,  
> > strict_parsing)
> >         else:
> >             self.read_single()
>
> > Only the first two calls (read_urlencoded() and read_multi()) set
> > self.list to a list. Otherwise it's None, and our 'if not f' will be
> > sent an exception.
>
> > If this case is expected, or at should be a detectable error
> > condition, then perhaps we should catch the exception and treat it as
> > a case of 'not f'. Or something. But as I say, I don't really know
> > enough about the intent of this code to go any farther.
>
> I see that in 2.6, FieldStorage has a __nonzero__() method that does  
> the right thing (and will be used in preference to __len__).
>
> So part of the problem you guys are seeing might be the difference in  
> how 2.6 (vs 2.5) handles "if not f".
>
> Anyway, I don't see how the sqlhtml upload logic deals with f being a  
> FieldStorage object.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To post to this group, send email to web2py@googlegroups.com
To unsubscribe from this group, send email to 
web2py+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to