more control on registration process; registration template allows selection of services by category
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2082 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
		
							parent
							
								
									32c52c7b31
								
							
						
					
					
						commit
						4affa83236
					
				
					 3 changed files with 68 additions and 14 deletions
				
			
		|  | @ -82,19 +82,25 @@ class ServiceManagerView(BaseView): | |||
|     def manager(self): | ||||
|         return self.context | ||||
| 
 | ||||
|     def findRegistrationTemplate(self, service): | ||||
|         """ Find a registration template that provides the registration | ||||
|             for the service given. | ||||
|     def getRegistrationTemplate(self, service=None, preferRegistrationTemplate=False): | ||||
|         """ Find a suitable data or registration template. | ||||
|         """ | ||||
|         first = None | ||||
|         for tpl in self.context.getClientSchemas(): | ||||
|             if not preferRegistrationTemplate: | ||||
|                 return tpl | ||||
|             if IRegistrationTemplate.providedBy(tpl): | ||||
|                 # TODO (optional): make sure template provides registration | ||||
|                 # for service given. | ||||
|                 return tpl | ||||
|             if first is None: | ||||
|                 first = tpl | ||||
|             if IRegistrationTemplate.providedBy(tpl): | ||||
|                 # TODO: check that service is really provided by this template | ||||
|                 return tpl | ||||
|         return first | ||||
| 
 | ||||
|     def registrationUrl(self): | ||||
|         tpl = self.getRegistrationTemplate() | ||||
|         return self.getUrlForObject(tpl) | ||||
| 
 | ||||
|     def overview(self, includeCategories=None): | ||||
|         result = [] | ||||
|         classific = [] | ||||
|  | @ -178,7 +184,7 @@ class ServiceView(BaseView): | |||
|     def getRegistrationTemplate(self): | ||||
|         context = self.context | ||||
|         man = context.getManager() | ||||
|         return ServiceManagerView(man, self.request).findRegistrationTemplate(context) | ||||
|         return ServiceManagerView(man, self.request).getRegistrationTemplate() | ||||
| 
 | ||||
|     def registrationUrl(self): | ||||
|         tpl = self.getRegistrationTemplate() | ||||
|  |  | |||
|  | @ -149,6 +149,19 @@ class IServiceManager(Interface): | |||
|                 vocabulary=serviceManagerViews, | ||||
|                 default='', | ||||
|                 required=False,) | ||||
|     allowRegWithNumber = schema.Bool( | ||||
|                 title=_(u'Allow registration with number'), | ||||
|                 description=_(u'When this field is checked more than one ' | ||||
|                         'object (participant) may be assigned with one ' | ||||
|                         'registration by entering a corresponding number.'), | ||||
|                 required=False,) | ||||
|     allowDirectRegistration = schema.Bool( | ||||
|                 title=_(u'Allow direct registration'), | ||||
|                 description=_(u'When this field is checked participants ' | ||||
|                         'may register themselves directly on the page ' | ||||
|                         'with the service description; otherwise registration ' | ||||
|                         'is only possible on a registration template.'), | ||||
|                 required=False,) | ||||
| 
 | ||||
|     services = Attribute('A collection of services managed by this object.') | ||||
| 
 | ||||
|  | @ -189,6 +202,13 @@ class IService(Interface): | |||
|                         'object (participant) may be assigned with one ' | ||||
|                         'registration by entering a corresponding number.'), | ||||
|                 required=False,) | ||||
|     allowDirectRegistration = schema.Bool( | ||||
|                 title=_(u'Allow direct registration'), | ||||
|                 description=_(u'When this field is checked participants ' | ||||
|                         'may register themselves directly on the page ' | ||||
|                         'with the service description; otherwise registration ' | ||||
|                         'is only possible on a registration template.'), | ||||
|                 required=False,) | ||||
|     externalId = schema.TextLine( | ||||
|                 title=_(u'External ID'), | ||||
|                 description=_(u'Identifier in external system or code number.'), | ||||
|  | @ -240,6 +260,9 @@ class IService(Interface): | |||
|                 'no restriction, i.e. unlimited capacity; ' | ||||
|                 'read-only') | ||||
| 
 | ||||
|     allowRegWithNumber.default_method = 'getAllowRegWithNumberFromManager' | ||||
|     allowDirectRegistration.default_method = 'getAllowDirectRegistrationFromManager' | ||||
| 
 | ||||
|     token = Attribute('A name unique within the manager of this service ' | ||||
|                 'used for identifying the service e.g. in forms.') | ||||
|     serviceGroup = Attribute('The service group this object is an instance of.') | ||||
|  | @ -317,9 +340,14 @@ class IRegistrationTemplate(Interface): | |||
|         The client should be accessed via an IClientRegistrations adapter. | ||||
|     """ | ||||
| 
 | ||||
|     # TODO: provide fields for criteria for selecting the services | ||||
|     #       that should be handled by this object, e.g. service | ||||
|     #       category/ies or classification(s). | ||||
|     categories = schema.List( | ||||
|                 title=_(u'Categories'), | ||||
|                 description=_(u'A list of categories that of services ' | ||||
|                         'that should be shown on this template.'), | ||||
|                 default=[], | ||||
|                 required=False,) | ||||
| 
 | ||||
|     categories.vocabulary = serviceCategories | ||||
| 
 | ||||
|     manager = Attribute('The service manager this object belongs to.') | ||||
|     services = Attribute('A collection of services to which this ' | ||||
|  |  | |||
|  | @ -54,13 +54,16 @@ class ServiceManager(object): | |||
|     services = None | ||||
|     clients = None | ||||
| 
 | ||||
|     allowRegWithNumber = False | ||||
|     allowDirectRegistration = True | ||||
| 
 | ||||
|     def __init__(self): | ||||
|         if self.servicesFactory is not None: | ||||
|             self.services = self.servicesFactory() | ||||
|         if self.clientSchemasFactory is not None: | ||||
|             self.clientSchemas = self.clientSchemasFactory() | ||||
| 
 | ||||
|     def getServices(self): | ||||
|     def getServices(self, categories=[]): | ||||
|         return self.services | ||||
| 
 | ||||
|     def getClientSchemas(self): | ||||
|  | @ -95,6 +98,7 @@ class Service(object): | |||
|     manager = None | ||||
|     category = None | ||||
|     allowRegWithNumber = False | ||||
|     allowDirectRegistration = True | ||||
| 
 | ||||
|     def __init__(self, name=None, title=u'', capacity=-1, **kw): | ||||
|         self.name = self.__name__ = name | ||||
|  | @ -151,6 +155,12 @@ class Service(object): | |||
|         if clientName in self.registrations: | ||||
|             del self.registrations[clientName] | ||||
| 
 | ||||
|     # default methods | ||||
|     def getAllowRegWithNumberFromManager(self): | ||||
|         return getattr(self.getManager(), 'allowRegWithNumber', None) | ||||
|     def getAllowDirectRegistrationFromManager(self): | ||||
|         return getattr(self.getManager(), 'allowDirectRegistration', None) | ||||
| 
 | ||||
| 
 | ||||
| class ScheduledService(Service): | ||||
| 
 | ||||
|  | @ -158,6 +168,7 @@ class ScheduledService(Service): | |||
| 
 | ||||
|     start = end = None | ||||
| 
 | ||||
|     # default methods | ||||
|     def getStartFromManager(self): | ||||
|         return getattr(self.getManager(), 'start', None) | ||||
|     def getEndFromManager(self): | ||||
|  | @ -186,14 +197,19 @@ class RegistrationTemplate(object): | |||
|     def __init__(self, name=None, manager=None): | ||||
|         self.name = self.__name__ = name | ||||
|         self.manager = self.__parent__ = manager | ||||
|         self.categories = [] | ||||
| 
 | ||||
|     @property | ||||
|     def services(self): | ||||
|         return self.getServices() | ||||
| 
 | ||||
|     def getServices(self): | ||||
|         # TODO: Restrict according to the objects selection criteria | ||||
|         return self.getManager().getServices() | ||||
|         svcs = self.getManager().getServices() | ||||
|         categories = [c.strip() for c in self.categories if c.strip()] | ||||
|         if categories: | ||||
|             svcs = Jeep((key, s) for key, s in svcs.items() | ||||
|                                  if s.category in categories) | ||||
|         return svcs | ||||
| 
 | ||||
|     def getManager(self): | ||||
|         return self.manager | ||||
|  | @ -229,7 +245,11 @@ class ClientRegistrations(object): | |||
| 
 | ||||
|     def getRegistrations(self): | ||||
|         # TODO: restrict to services on this template | ||||
|         return getattr(self.context, self.registrationsAttributeName, []) | ||||
|         regs = getattr(self.context, self.registrationsAttributeName, []) | ||||
|         if self.template is None: | ||||
|             return regs | ||||
|         svcs = self.template.getServices().values() | ||||
|         return [r for r in regs if r.service in svcs] | ||||
| 
 | ||||
| 
 | ||||
| # registration states definition | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 helmutm
						helmutm