Anthony,
The second option sounds more like what I want to do. And yes I don't want
to load the file itself into the component DIV. But as I stated earlier,
I'm trying to do two things from within the same controller
form_query(). To summarize, (with reference to the code below) what I'm
trying to get at is: run a query on the database, make a csv file out of
these results on the fly (rows.export_to_csv_file(stream)), trigger its
download and return a table
(
dict(Result=SQLTABLE(rows,headers='fieldname:capitalize',truncate=60),Query=form)
)
to be displayed inside the target DIV; all this must be done by
form_query().
Can you show me how I could modify form_query() to embed JS (if I've
understood your second option correctly) in order to trigger the download?
def form_query():
if request.args(0) in db.tables:
response.generic_patterns = ['load']
form=SQLFORM(db[request.args(0)])
if form.validate(keepvalues=True):
rows = db().select(db.vmt_weekly.ALL)
Result=SQLTABLE(rows,headers='fieldname:capitalize',truncate=60)
response.headers['Content-Type']='application/vnd.ms-excel'
response.headers['Content-Disposition'] = 'attachment;
filename=results.csv'
stream=cStringIO.StringIO()
rows.export_to_csv_file(stream)
#trigger download of csv file 'stream' here before returning
return
dict(Result=SQLTABLE(rows,headers='fieldname:capitalize',truncate=60),Query=form)
return dict(form=form)
else:
return dict()
Thanks!
On Friday, September 7, 2012 6:02:09 PM UTC-7, Anthony wrote:
>
> window.open('{{=URL('reports', 'form_query')}}' + '/' + jQuery(this).val());
>
> is still the way to trigger the download. The jQuery "change" event
> handler could trigger the component loading *in addition* to triggering
> the above command. Another option might be to include the above JS in a
> script within the component, so when the component loads, the script is run
> and then triggers the download. Either way, I don't think you want to load
> the file itself into the component div, as your code does. If you want HTML
> content displayed in the div, then that's what the component has to return.
> Triggering the download is a separate issue.
>
> Anthony
>
> On Friday, September 7, 2012 8:48:14 PM UTC-4, maverick wrote:
>>
>> I do want to also display content in the DIV. In addition to displaying
>> content in the DIV, I want the controller to also trigger a file download.
>> A more accurate version of the form_query() controller would be something
>> like:
>>
>> In reponse to the form submission, it has to return a dict containing a
>> table (Result) that will be loaded to the target DIV as well as trigger a
>> file download. The file is just a static file for now, but eventually it
>> will be a csv export of the query result (rows). This way i display the
>> result as a table and also have the user download the result set as a csv.
>>
>> def form_query():
>> if request.args(0) in db.tables:
>> response.generic_patterns = ['load']
>> form=SQLFORM(db[request.args(0)])
>> if form.validate(keepvalues=True):
>> rows = db().select(db.vmt_weekly.ALL)
>> Result=SQLTABLE(rows,headers='fieldname:capitalize',truncate=60)
>> response.headers['Content-Type'] = gluon.contenttype.contenttype('.txt')
>> response.headers['Content-Disposition'] = 'attachment;
>> filename=somefile.txt'
>> #NOTE#It has to return:
>> dict(Result=SQLTABLE(rows,headers='fieldname:capitalize',truncate=60),Query=form)
>>
>> And also
>> trigger the download of somefile.txt. And further somefile.txt will be a
>> csv representation of 'rows' variable above.
>>
>> return dict(form=form)
>> else:
>> return dict()
>>
>> Thanks,
>> mave
>>
>> On Thursday, September 6, 2012 1:20:04 PM UTC-7, Anthony wrote:
>>>
>>> My response from Stack Overflow:
>>>
>>> jQuery('#rep_type').change(function(){
>>> window.open('{{=URL('reports', 'form_query')}}' + '/' +
>>> jQuery(this).val());
>>> });
>>>
>>> If you want the file to download as an attachment, don't use a
>>> component. A component creates a div for displaying content, but you just
>>> want to trigger a file download.
>>>
>>> Anthony
>>>
>>>
>>> On Thursday, September 6, 2012 12:48:56 PM UTC-4, maverick wrote:
>>>>
>>>> Hello!
>>>> I want to stream a file as an attachment in the response. I have this
>>>> function:
>>>> def form_query():
>>>> response.flash = str(request.args(0))
>>>> response.generic_patterns = ['load']
>>>> response.headers['Content-Type'] =
>>>> gluon.contenttype.contenttype('.txt')
>>>> response.headers['Content-Disposition'] = 'attachment;
>>>> filename=somefile.txt'
>>>> #more code goes in here to process request.args here.
>>>> Ultimately, the controller is expected to return a dict containing a table
>>>> and the file to be streamed as an attachment. For now just trying to get
>>>> the file streamed.
>>>> return response.stream(open('somefile.txt'),chunk_size=1024)
>>>>
>>>> When I call this controller normally (if I put the streaming code
>>>> inside index() for e.g.) it responds by opening up a download popup to
>>>> save
>>>> the file to disk. But when I have this called as a target function from
>>>> web2py_component in index.html (to fill a div with the response)like this:
>>>>
>>>> web2py_component("{{=URL('reports', 'form_query.load')}}" + "/" +
>>>> jQuery(this).val(), target='div_form_query');
>>>>
>>>> It renders the file inside the DIV 'div_form_query' rather than popup a
>>>> download window.
>>>>
>>>> Any ideas how to render the file as an attachment while using
>>>> web2py_component. I'm using web2py_component as I want to conditionally
>>>> load input forms into that div target (div_form_query) based on a select
>>>> list which has tables as options. The index.html looks something like:
>>>>
>>>> {{left_sidebar_enabled,right_sidebar_enabled=True,False}}
>>>> {{extend 'layout.html'}}
>>>> <h5>{{=message}}</h5>
>>>> {{=SELECT('Select a report',
>>>> *[OPTION(repts[i].descr, _value=str(repts[i].report)) for i in
>>>> range(len(repts))], _id="rep_type")}}
>>>> <div id="div_form_query"></div>
>>>>
>>>> <script>
>>>> jQuery(document).ready(function(){
>>>> jQuery('#rep_type').change(function(){
>>>> web2py_component("{{=URL('reports', 'form_query.load')}}" + "/" +
>>>> jQuery(this).val(), target='div_form_query');
>>>> });
>>>> });
>>>> </script>
>>>>
>>>> {{block left_sidebar}}
>>>> {{"""=A(T("Administrative Interface"),
>>>> _href=URL('admin','default','index'), _class='button',
>>>> _style='margin-top: 1em;')"""}}
>>>> <!--h6>{{=T("Don't know what to do?")}}</h6-->
>>>> <ul>
>>>> <li>{{=A(T("Reports"), _href=URL('netman','reports','index'))}}</li>
>>>> <li>{{=A(T("Billing"), _href=URL('netman','billing','index'))}}</li>
>>>> <li><a href="http://192.168.136.40/zabbix
>>>> ">{{=T('Monitoring')}}</a></li>
>>>> </ul>
>>>> {{end}}
>>>>
>>>> Thanks,
>>>> mave
>>>>
>>>
--