added attribute 'standardFieldName' to Field class for supplying a set of standard attributes; show these on forms and listings
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@1983 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
163e6dedd7
commit
fb12b07bf3
5 changed files with 99 additions and 7 deletions
|
@ -38,6 +38,7 @@ class Field(Component):
|
||||||
implements(IField)
|
implements(IField)
|
||||||
|
|
||||||
required = False
|
required = False
|
||||||
|
standardFieldName = None
|
||||||
|
|
||||||
def __init__(self, name, title=None, fieldType='textline', **kw):
|
def __init__(self, name, title=None, fieldType='textline', **kw):
|
||||||
assert name
|
assert name
|
||||||
|
|
|
@ -59,6 +59,10 @@ class ClientInstance(object):
|
||||||
def aspect(self):
|
def aspect(self):
|
||||||
return self.baseAspect + self.template.name
|
return self.baseAspect + self.template.name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def standardAspect(self):
|
||||||
|
return self.baseAspect + '__standard__'
|
||||||
|
|
||||||
def __init__(self, context):
|
def __init__(self, context):
|
||||||
self.context = context
|
self.context = context
|
||||||
|
|
||||||
|
@ -66,14 +70,14 @@ class ClientInstance(object):
|
||||||
""" Return a mapping of field names from self.template (a schema)
|
""" Return a mapping of field names from self.template (a schema)
|
||||||
to the corresponding values from the context object.
|
to the corresponding values from the context object.
|
||||||
"""
|
"""
|
||||||
result = {}
|
result = dict(__name__=self.context.__name__)
|
||||||
mode = kw.get('mode', 'view')
|
mode = kw.get('mode', 'view')
|
||||||
attrs = getattr(self.context, self.attrsName, None)
|
attrs = getattr(self.context, self.attrsName, None)
|
||||||
if attrs is None:
|
if attrs is None:
|
||||||
return result
|
return result
|
||||||
template = self.template
|
template = self.template
|
||||||
values = attrs.setdefault(self.aspect, {})
|
|
||||||
if template is not None:
|
if template is not None:
|
||||||
|
values = attrs.get(self.aspect, {})
|
||||||
for f in template.fields:
|
for f in template.fields:
|
||||||
fieldType = f.getFieldTypeInfo()
|
fieldType = f.getFieldTypeInfo()
|
||||||
if not fieldType.storeData:
|
if not fieldType.storeData:
|
||||||
|
@ -84,7 +88,9 @@ class ClientInstance(object):
|
||||||
value = values.get(name, u'')
|
value = values.get(name, u'')
|
||||||
value = mode == 'view' and fi.display(value) or fi.marshall(value)
|
value = mode == 'view' and fi.display(value) or fi.marshall(value)
|
||||||
result[name] = value
|
result[name] = value
|
||||||
result['__name__'] = self.context.__name__
|
# update result with standard fields:
|
||||||
|
for k, v in attrs.get(self.standardAspect, {}).items():
|
||||||
|
result['standard.' + k] = v
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
@ -121,6 +127,12 @@ class ClientInstanceEditor(ClientInstance):
|
||||||
values[name] = value
|
values[name] = value
|
||||||
fi.change = (oldValue, value)
|
fi.change = (oldValue, value)
|
||||||
formState.changed = True
|
formState.changed = True
|
||||||
|
# update standard field if appropriate:
|
||||||
|
standardFieldName = f.standardFieldName
|
||||||
|
if standardFieldName:
|
||||||
|
standardValues = attrs.setdefault(self.standardAspect, OOBTree())
|
||||||
|
if value != standardValues.get(standardFieldName):
|
||||||
|
standardValues[standardFieldName] = value
|
||||||
return formState
|
return formState
|
||||||
|
|
||||||
def validate(self, data):
|
def validate(self, data):
|
||||||
|
|
|
@ -82,6 +82,14 @@ fieldTypes = SimpleVocabulary((
|
||||||
storeData=False),
|
storeData=False),
|
||||||
))
|
))
|
||||||
|
|
||||||
|
standardFieldNames = SimpleVocabulary((
|
||||||
|
SimpleTerm('', '', 'Not selected'),
|
||||||
|
SimpleTerm('lastName', 'lastName', 'Last name'),
|
||||||
|
SimpleTerm('firstName', 'firstName', 'First name'),
|
||||||
|
SimpleTerm('organization', 'organization', 'Organization'),
|
||||||
|
SimpleTerm('email', 'email', 'E-Mail address'),
|
||||||
|
))
|
||||||
|
|
||||||
class IField(IComponent):
|
class IField(IComponent):
|
||||||
""" May be used for data entry or display.
|
""" May be used for data entry or display.
|
||||||
"""
|
"""
|
||||||
|
@ -104,6 +112,13 @@ class IField(IComponent):
|
||||||
required=True,
|
required=True,
|
||||||
default='textline',
|
default='textline',
|
||||||
vocabulary=fieldTypes,)
|
vocabulary=fieldTypes,)
|
||||||
|
standardFieldName = schema.Choice(
|
||||||
|
title=_(u'Standard field name'),
|
||||||
|
description=_(u'Provide the values entered in this field '
|
||||||
|
'as one of the standard informations.'),
|
||||||
|
required=False,
|
||||||
|
default='',
|
||||||
|
vocabulary=standardFieldNames,)
|
||||||
defaultValue = schema.TextLine(
|
defaultValue = schema.TextLine(
|
||||||
title=_(u'Default'),
|
title=_(u'Default'),
|
||||||
description=_(u'Value with which to pre-set the field contents'),
|
description=_(u'Value with which to pre-set the field contents'),
|
||||||
|
@ -162,7 +177,7 @@ class IFormState(Interface):
|
||||||
""" Represents the state of all fields when editing.
|
""" Represents the state of all fields when editing.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
fieldStates = Attribute('A mapping ``{fieldName: fieldState, ...}``.')
|
fieldInstances = Attribute('A mapping ``{fieldName: fieldInstance, ...}``.')
|
||||||
changed = Attribute('True if one of the fields has been changed')
|
changed = Attribute('True if one of the fields has been changed')
|
||||||
severity = Attribute("An integer giving an overall state or error "
|
severity = Attribute("An integer giving an overall state or error "
|
||||||
"code, typically the maximum of the field instances' "
|
"code, typically the maximum of the field instances' "
|
||||||
|
|
|
@ -29,6 +29,7 @@ from zope.cachedescriptors.property import Lazy
|
||||||
|
|
||||||
from cybertools.organize.interfaces import IClientRegistrations, IRegistrationTemplate
|
from cybertools.organize.interfaces import IClientRegistrations, IRegistrationTemplate
|
||||||
from cybertools.organize.interfaces import serviceCategories
|
from cybertools.organize.interfaces import serviceCategories
|
||||||
|
from cybertools.composer.interfaces import IInstance
|
||||||
from cybertools.composer.schema.browser.common import BaseView as SchemaBaseView
|
from cybertools.composer.schema.browser.common import BaseView as SchemaBaseView
|
||||||
from cybertools.composer.schema.interfaces import IClientFactory
|
from cybertools.composer.schema.interfaces import IClientFactory
|
||||||
from cybertools.util.format import formatDate
|
from cybertools.util.format import formatDate
|
||||||
|
@ -71,7 +72,7 @@ class BaseView(object):
|
||||||
class ServiceManagerView(BaseView):
|
class ServiceManagerView(BaseView):
|
||||||
|
|
||||||
def getCustomView(self):
|
def getCustomView(self):
|
||||||
viewName = self.context.viewName
|
viewName = self.context.getViewName()
|
||||||
if viewName:
|
if viewName:
|
||||||
return component.getMultiAdapter((self.context, self.request),
|
return component.getMultiAdapter((self.context, self.request),
|
||||||
name=viewName)
|
name=viewName)
|
||||||
|
@ -138,6 +139,14 @@ class ServiceView(BaseView):
|
||||||
tpl = ServiceManagerView(man, self.request).findRegistrationTemplate(context)
|
tpl = ServiceManagerView(man, self.request).findRegistrationTemplate(context)
|
||||||
return self.getUrlForObject(tpl)
|
return self.getUrlForObject(tpl)
|
||||||
|
|
||||||
|
def getClientData(self, clientName):
|
||||||
|
manager = self.context.getManager()
|
||||||
|
client = manager.getClients().get(clientName)
|
||||||
|
if client is None:
|
||||||
|
return {}
|
||||||
|
instance = IInstance(client)
|
||||||
|
return instance.applyTemplate()
|
||||||
|
|
||||||
|
|
||||||
class RegistrationTemplateView(SchemaBaseView):
|
class RegistrationTemplateView(SchemaBaseView):
|
||||||
|
|
||||||
|
@ -163,6 +172,20 @@ class RegistrationTemplateView(SchemaBaseView):
|
||||||
def getRegistratedServicesTokens(self):
|
def getRegistratedServicesTokens(self):
|
||||||
return [r.service.token for r in self.getRegistrations()]
|
return [r.service.token for r in self.getRegistrations()]
|
||||||
|
|
||||||
|
def getData(self):
|
||||||
|
""" Retrieve standard field data (accessible without providing
|
||||||
|
a template) from the client object.
|
||||||
|
"""
|
||||||
|
clientName = self.getClientName()
|
||||||
|
if not clientName:
|
||||||
|
return {}
|
||||||
|
manager = self.context.getManager()
|
||||||
|
client = manager.getClients().get(clientName)
|
||||||
|
if client is None:
|
||||||
|
return {}
|
||||||
|
instance = IInstance(client)
|
||||||
|
return instance.applyTemplate()
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
form = self.request.form
|
form = self.request.form
|
||||||
clientName = self.getClientName()
|
clientName = self.getClientName()
|
||||||
|
@ -173,7 +196,6 @@ class RegistrationTemplateView(SchemaBaseView):
|
||||||
client = manager.getClients().get(clientName)
|
client = manager.getClients().get(clientName)
|
||||||
if client is None:
|
if client is None:
|
||||||
return True
|
return True
|
||||||
#self.setClientName(clientName) # store in view and session
|
|
||||||
else:
|
else:
|
||||||
client = IClientFactory(manager)()
|
client = IClientFactory(manager)()
|
||||||
clientName = self.clientName = manager.addClient(client)
|
clientName = self.clientName = manager.addClient(client)
|
||||||
|
|
|
@ -183,12 +183,52 @@ class IService(Interface):
|
||||||
vocabulary=serviceCategories,
|
vocabulary=serviceCategories,
|
||||||
default='event',
|
default='event',
|
||||||
required=False,)
|
required=False,)
|
||||||
|
externalId = schema.TextLine(
|
||||||
|
title=_(u'External ID'),
|
||||||
|
description=_(u'Identifier in external system or code number.'),
|
||||||
|
required=False,)
|
||||||
|
cost = schema.Int(
|
||||||
|
title=_(u'Cost'),
|
||||||
|
description=_(u'Cost or prizing information.'),
|
||||||
|
required=False,)
|
||||||
capacity = schema.Int(
|
capacity = schema.Int(
|
||||||
title=_(u'Capacity'),
|
title=_(u'Capacity'),
|
||||||
description=_(u'The capacity (maximum number of clients) '
|
description=_(u'The capacity (maximum number of clients) '
|
||||||
'of this service; a negative number means: '
|
'of this service; a negative number means: '
|
||||||
'no restriction, i.e. unlimited capacity.'),
|
'no restriction, i.e. unlimited capacity.'),
|
||||||
required=False,)
|
required=False,)
|
||||||
|
waitingList = schema.Bool(
|
||||||
|
title=_(u'Waiting list'),
|
||||||
|
description=_(u'Check this field if participants beyond the '
|
||||||
|
'capacity of the service should be kept in a '
|
||||||
|
'waiting list.'),
|
||||||
|
required=False,)
|
||||||
|
location = schema.TextLine(
|
||||||
|
title=_(u'Location Information'),
|
||||||
|
description=_(u'Basic location information or '
|
||||||
|
'start point for transport services.'),
|
||||||
|
required=False,)
|
||||||
|
locationUrl = schema.TextLine(
|
||||||
|
title=_(u'URL for location'),
|
||||||
|
description=_(u'Web address (URL) with more information '
|
||||||
|
'about the location.'),
|
||||||
|
required=False,)
|
||||||
|
location2 = schema.TextLine(
|
||||||
|
title=_(u'Location Information (2)'),
|
||||||
|
description=_(u'Additional location information or '
|
||||||
|
'end point for transport services.'),
|
||||||
|
required=False,)
|
||||||
|
location2Url = schema.TextLine(
|
||||||
|
title=_(u'URL for location (2)'),
|
||||||
|
description=_(u'Web address (URL) with more information '
|
||||||
|
'about the location.'),
|
||||||
|
required=False,)
|
||||||
|
webAddress = schema.TextLine(
|
||||||
|
title=_(u'Web address'),
|
||||||
|
description=_(u'Web address (URL) for more information '
|
||||||
|
'about the service.'),
|
||||||
|
required=False,)
|
||||||
|
|
||||||
availableCapacity = Attribute('Available capacity, i.e. number of seats '
|
availableCapacity = Attribute('Available capacity, i.e. number of seats '
|
||||||
'still available; a negative number means: '
|
'still available; a negative number means: '
|
||||||
'no restriction, i.e. unlimited capacity; '
|
'no restriction, i.e. unlimited capacity; '
|
||||||
|
@ -224,12 +264,14 @@ class IScheduledService(IService):
|
||||||
title=_(u'Start date/time'),
|
title=_(u'Start date/time'),
|
||||||
description=_(u'The date/time when the service starts'),
|
description=_(u'The date/time when the service starts'),
|
||||||
required=False,)
|
required=False,)
|
||||||
start.default_method = 'getStartFromManager'
|
|
||||||
end = schema.Date(
|
end = schema.Date(
|
||||||
title=_(u'End date/time'),
|
title=_(u'End date/time'),
|
||||||
description=_(u'The date/time when the service ends'),
|
description=_(u'The date/time when the service ends'),
|
||||||
required=False,)
|
required=False,)
|
||||||
|
|
||||||
|
start.default_method = 'getStartFromManager'
|
||||||
end.default_method = 'getEndFromManager'
|
end.default_method = 'getEndFromManager'
|
||||||
|
|
||||||
duration = Attribute('Time delta between start and end date/time.')
|
duration = Attribute('Time delta between start and end date/time.')
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue