cybertools/reporter
2012-01-29 11:23:18 +01: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 extend/adapt result set to use client instance objects for rows, using the applyTemplate() method for retrieving and formatting cell data 2008-07-07 17:57:38 +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 extend/adapt result set to use client instance objects for rows, using the applyTemplate() method for retrieving and formatting cell data 2008-07-07 17:57:38 +00:00
README.txt add info in README of reporter package 2012-01-27 07:52:50 +01:00
resultset.py work in progress: reporting 2010-05-16 12:44:59 +00:00
tests.py work in progress: make cybertools package work with BlueBream 1.0 2011-09-29 18:17:35 +02:00

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

Note: The basic reporting stuff (with Report, ReportInstance, Field, and ResultSet
classes) is now in cybertools.composer.report. The stuff defined here is,
however, still used in some (TUM) projects and may also be useful in other
cases.

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}