From b41175ed3abcfdcc4bdb7b8bb8cc41c88b1c466f Mon Sep 17 00:00:00 2001 From: helmutm Date: Sun, 21 Mar 2010 16:11:55 +0000 Subject: [PATCH] work in progress: generic report configuration: basic field definitions git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3776 fd906abe-77d9-0310-91a1-e0d9ade77398 --- composer/report/README.txt | 11 +++++++ composer/report/base.py | 8 +++++ composer/report/field.py | 59 +++++++++++++++++++++++++++++++++++ composer/report/interfaces.py | 56 +++++++++++++++++++++++++++++++-- 4 files changed, 131 insertions(+), 3 deletions(-) create mode 100644 composer/report/field.py diff --git a/composer/report/README.txt b/composer/report/README.txt index e145536..28d9665 100644 --- a/composer/report/README.txt +++ b/composer/report/README.txt @@ -9,3 +9,14 @@ Report Management >>> manager = ReportManager() + >>> rep01 = manager.addReport(Report('testreport')) + +The base report provides a fairly basic collection of field definitions: + + >>> len(rep01.fields) + 1 + >>> rep01.fields.keys() + ['label'] + >>> rep01.fields.get('label') + + >>> rep01.fields.get('title') diff --git a/composer/report/base.py b/composer/report/base.py index f998215..7d8a38c 100644 --- a/composer/report/base.py +++ b/composer/report/base.py @@ -26,6 +26,7 @@ from zope.interface import implements from cybertools.composer.base import Component, Element, Compound from cybertools.composer.base import Template +from cybertools.composer.report.field import Field from cybertools.composer.report.interfaces import IReportManager, IReport from cybertools.util.jeep import Jeep from cybertools.util.randomname import generateName @@ -56,6 +57,10 @@ class ReportManager(object): return id not in self.reports.keys() +label = Field('label', u'Label', + u'A short text that identifies a row for humans.') + + class Report(Template): implements(IReport) @@ -64,5 +69,8 @@ class Report(Template): type = 'generic' manager = None + fields = Jeep((label,)) + def __init__(self, name): self.name = name + diff --git a/composer/report/field.py b/composer/report/field.py new file mode 100644 index 0000000..1168a86 --- /dev/null +++ b/composer/report/field.py @@ -0,0 +1,59 @@ +# +# Copyright (c) 2010 Helmut Merz helmutm@cy55.de +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +""" +Implementation of report field definitions. + +$Id$ +""" + +from datetime import datetime +from time import strptime, strftime +from zope.interface import implements +from zope.cachedescriptors.property import Lazy +from zope.component import adapts +from zope import component +from zope.i18n.locales import locales + +from cybertools.composer.base import Component +from cybertools.composer.report.interfaces import IField +from cybertools.composer.report.interfaces import fieldTypes + + +class Field(Component): + + implements(IField) + + vocabulary = None + default = None + instance_name = None + + def __init__(self, name, title=None, fieldType='textline', **kw): + assert name + self.__name__ = name + title = title or name + self.fieldType = fieldType + super(Field, self).__init__(title, __name__=name, **kw) + self.title = title + for k, v in kw.items(): + setattr(self, k, v) + + @property + def name(self): + return self.__name__ + diff --git a/composer/report/interfaces.py b/composer/report/interfaces.py index b717dfd..16abb76 100644 --- a/composer/report/interfaces.py +++ b/composer/report/interfaces.py @@ -25,6 +25,7 @@ $Id$ from zope.interface import Interface, Attribute from zope.i18nmessageid import MessageFactory from zope import schema +from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm from cybertools.composer.interfaces import ITemplate, IComponent from cybertools.composer.interfaces import IInstance @@ -33,7 +34,7 @@ _ = MessageFactory('cybertools.composer') class IReportManager(Interface): - """ A manager (or container) for complex messages. + """ A manager (or container) for reports. """ title = schema.TextLine( @@ -47,9 +48,13 @@ class IReportManager(Interface): """ Add a report. """ + def getReport(id): + """ Retrieve a report. + """ -class IReport(Interface): - """ A complex message that may be expanded using instance data. + +class IReport(ITemplate): + """ A configurable report. """ identifier = schema.ASCIILine( @@ -71,3 +76,48 @@ class IReport(Interface): manager = Attribute('The manager of this message object') + fields = Attribute('An ordered collection of all field definitions ' + 'available for this report.') + renderers = Attribute('An ordered collection of renderers for this report.') + + +class FieldType(SimpleTerm): + + instanceName = '' + + def __init__(self, value, token=None, title=None, **kw): + super(FieldType, self).__init__(value, token, title) + self.name = value + for k, v in kw.items(): + setattr(self, k, v) + +fieldTypes = SimpleVocabulary(( + FieldType('textline', 'textline', u'Textline'), + FieldType('number', 'number', u'Number', instanceName='number'), + FieldType('date', 'date', u'Date', instanceName='date'), +)) + + +class IField(IComponent): + """ Describes a field that may be used in query criteria, for specifying + columns or cells for display, or for sorting. + """ + + name = schema.ASCII( + title=_(u'Field name'), + description=_(u'The internal name of the field'), + required=True,) + title = schema.TextLine( + title=_(u'Title'), + description=_(u'The title or label of the field'), + required=True,) + description = schema.Text( + title=_(u'Description'), + description=_(u'A brief description of the field'), + required=False,) + fieldType = schema.Choice( + title=_(u'Field type'), + description=_(u'The type of the field'), + required=True, + default='textline', + vocabulary=fieldTypes,)