From f07dd40bd9ff4b8caa13e99d399bc95a21b58abf Mon Sep 17 00:00:00 2001 From: helmutm Date: Sat, 20 Jun 2009 11:15:06 +0000 Subject: [PATCH] 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 --- organize/browser/service.py | 23 ++++++++++++++++++----- organize/interfaces.py | 2 ++ organize/service.py | 21 +++++++++++++++------ 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/organize/browser/service.py b/organize/browser/service.py index 1f688f4..38b35b2 100644 --- a/organize/browser/service.py +++ b/organize/browser/service.py @@ -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): diff --git a/organize/interfaces.py b/organize/interfaces.py index 28b80bc..25d441f 100644 --- a/organize/interfaces.py +++ b/organize/interfaces.py @@ -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): diff --git a/organize/service.py b/organize/service.py index 30d0280..4db075d 100644 --- a/organize/service.py +++ b/organize/service.py @@ -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