utilisation de Select plutôt que SelectId à certains endroits; garde en cache

le résultat de getObjectLabelsTranslated (qui est ultra-lent dans le cas des
identités car pour chacune, il y a un appel à la fiche person pour récupérer
son label (nécessiterait d'utiliser le cache au niveau du serveur d'identité,
pas prudent pour le moment))
This commit is contained in:
fpeters 2004-02-29 21:27:20 +00:00
parent 81a0e142ae
commit 9557708376
4 changed files with 34 additions and 6 deletions

View File

@ -1542,8 +1542,8 @@ class Id(BaseKind):
thingPublicName = N_('Object')
widgetName = 'SelectId'
#widgetName = 'Select'
#widgetName = 'SelectId'
widgetName = 'Select'
def checkModelValue(self, slot, value):
BaseKind.checkModelValue(self, slot, value)

View File

@ -1154,10 +1154,21 @@ class ObjectsProxy(ObjectsCommonMixin, AdministrableProxyMixin, Proxy):
userToken = context.getVar('userToken', default = '')
serverId = self.getServerId(serverId = serverId)
return callServer(
cache = context.getVar('temporaryCache')
cacheKey = 'getObjectIds_%s' % serverId
if cache is not None and cache.has_key(cacheKey):
return cache[cacheKey]
result = callServer(
serverId,
'getObjectIds',
[serverId, getApplicationToken(), userToken])
if cache is not None:
cache[cacheKey] = result
return result
def getObjectIdsWithCriteria(self, criteria, serverId = None):
userToken = context.getVar('userToken', default = '')
@ -1255,6 +1266,15 @@ class ObjectsProxy(ObjectsCommonMixin, AdministrableProxyMixin, Proxy):
"""
cache = context.getVar('temporaryCache')
if cache is not None:
cacheKey = 'getObjectLabelsTranslated-%r-%r' % (
objectIds, destinationLanguages)
try:
return cache[cacheKey]
except KeyError:
pass
multiCall = MultiCall()
for objectId in objectIds:
try:
@ -1279,6 +1299,7 @@ class ObjectsProxy(ObjectsCommonMixin, AdministrableProxyMixin, Proxy):
label, objectId, 'self.getLabel()', language,
destinationLanguages, multiCall = multiCall)
except faults.UnknownDispatcherInId:
labels[objectId] = objectId
del labelsAndLanguages[objectId]
lazyTranslations = multiCall.call()
objectIds = labelsAndLanguages.keys()
@ -1296,6 +1317,9 @@ class ObjectsProxy(ObjectsCommonMixin, AdministrableProxyMixin, Proxy):
label += _(' (at <%s>)') \
% extractApplicationHostNameAndPort(objectId)
labels[id] = label
if cache is not None:
cache[cacheKey] = labels
return labels
def getObjectLabelTranslated(self, objectId, destinationLanguages):

View File

@ -60,15 +60,15 @@ import WebAPI
class AdminRubrics(AdminMixin, AdminRubrics):
mainRubricId_kind_widget_fieldLabel = N_('Main Rubric')
mainRubricId_kind_widgetName = 'SelectId'
mainRubricId_kind_widgetName = 'Select'
register(AdminRubrics)
class Rubric(ObjectWebMixin, Rubric):
contentId_kind_widget_fieldLabel = N_('Content')
contentId_kind_widgetName = 'SelectId'
contentId_kind_widgetName = 'Select'
membersSet_kind_itemKind_value_widgetName = 'SelectId'
membersSet_kind_itemKind_value_widgetName = 'Select'
membersSet_kind_widget_fieldLabel = N_('Members')
membersSet_kind_widgetName = 'Multi'

View File

@ -1400,6 +1400,7 @@ class Select(ExclusiveChoiceMixin, proxyWidgets.Select):
if values is None:
raise Exception('Kind "%s" of slot "%s" has no values' % (
kind, slot))
labels = self.getLabels(slot)
layout = X.array()
@ -1424,13 +1425,16 @@ class Select(ExclusiveChoiceMixin, proxyWidgets.Select):
noneLabel = _(self.noneLabel)
select += X.option(value = '')(noneLabel)
itemsCount += 1
if itemsCount == 1:
# The menu has only one item. Replace it by a read-only value.
layout += self.getHtmlReadOnlyValue(slot, fields, **keywords)
return layout
layout += self.getModelHelpLayout(slot, fields)
groupedValues = {}
if hasattr(kind, 'getGroupedValues'):
groupedValues = kind.getGroupedValues(slot)