If you don't mind, please pack and attach your application (feel free to 
send privately if your prefer).

Anthony

On Tuesday, November 24, 2015 at 3:37:38 PM UTC-5, Aeta Gothno wrote:
>
> Using the default download function doesn't work either, it just gives me 
> a 404 Not Found. I don't understand why. It actually allows you to download 
> and view the spreadsheets?
>
> On Tue, Nov 24, 2015 at 3:29 PM, Anthony <[email protected]> wrote:
>
>> Get rid of your download function and just use the download function that 
>> comes in the welcome app -- it uses response.download which is designed to 
>> handle downloading from upload fields automatically. The URL arg, however, 
>> should be the file name stored in the upload field, not the record ID. (As 
>> an aside, there would be no need for a StringIO there anyway, as you can 
>> simply stream the contents of the file directly.)
>>
>> Anthony
>>
>>
>> On Tuesday, November 24, 2015 at 3:20:56 PM UTC-5, Aeta Gothno wrote:
>>>
>>> I have added the following into my controller:
>>>
>>> def download():
>>>     file_id = request.args(0)
>>>     import cStringIO 
>>>     import contenttype as c
>>>     s=cStringIO.StringIO() 
>>>      
>>>     (filename,file) = 
>>> db.excelform.excel_file.retrieve(db.excelform[file_id].file)
>>>     s.write(file.read())  
>>>     response.headers['Content-Type'] = c.contenttype(filename)
>>>     response.headers['Content-Disposition'] = \
>>>                 "attachment; filename=%s" % filename  
>>>     return s.getvalue()
>>>
>>>
>>>
>>> def list_files():
>>>     excel_file = db(db.excelform.id>0).select(db.excelform.excel_file)
>>>     urls = [A('Download', _href=URL(r=request, c='default', 
>>> f='download', args=[row.id]
>>>                  )) for row in excel_file]
>>>     return urls
>>>
>>> However I keep getting the ticket : 
>>> <type 'exceptions.AttributeError'> 'NoneType' object has no attribute 
>>> 'file'
>>>
>>> I am not sure if this is because nothing appears to save in the first 
>>> place, or if it is because I am using the function wrong.
>>>
>>> On Tue, Nov 24, 2015 at 1:47 PM, Aeta Gothno <[email protected]> 
>>> wrote:
>>>
>>>> Thank you very much for explaining everything to me.
>>>>
>>>> It makes a lot more sense doing it that way, however I will have to 
>>>> read up on StringIO since I have not used that before. 
>>>> I commented out my functions and replaced it with what you have 
>>>> suggested and there are no errors, however nothing shows up in the uploads 
>>>> field when I view the database. It is empty, I am not sure if it is 
>>>> because 
>>>> I am missing something in regards to downloading the file. 
>>>>
>>>> Before I was able to view the excel form being changed in the 
>>>> background and I would open the new excel file and the user inputs would 
>>>> be 
>>>> in the correct cells, but now the files are blank. I am confused if it may 
>>>> have something to do with saving it as a virtual workbook? 
>>>>
>>>> Since there are no errors, I think it at least indicates that it is 
>>>> opening the excel file and writing to it, I just cannot find where it 
>>>> might 
>>>> be storing the file afterwards since it shows up empty.
>>>>
>>>> I also was not aware that I can create functions like so within the 
>>>> models file, that is very convenient. 
>>>>
>>>> On Tue, Nov 24, 2015 at 12:43 PM, Anthony <[email protected]> wrote:
>>>>
>>>>> There is no need to store the data in the session and then redirect to 
>>>>> another action to create the file. Instead, just do it all at once. Also, 
>>>>> if you want to store the file (safely) and make it easily retrievable, 
>>>>> then 
>>>>> add an upload field to the database table and store it that way. Finally, 
>>>>> if you want to associated files with their creators, just add a reference 
>>>>> field to the excelform table to reference the auth_user record of the 
>>>>> currently logged in user. This can all be simplified as follows:
>>>>>
>>>>> In a model file:
>>>>>
>>>>> def create_excel(row):
>>>>>     from openpyxl import load_workbook
>>>>>     from openpyxl.writer.excel import save_virtual_workbook
>>>>>     from cStringIO import StringIO
>>>>>     wb = load_workbook(filename=
>>>>> '/home/../Documents/web2py/applications/../static/excel.xlsx')
>>>>>     sheet_ranges = wb['Sheet1']
>>>>>     sheet_ranges['C4'] = row.last_name
>>>>>     sheet_ranges['C6'] = row.first_name
>>>>>     sheet_ranges['C8'] = row.age
>>>>>     sheet_ranges['C10'] = row.location
>>>>>     excel_file = StringIO()
>>>>>     excel_file.write(save_virtual_workbook(wb))
>>>>>     excel_file.seek(0)
>>>>>     return db.excelform.excel_file.store(excel_file, 
>>>>> 'spreadsheet.xlsx')
>>>>>
>>>>> db.define_table('excelform',
>>>>>     Field('last_name', 'string', requires=IS_NOT_EMPTY()),
>>>>>     Field('first_name', 'string', requires=IS_NOT_EMPTY()),
>>>>>     Field('age', 'string', requires=IS_NOT_EMPTY()),
>>>>>     Field('location', 'string', requires=IS_NOT_EMPTY()),
>>>>>     Field('excel_file', 'upload', compute=create_excel),
>>>>>     Field('created_by', 'reference auth_user',
>>>>>           default=auth.user_id, readable=False, writable=False))
>>>>>
>>>>> The above adds the excel_file upload field to your model and defines 
>>>>> it as a computed field. When an insert is made, the create_excel function 
>>>>> is called. It creates the workbook, but instead of using wb.save() to 
>>>>> create the file directly, it uses save_virtual_workbook to convert the 
>>>>> workbook to a string. It then writes the string to a StringIO object, 
>>>>> which 
>>>>> is ultimately passed to the .store() method of the upload field. The 
>>>>> .store() method creates the file and returns the filename that web2py 
>>>>> created for it, which is ultimately stored in the upload field itself. 
>>>>> The 
>>>>> second argument to .store() is the filename you will see when you 
>>>>> download 
>>>>> the file (but no the filename used to actually store the file on the 
>>>>> filesystem).
>>>>>
>>>>> The created_by field is a reference to auth_user, with the default set 
>>>>> to the ID of the current user (it is not readable or writable, so will 
>>>>> not 
>>>>> appear in the form).
>>>>>
>>>>> Then, in the controller:
>>>>>
>>>>> @auth.requires_login()
>>>>> def excelform():
>>>>>     record = db.excelform(request.args(0))
>>>>>     form = SQLFORM(db.excelform, record,
>>>>>                    message_onsuccess='Thanks! The form has been 
>>>>> submitted.',
>>>>>                    message_onfailure='Please correct the error(s).').
>>>>> process()
>>>>>     return dict(form=form)
>>>>>
>>>>> The controller is now quite simple -- it just creates and processes 
>>>>> the form -- the rest of the logic is handled in the model. Note, assuming 
>>>>> being a registered user is required, you should use the 
>>>>> @auth.requires_login() decorator here.
>>>>>
>>>>> If you want to show only the files of the current user, you can do:
>>>>>
>>>>>     grid = SQLFORM.grid(db.excelform.created_by == auth.user_id)
>>>>>
>>>>> Anthony
>>>>>
>>>>> -- 
>>>>> Resources:
>>>>> - http://web2py.com
>>>>> - http://web2py.com/book (Documentation)
>>>>> - http://github.com/web2py/web2py (Source code)
>>>>> - https://code.google.com/p/web2py/issues/list (Report Issues)
>>>>> --- 
>>>>> You received this message because you are subscribed to a topic in the 
>>>>> Google Groups "web2py-users" group.
>>>>> To unsubscribe from this topic, visit 
>>>>> https://groups.google.com/d/topic/web2py/B4H1Q6jV9S4/unsubscribe.
>>>>> To unsubscribe from this group and all its topics, send an email to 
>>>>> [email protected].
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>
>>>>
>>> -- 
>> Resources:
>> - http://web2py.com
>> - http://web2py.com/book (Documentation)
>> - http://github.com/web2py/web2py (Source code)
>> - https://code.google.com/p/web2py/issues/list (Report Issues)
>> --- 
>> You received this message because you are subscribed to a topic in the 
>> Google Groups "web2py-users" group.
>> To unsubscribe from this topic, visit 
>> https://groups.google.com/d/topic/web2py/B4H1Q6jV9S4/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to 
>> [email protected].
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to