From fb12b07bf38cab1b447ebe91a4d16ff92fe741f3 Mon Sep 17 00:00:00 2001 From: helmutm Date: Sat, 1 Sep 2007 13:24:51 +0000 Subject: [PATCH] added attribute 'standardFieldName' to Field class for supplying a set of standard attributes; show these on forms and listings git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@1983 fd906abe-77d9-0310-91a1-e0d9ade77398 --- composer/schema/field.py | 1 + composer/schema/instance.py | 18 +++++++++++--- composer/schema/interfaces.py | 17 +++++++++++++- organize/browser/service.py | 26 +++++++++++++++++++-- organize/interfaces.py | 44 ++++++++++++++++++++++++++++++++++- 5 files changed, 99 insertions(+), 7 deletions(-) diff --git a/composer/schema/field.py b/composer/schema/field.py index 2eb042f..315fff8 100644 --- a/composer/schema/field.py +++ b/composer/schema/field.py @@ -38,6 +38,7 @@ class Field(Component): implements(IField) required = False + standardFieldName = None def __init__(self, name, title=None, fieldType='textline', **kw): assert name diff --git a/composer/schema/instance.py b/composer/schema/instance.py index 1d3c063..4e598a2 100644 --- a/composer/schema/instance.py +++ b/composer/schema/instance.py @@ -59,6 +59,10 @@ class ClientInstance(object): def aspect(self): return self.baseAspect + self.template.name + @property + def standardAspect(self): + return self.baseAspect + '__standard__' + def __init__(self, context): self.context = context @@ -66,14 +70,14 @@ class ClientInstance(object): """ Return a mapping of field names from self.template (a schema) to the corresponding values from the context object. """ - result = {} + result = dict(__name__=self.context.__name__) mode = kw.get('mode', 'view') attrs = getattr(self.context, self.attrsName, None) if attrs is None: return result template = self.template - values = attrs.setdefault(self.aspect, {}) if template is not None: + values = attrs.get(self.aspect, {}) for f in template.fields: fieldType = f.getFieldTypeInfo() if not fieldType.storeData: @@ -84,7 +88,9 @@ class ClientInstance(object): value = values.get(name, u'') value = mode == 'view' and fi.display(value) or fi.marshall(value) result[name] = value - result['__name__'] = self.context.__name__ + # update result with standard fields: + for k, v in attrs.get(self.standardAspect, {}).items(): + result['standard.' + k] = v return result @@ -121,6 +127,12 @@ class ClientInstanceEditor(ClientInstance): values[name] = value fi.change = (oldValue, value) formState.changed = True + # update standard field if appropriate: + standardFieldName = f.standardFieldName + if standardFieldName: + standardValues = attrs.setdefault(self.standardAspect, OOBTree()) + if value != standardValues.get(standardFieldName): + standardValues[standardFieldName] = value return formState def validate(self, data): diff --git a/composer/schema/interfaces.py b/composer/schema/interfaces.py index c3fd152..a02f719 100644 --- a/composer/schema/interfaces.py +++ b/composer/schema/interfaces.py @@ -82,6 +82,14 @@ fieldTypes = SimpleVocabulary(( storeData=False), )) +standardFieldNames = SimpleVocabulary(( + SimpleTerm('', '', 'Not selected'), + SimpleTerm('lastName', 'lastName', 'Last name'), + SimpleTerm('firstName', 'firstName', 'First name'), + SimpleTerm('organization', 'organization', 'Organization'), + SimpleTerm('email', 'email', 'E-Mail address'), +)) + class IField(IComponent): """ May be used for data entry or display. """ @@ -104,6 +112,13 @@ class IField(IComponent): required=True, default='textline', vocabulary=fieldTypes,) + standardFieldName = schema.Choice( + title=_(u'Standard field name'), + description=_(u'Provide the values entered in this field ' + 'as one of the standard informations.'), + required=False, + default='', + vocabulary=standardFieldNames,) defaultValue = schema.TextLine( title=_(u'Default'), description=_(u'Value with which to pre-set the field contents'), @@ -162,7 +177,7 @@ class IFormState(Interface): """ Represents the state of all fields when editing. """ - fieldStates = Attribute('A mapping ``{fieldName: fieldState, ...}``.') + fieldInstances = Attribute('A mapping ``{fieldName: fieldInstance, ...}``.') changed = Attribute('True if one of the fields has been changed') severity = Attribute("An integer giving an overall state or error " "code, typically the maximum of the field instances' " diff --git a/organize/browser/service.py b/organize/browser/service.py index e46ce4b..85ff1db 100644 --- a/organize/browser/service.py +++ b/organize/browser/service.py @@ -29,6 +29,7 @@ from zope.cachedescriptors.property import Lazy from cybertools.organize.interfaces import IClientRegistrations, IRegistrationTemplate from cybertools.organize.interfaces import serviceCategories +from cybertools.composer.interfaces import IInstance from cybertools.composer.schema.browser.common import BaseView as SchemaBaseView from cybertools.composer.schema.interfaces import IClientFactory from cybertools.util.format import formatDate @@ -71,7 +72,7 @@ class BaseView(object): class ServiceManagerView(BaseView): def getCustomView(self): - viewName = self.context.viewName + viewName = self.context.getViewName() if viewName: return component.getMultiAdapter((self.context, self.request), name=viewName) @@ -138,6 +139,14 @@ class ServiceView(BaseView): tpl = ServiceManagerView(man, self.request).findRegistrationTemplate(context) return self.getUrlForObject(tpl) + def getClientData(self, clientName): + manager = self.context.getManager() + client = manager.getClients().get(clientName) + if client is None: + return {} + instance = IInstance(client) + return instance.applyTemplate() + class RegistrationTemplateView(SchemaBaseView): @@ -163,6 +172,20 @@ class RegistrationTemplateView(SchemaBaseView): def getRegistratedServicesTokens(self): return [r.service.token for r in self.getRegistrations()] + def getData(self): + """ Retrieve standard field data (accessible without providing + a template) from the client object. + """ + clientName = self.getClientName() + if not clientName: + return {} + manager = self.context.getManager() + client = manager.getClients().get(clientName) + if client is None: + return {} + instance = IInstance(client) + return instance.applyTemplate() + def update(self): form = self.request.form clientName = self.getClientName() @@ -173,7 +196,6 @@ class RegistrationTemplateView(SchemaBaseView): client = manager.getClients().get(clientName) if client is None: return True - #self.setClientName(clientName) # store in view and session else: client = IClientFactory(manager)() clientName = self.clientName = manager.addClient(client) diff --git a/organize/interfaces.py b/organize/interfaces.py index d3d82f4..c14e3d1 100644 --- a/organize/interfaces.py +++ b/organize/interfaces.py @@ -183,12 +183,52 @@ class IService(Interface): vocabulary=serviceCategories, default='event', required=False,) + externalId = schema.TextLine( + title=_(u'External ID'), + description=_(u'Identifier in external system or code number.'), + required=False,) + cost = schema.Int( + title=_(u'Cost'), + description=_(u'Cost or prizing information.'), + required=False,) capacity = schema.Int( title=_(u'Capacity'), description=_(u'The capacity (maximum number of clients) ' 'of this service; a negative number means: ' 'no restriction, i.e. unlimited capacity.'), required=False,) + waitingList = schema.Bool( + title=_(u'Waiting list'), + description=_(u'Check this field if participants beyond the ' + 'capacity of the service should be kept in a ' + 'waiting list.'), + required=False,) + location = schema.TextLine( + title=_(u'Location Information'), + description=_(u'Basic location information or ' + 'start point for transport services.'), + required=False,) + locationUrl = schema.TextLine( + title=_(u'URL for location'), + description=_(u'Web address (URL) with more information ' + 'about the location.'), + required=False,) + location2 = schema.TextLine( + title=_(u'Location Information (2)'), + description=_(u'Additional location information or ' + 'end point for transport services.'), + required=False,) + location2Url = schema.TextLine( + title=_(u'URL for location (2)'), + description=_(u'Web address (URL) with more information ' + 'about the location.'), + required=False,) + webAddress = schema.TextLine( + title=_(u'Web address'), + description=_(u'Web address (URL) for more information ' + 'about the service.'), + required=False,) + availableCapacity = Attribute('Available capacity, i.e. number of seats ' 'still available; a negative number means: ' 'no restriction, i.e. unlimited capacity; ' @@ -224,12 +264,14 @@ class IScheduledService(IService): title=_(u'Start date/time'), description=_(u'The date/time when the service starts'), required=False,) - start.default_method = 'getStartFromManager' end = schema.Date( title=_(u'End date/time'), description=_(u'The date/time when the service ends'), required=False,) + + start.default_method = 'getStartFromManager' end.default_method = 'getEndFromManager' + duration = Attribute('Time delta between start and end date/time.')