Thanks! On Tuesday, 12 March 2019 22:52:31 UTC-7, sandeep patel wrote: > > 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.