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