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 the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.