I have solved this problem. This problem is occurring because of filter
object you have to convert into the list.
You have to need some changes in the sqlhtml file.
go to gluon/sqlhtml.py change line no : 2688

>From - sfields = reduce(lambda a, b: a + b, [filter(is_searchable, t) for t
in tables])
To - sfields = reduce(lambda a, b: a + b, [list(filter(is_searchable, t))
for t in tables])

Note: Web2py version 2.17.2 and Python 3

Thanks
Sandeep


On Wed, Mar 13, 2019 at 11:02 AM <gi...@storedot.us> wrote:

> Could you share your solution?
>
> On Wednesday, January 14, 2015 at 7:31:56 PM UTC+2, 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 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.
>

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