provide basic waiting list functionality; clear client name on checkout

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3424 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2009-06-20 11:15:06 +00:00
parent 59b0f28f72
commit f07dd40bd9
3 changed files with 35 additions and 11 deletions

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2007 Helmut Merz helmutm@cy55.de # Copyright (c) 2009 Helmut Merz helmutm@cy55.de
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -303,7 +303,7 @@ class ServiceView(BaseView):
context = self.context context = self.context
if not context.allowDirectRegistration: if not context.allowDirectRegistration:
return False return False
return (self.capacityAvailable() return (self.capacityAvailable() or self.context.waitingList
or self.getClientName() in context.registrations) or self.getClientName() in context.registrations)
def capacityAvailable(self): def capacityAvailable(self):
@ -331,8 +331,9 @@ class ServiceView(BaseView):
def getRegistrationInfo(self, reg): def getRegistrationInfo(self, reg):
registration = self.getRegistrations()[reg] registration = self.getRegistrations()[reg]
state = IStateful(registration).getStateObject() state = IStateful(registration).getStateObject()
number=registration.number return dict(number=registration.number,
return dict(number=number, state=state.name, stateTitle=state.title) numberWaiting=registration.numberWaiting,
state=state.name, stateTitle=state.title)
@Lazy @Lazy
def registeredTotalSubmitted(self): def registeredTotalSubmitted(self):
@ -345,6 +346,18 @@ class ServiceView(BaseView):
total += reg.number total += reg.number
return total return total
@Lazy
def registeredTotalsSubmitted(self):
# TODO: clean-up temporary registrations
# return self.context.getNumberRegistered()
total = totalWaiting = 0
for reg in self.getRegistrations().values():
state = IStateful(reg).getStateObject()
if state.name != 'temporary':
total += reg.number
totalWaiting += reg.numberWaiting
return dict(number=total, numberWaiting=totalWaiting)
def update(self): def update(self):
newClient = False newClient = False
nextUrl = None nextUrl = None
@ -424,7 +437,7 @@ class RegistrationTemplateView(BaseView):
return (svc.category, svc.getClassification(), svc.start) return (svc.category, svc.getClassification(), svc.start)
def allowRegistration(self, service): def allowRegistration(self, service):
return (self.capacityAvailable(service) return (self.capacityAvailable(service) or service.waitingList
or service in self.getRegisteredServices()) or service in self.getRegisteredServices())
def capacityAvailable(self, service): def capacityAvailable(self, service):

View file

@ -350,6 +350,8 @@ class IRegistration(Interface):
timeStamp = Attribute('An integer denoting the time of registration.') timeStamp = Attribute('An integer denoting the time of registration.')
number = Attribute('The number of objects (e.g. persons) registered ' number = Attribute('The number of objects (e.g. persons) registered '
'- usually == 1.') '- usually == 1.')
numberWaiting = Attribute('The number of objects registered that are '
'on the waiting list.')
class IRegistrationTemplate(Interface): class IRegistrationTemplate(Interface):

View file

@ -102,12 +102,14 @@ class Registration(object):
implements(IRegistration) implements(IRegistration)
number = 1 number = 1
numberWaiting = 0
def __init__(self, client, service, number=1): def __init__(self, client, service, number=1, numberWaiting=0):
self.client = client self.client = client
self.service = service self.service = service
self.timeStamp = int(time()) self.timeStamp = int(time())
self.number = number self.number = number
self.numberWaiting = numberWaiting
class PersistentRegistration(Registration, Persistent): class PersistentRegistration(Registration, Persistent):
@ -167,13 +169,20 @@ class Service(object):
def register(self, client, number=1): def register(self, client, number=1):
clientName = client.__name__ clientName = client.__name__
numberWaiting = 0
if (self.waitingList and self.availableCapacity >= 0
and number > self.availableCapacity):
numberWaiting = number - self.availableCapacity
number = self.availableCapacity
if clientName in self.registrations: if clientName in self.registrations:
reg = self.registrations[clientName] reg = self.registrations[clientName]
if number != reg.number: if number != reg.number:
reg.number = number reg.number = number
# TODO: set timeStamp # TODO: set timeStamp
if numberWaiting != reg.numberWaiting:
reg.numberWaiting = numberWaiting
return reg return reg
reg = self.registrationFactory(client, self, number) reg = self.registrationFactory(client, self, number, numberWaiting)
self.registrations[clientName] = reg self.registrations[clientName] = reg
return reg return reg
@ -289,7 +298,8 @@ class ClientRegistrations(object):
oldN = oldReg.number or 0 oldN = oldReg.number or 0
else: else:
oldN = 0 oldN = 0
if svc.capacity and svc.capacity > 0 and svc.availableCapacity < n - oldN: if (not svc.waitingList and svc.capacity and svc.capacity > 0
and svc.availableCapacity < n - oldN):
error = registrationErrors['capacity_exceeded'] error = registrationErrors['capacity_exceeded']
entry = self.errors.setdefault(svc.token, []) entry = self.errors.setdefault(svc.token, [])
entry.append(error) entry.append(error)
@ -396,14 +406,13 @@ def getCheckoutRule(sender):
""" """
checkoutRule = Rule('checkout') checkoutRule = Rule('checkout')
checkoutRule.events.append(eventTypes['service.checkout']) checkoutRule.events.append(eventTypes['service.checkout'])
#checkoutRule.actions.append(Action('message',
# parameters=dict(messageName='feedback_text')))
checkoutRule.actions.append(Action('sendmail', checkoutRule.actions.append(Action('sendmail',
parameters=dict(sender=sender, parameters=dict(sender=sender,
messageName='feedback_text'))) messageName='feedback_text')))
checkoutRule.actions.append(Action('redirect', checkoutRule.actions.append(Action('redirect',
parameters=dict(viewName='message_view.html', parameters=dict(viewName='message_view.html',
messageName='feedback_html'))) messageName='feedback_html',
clearClient=True)))
return checkoutRule return checkoutRule