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
|
# 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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue