delete uploads with SQLFORM.factory

239 views
Skip to first unread message

Paolo

unread,
Dec 26, 2012, 1:49:01 PM12/26/12
to web...@googlegroups.com
Hi all,
it seems to me that SQLFORM.factory doesn't honor the uploadseparate option because I'am not able to delete the uploaded file with SQLFORM.factory

form = SQLFORM.factory(db.club, db.cities, _class='well',
                       formstyle
='bootstrap', showid= False,
                       upload
=URL('default', 'download'), uploadfolder=request.folder+'uploads/pictures',  
                       uploadseparate
=True, autodelete=True, table_name='club'  )

 

The error:
Enter code here...2012-12-26 19:38:07,728 - web2py - ERROR - Traceback (most recent call last):
 
File "/home/paolo/Dropbox/git/web2py/gluon/restricted.py", line 212, in restricted
   
exec ccode in environment
 
File "/home/paolo/Dropbox/git/web2py/applications/bikend/controllers/club.py", line 123, in <module>
 
File "/home/paolo/Dropbox/git/web2py/gluon/globals.py", line 193, in <lambda>
   
self._caller = lambda f: f()
 
File "/home/paolo/Dropbox/git/web2py/gluon/tools.py", line 2935, in f
   
return action(*a, **b)
 
File "/home/paolo/Dropbox/git/web2py/applications/bikend/controllers/club.py", line 35, in modal
    d
= {'form':club_form(c_id=club_id)}
 
File "/home/paolo/Dropbox/git/web2py/applications/bikend/controllers/club.py", line 103, in club_form
   
if form.process(dbio=False).accepted:
 
File "/home/paolo/Dropbox/git/web2py/gluon/html.py", line 2179, in process
   
self.validate(**kwargs)
 
File "/home/paolo/Dropbox/git/web2py/gluon/html.py", line 2118, in validate
   
if self.accepts(**kwargs):
 
File "/home/paolo/Dropbox/git/web2py/gluon/sqlhtml.py", line 1408, in accepts
    source_file
= open(f, 'rb')
IOError: [Errno 2] No such file or directory: '/home/paolo/Dropbox/git/web2py/applications/bikend/club.picture.a4bd97789f289bcc.6c6f676f322e706e67.png'

It tries to remove the file in the wrong directory. The right one would be:
/home/paolo/Dropbox/git/web2py/applications/bikend/uploads/pictures/club.picture/a4

The field is defined as follow:

Field("picture", "upload", uploadfolder=request.folder+'uploads/pictures', uploadseparate=True, autodelete=True, requires=[IS_NOT_EMPTY(), IS_IMAGE(), IS_UPLOAD_FILENAME(extension='jpg|jpeg|png'),IS_IMAGE(extensions=('jpeg', 'png'))]),

what should I have to do?

Paolo



Massimo Di Pierro

unread,
Dec 26, 2012, 6:47:19 PM12/26/12
to web...@googlegroups.com
Did you upload the file first and then add uploadseparate/uploadfolder?  
/home/paolo/Dropbox/git/<span style="color: #000;" class="styled-b...
Show original

Paolo

unread,
Dec 27, 2012, 1:30:00 AM12/27/12
to web...@googlegroups.com
Hi Massimo,
I've just tried to post and then edit with both SQLFORM.factory having  uploadseparate but nothing has changed. The problem is still there, actually I am making explicitly inserts and  edits.
The whole SQLFORM.factory to edit a field is this:
            for field in ['title','description', 'user_contact','picture' ]:
                db
.club[field].default = club[field]
           
for field in ['name']:
                db
.cities[field].default = city[field]

            form
= SQLFORM.factory(db.club, db.cities, _class='well',
                                   formstyle
='bootstrap', showid= False,
                                   upload
=URL('default', 'download'), uploadfolder=request.folder+'uploads/pictures',  
                                   uploadseparate
=True, autodelete=True, table_name='club')


Paolo

Paolo

unread,
Dec 27, 2012, 3:20:16 PM12/27/12
to web...@googlegroups.com
Hi, I thought about the option requires, right now I have:

requires=[IS_IMAGE(), IS_UPLOAD_FILENAME(extension='jpg|jpeg|png'), IS_IMAGE(extensions=('jpeg', 'png'))
I thought that as defined, the field could not be empty, so, I tried to remove any constrain

requires=None
but then the delete button is no longer shown, why ?!
I've also tried:

requires=[]
but in this case I got the same error as in the other cases.

Massimo Di Pierro

unread,
Dec 27, 2012, 3:28:54 PM12/27/12
to web...@googlegroups.com
perhaps not the cause of the problem but

request.folder+'uploads/pictures'

should be

os.path.join(request.folder,'uploads','pictures')

Paolo

unread,
Dec 27, 2012, 4:48:16 PM12/27/12
to web...@googlegroups.com
Hi Massimo, thank for the answer, I updated the code but the problem is still there, I made several tests, no one figured out what is wrong. So that I tried to simplify the code as follows:
db.define_table('test_img',

   
Field("picture", "upload",

          uploadfolder
=os.path.join(request.folder,'uploads','pictures'),
          uploadseparate
=True),
   
Field('created_on', 'datetime', default=request.now, writable=False)
)

def sqlform_add():
    form
= SQLFORM.factory(db.test_img, _class='well',

                           upload
=URL('default', 'download'),

                           uploadfolder
=os.path.join(request.folder,'uploads','pictures'),  
                           uploadseparate
=True, table_name='test')
   
if form.process(dbio=False).accepted:
        id
= db.test_img.insert(**dict(form.vars))
   
return response.render('generic.html', dict(form=form))

def sqlform_edit():
    img
= db(db.test_img.id>0).select().first()
    db
.test_img['picture'].default = img['picture']
    form
= SQLFORM.factory(db.test_img, _class='well',

                           upload
=URL('default', 'download'),

                           uploadfolder
=os.path.join(request.folder,'uploads','pictures'),  
                           uploadseparate
=True, table_name='test')
   
if form.process(dbio=False).accepted:
       
print 'form accepted'
   
return response.render('generic.html', dict(form=form))

what I got:
- adding an img with sqlform_add and then removing it with appadmin  --> worked
- adding an img with appadmin and then removing it with sqlform_edit --> failed
- using both
sqlform_add and sqlform_edit --> failed

Now I am thinking about the way I set the default value, maybe for a field as an upload I have to set something more?

Paolo

paolo....@gmail.com

unread,
Dec 28, 2012, 9:09:52 AM12/28/12
to web...@googlegroups.com
Hi, I had a look at sqlform.py, the error comes from the fact that if a default value is set for the field upload, web2py tries to read it and store it as the new value for the upload field. As a result it is not possible to me to edit forms and remove uploads by setting the default value, this trick doesn't work.
Moreover, I tried to fix the initial error about the missing file, by setting db.test_img['picture'].default  equal to real path of the file. This worked well but than, if I understood correctly how web2py works, it tried to store again the default value as the new value, starting a kind of loop! That was wrong, and actually this has never worked, it stopped due to the 'error filename' to long.

The good thing is that by changing this two line (line 1394 of sqlhtml.py)
f = self.table[fieldname].default or ''
fields
[fieldname] = f
to:
fields[fieldname] = self.table[fieldname].default
It seems that this solved the issue, but of course, I need something better.


2012/12/27 Paolo <paolo....@gmail.com>
--
 
 
 



--
 Paolo
Reply all
Reply to author
Forward
0 new messages