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:
parent
59b0f28f72
commit
f07dd40bd9
3 changed files with 35 additions and 11 deletions
|
@ -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
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
|
@ -303,7 +303,7 @@ class ServiceView(BaseView):
|
|||
context = self.context
|
||||
if not context.allowDirectRegistration:
|
||||
return False
|
||||
return (self.capacityAvailable()
|
||||
return (self.capacityAvailable() or self.context.waitingList
|
||||
or self.getClientName() in context.registrations)
|
||||
|
||||
def capacityAvailable(self):
|
||||
|
@ -331,8 +331,9 @@ class ServiceView(BaseView):
|
|||
def getRegistrationInfo(self, reg):
|
||||
registration = self.getRegistrations()[reg]
|
||||
state = IStateful(registration).getStateObject()
|
||||
number=registration.number
|
||||
return dict(number=number, state=state.name, stateTitle=state.title)
|
||||
return dict(number=registration.number,
|
||||
numberWaiting=registration.numberWaiting,
|
||||
state=state.name, stateTitle=state.title)
|
||||
|
||||
@Lazy
|
||||
def registeredTotalSubmitted(self):
|
||||
|
@ -345,6 +346,18 @@ class ServiceView(BaseView):
|
|||
total += reg.number
|
||||
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):
|
||||
newClient = False
|
||||
nextUrl = None
|
||||
|
@ -424,7 +437,7 @@ class RegistrationTemplateView(BaseView):
|
|||
return (svc.category, svc.getClassification(), svc.start)
|
||||
|
||||
def allowRegistration(self, service):
|
||||
return (self.capacityAvailable(service)
|
||||
return (self.capacityAvailable(service) or service.waitingList
|
||||
or service in self.getRegisteredServices())
|
||||
|
||||
def capacityAvailable(self, service):
|
||||
|
|
|
@ -350,6 +350,8 @@ class IRegistration(Interface):
|
|||
timeStamp = Attribute('An integer denoting the time of registration.')
|
||||
number = Attribute('The number of objects (e.g. persons) registered '
|
||||
'- usually == 1.')
|
||||
numberWaiting = Attribute('The number of objects registered that are '
|
||||
'on the waiting list.')
|
||||
|
||||
|
||||
class IRegistrationTemplate(Interface):
|
||||
|
|
|
@ -102,12 +102,14 @@ class Registration(object):
|
|||
implements(IRegistration)
|
||||
|
||||
number = 1
|
||||
numberWaiting = 0
|
||||
|
||||
def __init__(self, client, service, number=1):
|
||||
def __init__(self, client, service, number=1, numberWaiting=0):
|
||||
self.client = client
|
||||
self.service = service
|
||||
self.timeStamp = int(time())
|
||||
self.number = number
|
||||
self.numberWaiting = numberWaiting
|
||||
|
||||
|
||||
class PersistentRegistration(Registration, Persistent):
|
||||
|
@ -167,13 +169,20 @@ class Service(object):
|
|||
|
||||
def register(self, client, number=1):
|
||||
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:
|
||||
reg = self.registrations[clientName]
|
||||
if number != reg.number:
|
||||
reg.number = number
|
||||
# TODO: set timeStamp
|
||||
if numberWaiting != reg.numberWaiting:
|
||||
reg.numberWaiting = numberWaiting
|
||||
return reg
|
||||
reg = self.registrationFactory(client, self, number)
|
||||
reg = self.registrationFactory(client, self, number, numberWaiting)
|
||||
self.registrations[clientName] = reg
|
||||
return reg
|
||||
|
||||
|
@ -289,7 +298,8 @@ class ClientRegistrations(object):
|
|||
oldN = oldReg.number or 0
|
||||
else:
|
||||
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']
|
||||
entry = self.errors.setdefault(svc.token, [])
|
||||
entry.append(error)
|
||||
|
@ -396,14 +406,13 @@ def getCheckoutRule(sender):
|
|||
"""
|
||||
checkoutRule = Rule('checkout')
|
||||
checkoutRule.events.append(eventTypes['service.checkout'])
|
||||
#checkoutRule.actions.append(Action('message',
|
||||
# parameters=dict(messageName='feedback_text')))
|
||||
checkoutRule.actions.append(Action('sendmail',
|
||||
parameters=dict(sender=sender,
|
||||
messageName='feedback_text')))
|
||||
checkoutRule.actions.append(Action('redirect',
|
||||
parameters=dict(viewName='message_view.html',
|
||||
messageName='feedback_html')))
|
||||
messageName='feedback_html',
|
||||
clearClient=True)))
|
||||
return checkoutRule
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue