allow registratin with number of participants

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@1987 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2007-09-01 16:40:11 +00:00
parent fb12b07bf3
commit e2e4f5ea8c
3 changed files with 48 additions and 11 deletions

View file

@ -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)

View file

@ -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):

View file

@ -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)