Hi Tim,

      Export format should be CSV file. I am getting that error because of
the custom search in grid.

I got some clues from Exporting from a SQLFORM.grid with customized search
queries <https://groups.google.com/forum/#!topic/web2py/Td58YKBAaMo>

I'll try TSV once I fix this issue.


On Thu, Jan 15, 2015 at 1:32 PM, Tim Richardson <t...@tim-richardson.net>
wrote:

> A quick question: if you try the standard Tab Separated Value export, does
> it work? (you can refer back to your stack overflow link to see why I ask).
>
>
>
> On Thursday, 15 January 2015 04:31:56 UTC+11, Prasad Muley wrote:
>>
>> Hello All,
>>
>>        I've used a SQLFORM.grid for displaying table content. I've
>> provided export to CSV option in grid.
>>
>> My app settings are as below:
>>
>> *models/db.py*
>>
>> db.define_table('company',
>>                 Field('name', 'string', length=128, notnull=True,
>> unique=True),
>>                 Field('address', 'string'), format='%(name)s')
>>
>>
>> db.define_table('document',
>>                           Field('name', 'string', length=128,
>> notnull=True),
>>                           Field('type', 'string', notnull=True),
>>                           Field('company', db.company, format='%(name)s')
>>
>>
>> Here,
>>         document table has company as a reference key,
>>         *Exported CSV should contain the company names not ids*
>>
>> So I've defined a class *CSVExporter* according to anthony
>> <http://www.quora.com/Anthony-Bastardi>  solution for
>> web2pygrid-csv-exports-shows-ids-not-values-for-reference-fields
>> <http://stackoverflow.com/questions/17337290/web2pygrid-csv-exports-shows-ids-not-values-for-reference-fields>
>>
>> *modules/doc_utils.py*
>> from cStringIO import StringIO
>>
>>
>> class CSVExporter(object):
>>     """This class is used when grid's table contains reference key id.
>>        Exported CSV should contain reference key name of reference
>>        key not ids"""
>>     file_ext = "csv"
>>     content_type = "text/csv"
>>
>>     def __init__(self, rows):
>>         self.rows = rows
>>
>>     def export(self):
>>         if self.rows:
>>             s = StringIO()
>>             self.rows.export_to_csv_file(s, represent=True)
>>             return s.getvalue()
>>         else:
>>             return ''
>>
>> *#Grid uses Custom search for string*
>>
>>
>> def search_query(fields, keywords):
>>     """" Custom search for doc grid"""
>>     if isinstance(keywords, (tuple, list)):
>>         keywords = keywords[0]
>>         request.vars.keywords = keywords
>>     key = keywords.strip()
>>     if key and not '"' in key and not "'" in key and key:
>>         SEARCHABLE_TYPES = ('string', 'text', 'list:string')
>>         words = key.split(' ') if key else []
>>         filters = []
>>         for field in fields:
>>             #apply search on company_name also
>>             if field.name == "portfolio_company":
>>                 #get db from current module
>>                 db = current.db
>>                 #get company name from record
>>                 company_ids = [company.id for company in db(
>>                     db.company.name.contains(words)).select(db.company.id
>> )]
>>                 if company_ids:
>>                     filters.append(field.belongs(company_ids))
>>                 continue
>>             if field.type in SEARCHABLE_TYPES:
>>                 all_words_filters = []
>>                 for word in words:
>>                     all_words_filters.append(field.contains(word))
>>                 filters.append(reduce(lambda a, b: (a & b),
>> all_words_filters))
>>         parts = filters
>>     else:
>>         parts = None
>>     if parts:
>>         return reduce(lambda a, b: a | b, parts)
>>     else:
>>         return None
>>
>> *controllers/documents.py*
>> from applications.asdf.doc_utils import CSVExporter, search_query
>>
>>
>> def docs():
>>         export_csv = False
>>         export_classes = None
>>         query = valid_db_query_here
>>         if auth.has_membership('manager'):
>>                  export_csv = True
>>                  export_classes = dict(csv=(CSVExporter, 'CSV'),
>> xml=False, html=False,
>>                                                     json=False,
>> csv_with_hidden_cols=False,
>>                                                     tsv=False,
>> tsv_with_hidden_cols=False)
>>
>>         grid = SQLFORM.grid(query, orderby=~db.document.created_on,
>>                                              showbuttontext=False,
>> csv=export_csv, deletable=False,
>>                                              searchable=search_query,
>> exportclasses=export_classes)
>>
>>
>>        return (grid=grid)
>>
>> If I search single keyword like Google or MicroSoft in then export works
>> as expected.
>>
>> if I search multiple keywords like Google India Private Limited or Redhat
>> India Pvt Ltd then it shows expected rows in grid
>>
>> But If I click on export button then it gives me *Following error*
>>
>>
>> *Ticket ID*
>> *127.0.0.1.2015-01-14.21-56-57.34fb2b60-2857-4c1a-9626-a854630fc9c7*
>>
>> *<type 'exceptions.AttributeError'> 'list' object has no attribute
>> 'colnames'*
>>
>> *Version*
>> *web2py™ Version 2.9.5-stable+timestamp.2014.03.16.02.35.39*
>> *Traceback*
>> *1.*
>> *2.*
>> *3.*
>> *4.*
>> *5.*
>> *6.*
>> *7.*
>> *8.*
>> *9.*
>> *10.*
>> *11.*
>> *12.*
>> *13.*
>> *14.*
>> *15.*
>> *16.*
>> *Traceback (most recent call last):*
>> *  File "/home/prasad/Rootpy/web2py_2.9/gluon/restricted.py", line 220,
>> in restricted*
>> *    exec ccode in environment*
>> *  File
>> "/home/prasad/Rootpy/web2py_2.9/applications/asdf/controllers/documents.py",
>> line 137, in <module>*
>> *  File "/home/prasad/Rootpy/web2py_2.9/gluon/globals.py", line 385, in
>> <lambda>*
>> *    self._caller = lambda f: f()*
>> *  File "/home/prasad/Rootpy/web2py_2.9/gluon/tools.py", line 3287, in f*
>> *    return action(*a, **b)*
>> *  File "/home/prasad/Rootpy/web2py_2.9/gluon/tools.py", line 3287, in f*
>> *    return action(*a, **b)*
>> *  File
>> "/home/prasad/Rootpy/web2py_2.9/applications/asdf/controllers/documents.py",
>> line 112, in upload*
>> *    exportclasses=export_classes)*
>> *  File "/home/prasad/Rootpy/web2py_2.9/gluon/sqlhtml.py", line 2221, in
>> grid*
>> *    rows.colnames = expcolumns # expcolumns is all cols to be exported
>> including virtual fields*
>> *AttributeError: 'list' object has no attribute 'colnames'*
>>
>>
>>
>> I've started debugging and got following the point.
>>
>> *For single keyword search,* the rows object has *<class
>> 'gluon.dal.Rows'> *type and it contains exact rows which query gives
>> But the rows object has *list type for multiple search keywords*
>>
>>
>> Any clues/hints/suggestions for debugging this error?
>>
>  --
> 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/P2avEkVVeZg/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> web2py+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>



-- 
Thanks and Regards
Prasad M. Muley

-- 
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 web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to