==================================== 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}