Upload field causing a temp file issue

19 views
Skip to first unread message

Paul Ellis

unread,
Aug 21, 2019, 4:41:03 PM8/21/19
to web2py-users
I have 2 similar controller functions using SQLFORM() with an upload field. One works and one is giving an error online (not when testing locally). I suspect a file system permission problem but I am not sure.
The error only occurs if an image is uploaded.
The extra processing after the form is submitted is not the cause. I removed it as a test and the error remains.

The error:

Traceback


1.
2.
3.
4.
5.
6.
7.
Traceback (most recent call last):
 
File "/home/act/web2py/gluon/main.py", line 505, in wsgibase
   
request.body.close()
 
File "/usr/local/lib/python2.7/tempfile.py", line 431, in close
   
self.unlink(self.name)
OSError: [Errno 2] No such file or directory: '/tmp/tmp2PXnS0'
The Function:
@auth.requires_login()
def add_custom():

   
try:
        offerId
= request.args[0]
   
except IndexError:
        offerId
= 0
    offerDetails
= offer.authorise(offerId)
    status
= roo.status(offerDetails)

    pagetitle
= H4(T('Custom Product'))
    buttongroup
= [btn.back()]

   
try:
        record
= db.custom_product[request.args[1]] or None
   
except [IndexError, KeyError, TypeError]:
        record
= None

   
if session.custom_copy:
        db
.custom_product.productname.default = session.custom_copy.productname
        db
.custom_product.description.default = session.custom_copy.description
        db
.custom_product.purchasecost.default = session.custom_copy.purchasecost
        db
.custom_product.monthlycost.default = session.custom_copy.monthlycost
       
#db.custom_product.smallimage.default = session.custom_copy.smallimage
        session
.custom_copy = None

    db
.custom_product.created_on.readable = False
    db
.custom_product.updated_on.readable = False

    form
= SQLFORM(db.custom_product, record, showid = False)

   
if form.process().accepted:
       
#do this for insert but not update
       
if not record:
           
# need to get the max priorites from the offer table
            pp
= mp = None
           
# offerDetails = db.offer[session.quote.number]

           
# increment whichever needs to be used and save it to the offer table
           
if form.vars.purchasecost:
               
if offerDetails.offer.maxpurchasepriority:
                    offerDetails
.offer.maxpurchasepriority += 1
               
else:
                    offerDetails
.offer.maxpurchasepriority = 1
                pp
= offerDetails.offer.maxpurchasepriority
           
if form.vars.monthlycost or (not form.vars.purchasecost and not form.vars.monthlycost):
               
if offerDetails.offer.maxmonthlypriority:
                    offerDetails
.offer.maxmonthlypriority += 1
               
else:
                    offerDetails
.offer.maxmonthlypriority = 1
                mp
= offerDetails.offer.maxmonthlypriority
            offerDetails
.offer.update_record()

           
# insert record into product_offer_item
            db
.product_offer_item.insert(
                offer_id
= offerDetails.offer.id,
                custom_pid
= form.vars.id,
                quantity
= 1,
                purchasepriority
= pp,
                monthlypriority
= mp,
               
)
       
else:
           
# only do this for updates
           
# check if a price change also needs a priority change
            poiRecord
= record.product_offer_item.select().first()
            pp
= copy.copy(poiRecord.purchasepriority)
            mp
= copy.copy(poiRecord.monthlypriority)
           
#poi_set = db(db.product_offer_item.custom_pid == poiRecord.id)
           
if pp and (not form.vars.purchasecost > 0):
                poiRecord
.update_record(purchasepriority = 0)
           
if not pp and (form.vars.purchasecost > 0):
                poiRecord
.update_record(purchasepriority = 99.5)
           
if mp and (form.vars.purchasecost > 0 and not form.vars.monthlycost > 0):
                poiRecord
.update_record(monthlypriority = 0)
           
if not mp and\
                   
((not form.vars.purchasecost > 0 and not form.vars.monthlycost > 0) or\
                   
not form.vars.purchasecost > 0 and form.vars.monthlycost > 0):
                poiRecord
.update_record(monthlypriority = 99.5)
            offer
.position_check(offerDetails.offer.id)
        session
.flash = T('Success')
        redirect
(btn.EditOffer(offerDetails.offer.id,
                    dict
(custId = offerDetails.customer.id)).url)

   
elif form.errors:
        response
.flash = T('Errors in form')
   
else:
       
pass
    response
.view = 'core.html'
   
return dict(
        pagetitle
= pagetitle,
        pagecontent
= form,
        buttongroup
= buttongroup,
        status
= status,
       
)

The Table definition:
db.define_table(
   
'custom_product',
   
Field('productname', label=T('Product Name')),
   
Field('description', 'text', label=T('Description')),
   
Field('purchasecost', 'double', default = 0, label = T('Purchase Cost')),
   
Field('monthlycost', 'double', default = 0, label = T('Monthly Cost')),
   
Field('created_on', 'datetime', default=request.now, writable=False, label=T('Created On')),
   
Field('updated_on', 'datetime', update=request.now, writable=False, label=T('Updated On')),
   
Field('smallimage', 'upload', label=T('Image')),
   
)


This function does not have an issue:
@auth.requires_membership('oversight')
def add():
    title
= H3(T('Add Product'))
    btns
= [btn.back(session.baselocation)]
    rVars
= request.vars
    cid
= rVars.get('custId', None)
    rArgs
= request.args
    status
= roo.status_check(rArgs, rVars)
    pid
= rVars.get('pid', None)
   
if pid:
        record
= db.product[pid]
   
else:
        record
= None
    form
= SQLFORM(db.product,
        record
,
        ignore_rw
= True,
        fields
= [
           
'productname',
           
'group_id',
           
'description',
           
'purchasecost',
           
'monthlycost',
           
'product_code',
           
'smallimage',
           
'unavailable',
           
'reseller_id',
       
],
       
)
   
if form.process().accepted:
        response
.flash = T('Product Added')
       
# print form.vars
       
# gid = form.vars.group_id
       
# session.flash = T('Product Added')
       
# redirect(URL(
       
#     'product',
       
#     'catalogue',
       
#     vars = dict(custId= cid),
       
#     args = [rArgs[0], gid]))
   
    response
.view = 'core.html'
   
return dict(
        pagetitle
= title,
        buttongroup
= btns,
        pagecontent
= form,
        status
= status,
   
)

The Table definition:
db.define_table(
   
'product',
   
Field('productname', label=T('Product Name')),
   
Field('group_id', 'reference productgroup', label = T('Product Group')),
   
Field('description', 'text', label=T('Description')),
   
Field('purchasecost', 'double', default = 0.0, label = T('Purchase Cost')),
   
Field('monthlycost', 'double', default = 0.0, label = T('Monthly Cost')),
   
Field('product_code', label = T('Product Code')),
   
Field('smallimage', 'upload', label=T('Image')),
   
Field('assist_info', 'text', label=T('Assistant Product Information')),
   
Field('unavailable', 'boolean', default=False, label = T('Unavailable')),
   
Field('reseller_id', 'reference reseller', writable=False),
   
Field('created_on', 'datetime', default=request.now, writable=False, label=T('Created On')),
   
Field('created_by', 'reference auth_user', writable=False, label=T('Created By')),
   
Field('updated_on', 'datetime', update=request.now, writable=False, label=T('Updated On')),
   
Field('updated_by', 'reference auth_user', writable=False, label=T('Updated By')),
    format
= '%(productname)s'
   
)



Reply all
Reply to author
Forward
0 new messages