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 >>>> >>> --