From e2e4f5ea8c932192fb6b408fd9792f49e2dfebbb Mon Sep 17 00:00:00 2001 From: helmutm Date: Sat, 1 Sep 2007 16:40:11 +0000 Subject: [PATCH] allow registratin with number of participants git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@1987 fd906abe-77d9-0310-91a1-e0d9ade77398 --- organize/browser/service.py | 23 +++++++++++++++++++---- organize/interfaces.py | 12 +++++++++++- organize/service.py | 24 ++++++++++++++++++------ 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/organize/browser/service.py b/organize/browser/service.py index 85ff1db..d9e8212 100644 --- a/organize/browser/service.py +++ b/organize/browser/service.py @@ -169,9 +169,12 @@ class RegistrationTemplateView(SchemaBaseView): regs.template = self.context return regs.getRegistrations() - def getRegistratedServicesTokens(self): + def getRegisteredServicesTokens(self): return [r.service.token for r in self.getRegistrations()] + def getRegistrationsDict(self): + return dict((r.service.token, r) for r in self.getRegistrations()) + def getData(self): """ Retrieve standard field data (accessible without providing a template) from the client object. @@ -201,11 +204,23 @@ class RegistrationTemplateView(SchemaBaseView): clientName = self.clientName = manager.addClient(client) regs = IClientRegistrations(client) regs.template = self.context - allServices = self.getServices() + services = manager.getServices() # a mapping! + allServices = services.values() oldServices = [r.service for r in regs.getRegistrations()] - newServices = [manager.getServices()[token] + # collect check boxes: + newServices = [services[token] for token in form.get('service_tokens', [])] - regs.register(newServices) + # collect numerical input: + numbers = len(newServices) * [1] + for token, svc in services.items(): + try: + value = int(form.get('service.' + token, 0)) + except ValueError: + value = 1 + if value > 0: + newServices.append(svc) + numbers.append(value) + regs.register(newServices, numbers=numbers) toDelete = [s for s in oldServices if s in allServices and s not in newServices] regs.unregister(toDelete) diff --git a/organize/interfaces.py b/organize/interfaces.py index c14e3d1..6473ae0 100644 --- a/organize/interfaces.py +++ b/organize/interfaces.py @@ -183,6 +183,12 @@ class IService(Interface): vocabulary=serviceCategories, default='event', required=False,) + allowRegWithNumber = schema.Bool( + title=_(u'Allow registration with number'), + description=_(u'When this field is checked more than one ' + 'object (participant) may be assigned with one ' + 'registration by entering a corresponding number.'), + required=False,) externalId = schema.TextLine( title=_(u'External ID'), description=_(u'Identifier in external system or code number.'), @@ -297,7 +303,11 @@ class IRegistration(Interface): """ Information about the registration of a client with a service. """ - client = Attribute('The client registered') + client = Attribute('The client registered.') + service = Attribute('The service the client is registered for.') + timeStamp = Attribute('An integer denoting the time of registration.') + number = Attribute('The number of objects (e.g. persons) registered ' + '- usually == 1.') class IRegistrationTemplate(Interface): diff --git a/organize/service.py b/organize/service.py index ed68346..20b94e6 100644 --- a/organize/service.py +++ b/organize/service.py @@ -23,6 +23,7 @@ $Id$ """ from time import time +from persistent import Persistent from BTrees.OOBTree import OOBTree from zope.cachedescriptors.property import Lazy from zope.component import adapts @@ -93,6 +94,7 @@ class Service(object): manager = None category = None + allowRegWithNumber = False def __init__(self, name=None, title=u'', capacity=-1, **kw): self.name = self.__name__ = name @@ -129,11 +131,15 @@ class Service(object): return 0 return self.capacity - len(self.registrations) - def register(self, client): + def register(self, client, number=1): clientName = client.__name__ if clientName in self.registrations: - return self.registrations[clientName] - reg = Registration(client, self) + reg = self.registrations[clientName] + if number != reg.number: + reg.number = number + self.registrations[clientName] = reg # persistence hack + return reg + reg = Registration(client, self, number) self.registrations[clientName] = reg return reg #if self.availableCapacity: @@ -164,10 +170,13 @@ class Registration(object): implements(IRegistration) - def __init__(self, client, service): + number = 1 + + def __init__(self, client, service, number=1): self.client = client self.service = service self.timeStamp = int(time()) + self.number = number class RegistrationTemplate(object): @@ -202,8 +211,11 @@ class ClientRegistrations(object): def __init__(self, context): self.context = context - def register(self, services): - regs = [service.register(self.context) for service in services] + def register(self, services, numbers=None): + if numbers is None: + numbers = len(services) * [1] + regs = [service.register(self.context, numbers[idx]) + for idx, service in enumerate(services)] old = getattr(self.context, self.registrationsAttributeName, []) regs.extend(r for r in old if r.service not in services) setattr(self.context, self.registrationsAttributeName, regs)