minor modifictaions and extensions for the tum.sm project

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@1936 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2007-08-20 10:03:32 +00:00
parent a9b3f303fa
commit 154f2dcead
8 changed files with 123 additions and 20 deletions

View file

@ -72,7 +72,7 @@ class BaseView(object):
@Lazy @Lazy
def url(self): def url(self):
from zope.traversing.browser import absoluteURL from zope.traversing.browser import absoluteURL
url = absoluteURL(self.context, self.request) return absoluteURL(self.context, self.request)
buttonActions = dict( buttonActions = dict(
submit_previous=getPreviousTemplate, submit_previous=getPreviousTemplate,

View file

@ -26,16 +26,27 @@ from zope import component
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from cybertools.organize.interfaces import IClientRegistrations, IRegistrationTemplate from cybertools.organize.interfaces import IClientRegistrations, IRegistrationTemplate
from cybertools.composer.schema.browser.common import BaseView from cybertools.composer.schema.browser.common import BaseView as SchemaBaseView
from cybertools.composer.schema.interfaces import IClientFactory from cybertools.composer.schema.interfaces import IClientFactory
class ServiceManagerView(object): class BaseView(object):
def __init__(self, context, request): def __init__(self, context, request):
self.context = context self.context = context
self.request = request self.request = request
@Lazy
def url(self):
return self.getUrlForObject(self.context)
def getUrlForObject(self, obj):
from zope.traversing.browser import absoluteURL
return absoluteURL(obj, self.request)
class ServiceManagerView(BaseView):
def findRegistrationTemplate(self, service): def findRegistrationTemplate(self, service):
""" Find a registration template that provides the registration """ Find a registration template that provides the registration
for the service given. for the service given.
@ -46,18 +57,48 @@ class ServiceManagerView(object):
return tpl return tpl
return None return None
def overview(self):
result = []
classific = []
category = None
maxLevel = 0
svcs = sorted(self.context.getServices(),
key=lambda x: (x.getCategory(), x.getClassification()))
for svc in svcs:
cat = svc.getCategory()
if cat != category:
result.append(dict(isHeadline=True, title=cat, level=0))
category = cat
classific = []
clsf = svc.getClassification()
for idx, element in enumerate(clsf):
level = idx + 1
if (len(classific) <= idx or
classific[idx].name != element.name):
result.append(dict(isHeadline=True, title=element.title,
level=level))
classific = clsf
if level > maxLevel:
maxLevel = level
result.append(dict(isHeadline=False, level=maxLevel+1,
title=svc.title or svc.getName(),
object=svc))
return result
class ServiceView(object):
def __init__(self, context, request): class ServiceView(BaseView):
self.context = context
self.request = request
def getRegistrations(self): def getRegistrations(self):
return self.context.registrations return self.context.registrations
def registrationUrl(self):
context = self.context
man = context.getManager()
tpl = ServiceManagerView(man, self.request).findRegistrationTemplate(context)
return self.getUrlForObject(tpl)
class RegistrationTemplateView(BaseView):
class RegistrationTemplateView(SchemaBaseView):
@Lazy @Lazy
def services(self): def services(self):

View file

@ -141,6 +141,8 @@ class IService(Interface):
""" A service that clients may register with. """ A service that clients may register with.
""" """
title = Attribute('A descriptive but short title')
description = schema.Text( description = schema.Text(
title=_(u'Description'), title=_(u'Description'),
description=_(u'A brief description of the item.'), description=_(u'A brief description of the item.'),

View file

@ -29,6 +29,9 @@ from zope.component import adapts
from zope.interface import implements from zope.interface import implements
from cybertools.composer.interfaces import IInstance from cybertools.composer.interfaces import IInstance
from cybertools.composer.schema.interfaces import IClientManager, IClient from cybertools.composer.schema.interfaces import IClientManager, IClient
from cybertools.stateful.definition import registerStatesDefinition
from cybertools.stateful.definition import StatesDefinition
from cybertools.stateful.definition import State, Transition
from cybertools.util.jeep import Jeep from cybertools.util.jeep import Jeep
from cybertools.util.randomname import generateName from cybertools.util.randomname import generateName
@ -87,11 +90,30 @@ class Service(object):
registrationsFactory = OOBTree registrationsFactory = OOBTree
def __init__(self, name=None, capacity=-1): manager = None
self.name = name category = None
def __init__(self, name=None, title=u'', capacity=-1, **kw):
self.name = self.__name__ = name
self.title = title
self.capacity = capacity self.capacity = capacity
if self.registrationsFactory is not None: if self.registrationsFactory is not None:
self.registrations = self.registrationsFactory() self.registrations = self.registrationsFactory()
self.classification = []
for k, v in kw.items():
setattr(self, k, v)
def getName(self):
return self.name
def getManager(self):
return self.manager
def getClassification(self):
return self.classification
def getCategory(self):
return self.category
@property @property
def token(self): def token(self):
@ -110,11 +132,12 @@ class Service(object):
clientName = client.__name__ clientName = client.__name__
if clientName in self.registrations: if clientName in self.registrations:
return self.registrations[clientName] return self.registrations[clientName]
if self.availableCapacity:
reg = Registration(client, self) reg = Registration(client, self)
self.registrations[clientName] = reg self.registrations[clientName] = reg
return reg return reg
return None #if self.availableCapacity:
# TODO: handle case when no capacity available -
# probably on 'submit' transition; UI feedback?
def unregister(self, client): def unregister(self, client):
clientName = client.__name__ clientName = client.__name__
@ -188,6 +211,27 @@ class ClientRegistrations(object):
return getattr(self.context, self.registrationsAttributeName, []) return getattr(self.context, self.registrationsAttributeName, [])
# registration states definition
registerStatesDefinition(
StatesDefinition('organize.service.registration',
State('temporary', 'temporary', ('submit', 'cancel',)),
State('submitted', 'submitted', ('retract', 'setwaiting', 'confirm', 'reject',)),
State('cancelled', 'cancelled', ('submit',)),
State('retracted', 'retracted', ('submit',)),
State('waiting', 'waiting', ('retract', 'confirm', 'reject',)),
State('confirmed', 'confirmed', ('retract', 'reject',)),
State('rejected', 'rejected', ('retract', 'setwaiting', 'confirm',)),
Transition('cancel', 'Cancel registration', 'cancelled'),
Transition('submit', 'Submit registration', 'submitted'),
Transition('retract', 'Retract registration', 'retracted'),
Transition('setwaiting', 'Set on waiting list', 'waiting'),
Transition('confirm', 'Confirm registration', 'confirmed'),
Transition('reject', 'Reject registration', 'rejected'),
initialState='temporary',
))
# event handlers # event handlers
def clientRemoved(obj, event): def clientRemoved(obj, event):

View file

@ -62,12 +62,12 @@ class Stateful(object):
class StatefulAdapter(Stateful): class StatefulAdapter(Stateful):
""" An adapter for persistent objects to make the stateful. """ An adapter for persistent objects to make them stateful.
""" """
adapts(IPersistent) adapts(IPersistent)
statesAttributeName = '__states__' statesAttributeName = '__stateful_states__'
def __init__(self, context): def __init__(self, context):
self.context = context self.context = context

View file

@ -33,20 +33,24 @@ class State(object):
implements(IState) implements(IState)
def __init__(self, name, title, transitions): def __init__(self, name, title, transitions, **kw):
self.name = self.__name__ = name self.name = self.__name__ = name
self.title = title self.title = title
self.transitions = transitions self.transitions = transitions
for k, v in kw.items():
setattr(self, k, v)
class Transition(object): class Transition(object):
implements(ITransition) implements(ITransition)
def __init__(self, name, title, targetState): def __init__(self, name, title, targetState, **kw):
self.name = self.__name__ = name self.name = self.__name__ = name
self.title = title self.title = title
self.targetState = targetState self.targetState = targetState
for k, v in kw.items():
setattr(self, k, v)
class StatesDefinition(object): class StatesDefinition(object):

View file

@ -60,7 +60,7 @@ class IStateful(Interface):
def getAvailableTransitions(): def getAvailableTransitions():
""" Return the transitions for this object that are available in """ Return the transitions for this object that are available in
the current state. The implementation of the returned transition the current state. The implementation of the returned transition
objects is not specified, they may be an action dictionaries or objects is not specified, they may be action dictionaries or
special Transition objects. special Transition objects.
""" """

View file

@ -122,3 +122,15 @@ class Jeep(object):
if idx < 0: if idx < 0:
raise ValueError('list.index(x): x not in list') raise ValueError('list.index(x): x not in list')
return idx return idx
class Term(object):
""" A simple name/title association that may be put in a jeep object.
"""
def __init__(self, name, title, **kw):
self.name = self.__name__ = name
self.title = title
for k, v in kw.items():
setattr(self, k, v)