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 regs.template = self.context
return regs.getRegistrations() return regs.getRegistrations()
def getRegistratedServicesTokens(self): def getRegisteredServicesTokens(self):
return [r.service.token for r in self.getRegistrations()] 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): def getData(self):
""" Retrieve standard field data (accessible without providing """ Retrieve standard field data (accessible without providing
a template) from the client object. a template) from the client object.
@ -201,11 +204,23 @@ class RegistrationTemplateView(SchemaBaseView):
clientName = self.clientName = manager.addClient(client) clientName = self.clientName = manager.addClient(client)
regs = IClientRegistrations(client) regs = IClientRegistrations(client)
regs.template = self.context regs.template = self.context
allServices = self.getServices() services = manager.getServices() # a mapping!
allServices = services.values()
oldServices = [r.service for r in regs.getRegistrations()] 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', [])] 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 toDelete = [s for s in oldServices
if s in allServices and s not in newServices] if s in allServices and s not in newServices]
regs.unregister(toDelete) regs.unregister(toDelete)

View file

@ -183,6 +183,12 @@ class IService(Interface):
vocabulary=serviceCategories, vocabulary=serviceCategories,
default='event', default='event',
required=False,) 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( externalId = schema.TextLine(
title=_(u'External ID'), title=_(u'External ID'),
description=_(u'Identifier in external system or code number.'), 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. """ 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): class IRegistrationTemplate(Interface):

View file

@ -23,6 +23,7 @@ $Id$
""" """
from time import time from time import time
from persistent import Persistent
from BTrees.OOBTree import OOBTree from BTrees.OOBTree import OOBTree
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope.component import adapts from zope.component import adapts
@ -93,6 +94,7 @@ class Service(object):
manager = None manager = None
category = None category = None
allowRegWithNumber = False
def __init__(self, name=None, title=u'', capacity=-1, **kw): def __init__(self, name=None, title=u'', capacity=-1, **kw):
self.name = self.__name__ = name self.name = self.__name__ = name
@ -129,11 +131,15 @@ class Service(object):
return 0 return 0
return self.capacity - len(self.registrations) return self.capacity - len(self.registrations)
def register(self, client): def register(self, client, number=1):
clientName = client.__name__ clientName = client.__name__
if clientName in self.registrations: if clientName in self.registrations:
return self.registrations[clientName] reg = self.registrations[clientName]
reg = Registration(client, self) if number != reg.number:
reg.number = number
self.registrations[clientName] = reg # persistence hack
return reg
reg = Registration(client, self, number)
self.registrations[clientName] = reg self.registrations[clientName] = reg
return reg return reg
#if self.availableCapacity: #if self.availableCapacity:
@ -164,10 +170,13 @@ class Registration(object):
implements(IRegistration) implements(IRegistration)
def __init__(self, client, service): number = 1
def __init__(self, client, service, number=1):
self.client = client self.client = client
self.service = service self.service = service
self.timeStamp = int(time()) self.timeStamp = int(time())
self.number = number
class RegistrationTemplate(object): class RegistrationTemplate(object):
@ -202,8 +211,11 @@ class ClientRegistrations(object):
def __init__(self, context): def __init__(self, context):
self.context = context self.context = context
def register(self, services): def register(self, services, numbers=None):
regs = [service.register(self.context) for service in services] 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, []) old = getattr(self.context, self.registrationsAttributeName, [])
regs.extend(r for r in old if r.service not in services) regs.extend(r for r in old if r.service not in services)
setattr(self.context, self.registrationsAttributeName, regs) setattr(self.context, self.registrationsAttributeName, regs)