cybertools/reporter
helmutm ef14fad4aa let subclasses of BatchView override b_size default value
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2000 fd906abe-77d9-0310-91a1-e0d9ade77398
2007-09-05 22:13:23 +00:00
..
browser let subclasses of BatchView override b_size default value 2007-09-05 22:13:23 +00:00
__init__.py starting the cybertools.reporter package... 2006-03-06 08:43:39 +00:00
batch.py improvements/fixes for batching 2006-06-10 06:45:40 +00:00
configure.zcml reporter.batch basically finished 2006-06-02 08:39:29 +00:00
cybertools.reporter-configure.zcml starting the cybertools.reporter package... 2006-03-06 08:43:39 +00:00
data.py starting the cybertools.reporter package... 2006-03-06 08:43:39 +00:00
interfaces.py work in progress: handling of result sets 2007-05-21 07:35:08 +00:00
README.txt cybertools.reporter basically working 2007-05-21 10:06:03 +00:00
resultset.py more on cybertools.reporter: control via the field's renderFactory 2007-05-21 17:28:16 +00:00
tests.py Work in progress: reporter.batch 2006-05-19 09:34:57 +00:00

====================================
A Basic API for Reports and Listings
====================================

  ($Id$)

TO DO...

  >>> from zope import component
  >>> from zope.interface import directlyProvides


Listings
========

  >>> from cybertools.reporter.data import DataSource
  >>> from cybertools.reporter.resultset import ResultSet
  >>> from cybertools.reporter.interfaces import IResultSet

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

  >>> component.provideAdapter(ResultSet)
  >>> rset = IResultSet(persons)

  >>> len(list(rset.rows))
  3

As we have not yet provided a schema for the result set the rows are
empty.

  >>> r1 = rset.rows.next()
  >>> list(r1.cells)
  []

So let's assign a schema to the result set.

  >>> from cybertools.composer.schema.schema import Schema
  >>> from cybertools.composer.schema.field import Field
  >>> rset.schema = Schema(Field(u'firstName'), Field(u'lastName'), Field(u'birthDate'))
  >>> r1 = rset.rows.next()
  >>> [c.text for c in r1.cells]
  [u'Smith', u'John', u'1956-08-01']

For the browser presentation we can also use a browser view providing
the result set with extended attributes:

  >>> #rsView = component.getMultiAdapter((context, 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}