Hi,
I've got a controller that is serving up a searchable SQLFORM grid of some
map locations along with a Leaflet map containing the locations. The
underlying table looks like this:
db.define_table('gazeteer',
Field('location', 'string', unique=True),
Field('type', 'string', requires=IS_IN_SET(gaz_types)),
Field('parent', 'string'),
Field('display_order', 'integer'),
Field('region','string', requires=IS_IN_SET(gaz_regions)),
Field('plot_size', 'string'),
Field('fractal_order', 'integer'),
Field('transect_order', 'integer'),
Field('centroid_x', 'float'),
Field('centroid_y', 'float'),
Field('geom_type', 'string'),
Field('geom_coords', 'json'))
I only want users to see a small number of those fields in the grid
(location, type and a couple more) so I make the others unreadable. I want
to do the following:
1) Populate the Leaflet map with features by passing GeoJSON (mostly just
geom_type and geom_coords) for rows selected in the SQLFORM. The form
object returned by SQLFORM.grid contains all the fields (even the ones with
readable set to FALSE), but it only returns the first page of rows. This
makes sense, since this is what is rendered, but I'd like to display all
the features selected not just those in the current page. Options:
a) I could turn off pagination (but there are hundreds of rows)
b) I can work around by intercepting the keywords, using
SQLFORM.build_query and running a separate query to capture the row set
used by SQLFORM.grid (which seems really clunky and does the same database
query twice).
2) I want to provide a GPX file export, which requires the centroid_x and
centroid_y fields. That's basically fine, I can provide a new Exporter
class for the SQLFORM.grid. The Exporter does get all the rows (pagination
presumably happens just before returning from SQLFORM.grid) but the problem
now is that the unreadable fields are not present in form.rows. Options:
a) I could make centroid_x and centroid_y readable (looks cluttered, not
really useful for users)
b) I could scan all the ids out of form.rows and go and look up the details
(more DBIO).
The version below uses 1b and 2a but am I missing something simple that
allows me to get at all the data in both cases? The CSV_hidden exporter
suggests that Exporters can access hidden fields.
def gazeteer():
"""
Controller to provide a map view of the gazeteer data and a searchable
interface with GPX download.
"""
# If the grid has set up some search keywords, and the keywords aren't
an empty
# string then use them to select those rows, otherwise get all rows
sfields = [db.gazeteer.location, db.gazeteer.type, db.gazeteer.plot_size
,
db.gazeteer.fractal_order, db.gazeteer.transect_order]
if 'keywords' in request.get_vars and request.vars.keywords != '':
qry = SQLFORM.build_query(sfields, keywords=request.vars.keywords)
else:
qry = db.gazeteer
# get the (selected) rows and turn them into geojson, ordering them
# so that the bottom ones get added to the leaflet map first
rws = db(qry).select(orderby=db.gazeteer.display_order)
# removed formating code not relevant to question
# provide a single export format - GPX
export = dict(gpx=(ExporterGPX, 'GPX'), csv_with_hidden_cols=False,
csv=False, xml=False, html=False, json=False,
tsv_with_hidden_cols=False, tsv=False)
# hide these fields - except that we need them for GPX
# output and populating the leaflet map
db.gazeteer.id.readable = False
db.gazeteer.centroid_x.readable = True
db.gazeteer.centroid_y.readable = True
db.gazeteer.display_order.readable = False
db.gazeteer.geom_type.readable = False
db.gazeteer.geom_coords.readable = False
db.gazeteer.region.readable = False
db.gazeteer.parent.readable = False
form = SQLFORM.grid(db.gazeteer,
csv=True,
exportclasses=export,
maxtextlength=250,
deletable=False,
editable=False,
create=False,
details=False)
return dict(form=form, sitedata=json(rws))
--
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.