
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2743 fd906abe-77d9-0310-91a1-e0d9ade77398
103 lines
3 KiB
Text
103 lines
3 KiB
Text
====================================
|
|
A Basic API for Reports and Listings
|
|
====================================
|
|
|
|
($Id$)
|
|
|
|
TO DO...
|
|
|
|
>>> from zope import component
|
|
|
|
|
|
Listings
|
|
========
|
|
|
|
>>> from cybertools.reporter.data import DataSource
|
|
|
|
Let's start with the Person class from the cybertools.organize package - we will
|
|
then provide a listing of persons...
|
|
|
|
>>> from cybertools.organize.party import Person
|
|
|
|
>>> from datetime import date
|
|
>>> pdata = ((u'John', u'Smith', '1956-08-01'),
|
|
... (u'David', u'Waters', '1972-12-24'),
|
|
... (u'Carla', u'Myers', '1981-10-11'))
|
|
>>> persons = DataSource([Person(f, s, date(*[int(d) for d in b.split('-')]))
|
|
... for f, s, b in pdata])
|
|
|
|
>>> from cybertools.reporter.resultset import ResultSet, ContentRow
|
|
>>> from cybertools.reporter.interfaces import IResultSet, IRow
|
|
>>> component.provideAdapter(ResultSet)
|
|
>>> component.provideAdapter(ContentRow, provides=IRow)
|
|
|
|
>>> from cybertools.composer.schema.schema import Schema
|
|
>>> from cybertools.composer.schema.field import Field
|
|
>>> from cybertools.composer.schema.field import FieldInstance, DateFieldInstance
|
|
>>> component.provideAdapter(FieldInstance)
|
|
>>> component.provideAdapter(DateFieldInstance, name='date')
|
|
|
|
>>> rset = IResultSet(persons)
|
|
>>> rset.schema = Schema(Field(u'firstName'), Field(u'lastName'),
|
|
... Field(u'birthDate', fieldType='date'))
|
|
|
|
>>> rows = list(rset.getRows())
|
|
>>> len(rows)
|
|
3
|
|
|
|
>>> for r in rows:
|
|
... print r.applyTemplate()
|
|
{u'lastName': u'John', u'birthDate': '1956-08-01', u'firstName': u'Smith'}
|
|
{u'lastName': u'David', u'birthDate': '1972-12-24', u'firstName': u'Waters'}
|
|
{u'lastName': u'Carla', u'birthDate': '1981-10-11', u'firstName': u'Myers'}
|
|
|
|
For the browser presentation we can also use a browser view providing
|
|
the result set with extended attributes:
|
|
|
|
>>> #rsView = component.getMultiAdapter((rset, TestRequest()), IBrowserView)
|
|
|
|
|
|
The reporter package also includes facilities for sorting the rows in a
|
|
result set and splitting a result into batches.
|
|
|
|
Sorting
|
|
=======
|
|
|
|
|
|
Batching
|
|
========
|
|
|
|
We'll use a fairly simple Iterable:
|
|
|
|
>>> it = xrange(14)
|
|
|
|
>>> from cybertools.reporter.batch import Batch
|
|
>>> b = Batch(it, size=5, overlap=1, orphan=2)
|
|
>>> b.items
|
|
[0, 1, 2, 3, 4]
|
|
>>> b.getIndexRelative(1)
|
|
1
|
|
>>> b.getIndexAbsolute(-1)
|
|
2
|
|
|
|
>>> b = Batch(it, 2, size=5, overlap=1, orphan=2)
|
|
>>> b.items
|
|
[8, 9, 10, 11, 12, 13]
|
|
|
|
We are now ready to use the corresponding browser view:
|
|
|
|
>>> from zope.publisher.browser import TestRequest
|
|
>>> form = dict(b_page=2, b_size=4, b_overlap=1)
|
|
>>> request = TestRequest(form=form)
|
|
>>> from cybertools.reporter.browser.batch import BatchView
|
|
>>> bview = BatchView(None, request)
|
|
>>> bview.setup(it)
|
|
<...BatchView...>
|
|
>>> bview.items()
|
|
[3, 4, 5, 6]
|
|
>>> bview.last
|
|
{'url': 'http://127.0.0.1?b_size=4&b_overlap=1&b_page=5&b_orphan=0',
|
|
'navOnClick': "dojo.io.updateNode(...); return false;",
|
|
'title': 5}
|
|
|
|
|