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
	
	 helmutm
						helmutm