From 2531f575e25e24ec3aa059fbf4f9bde5a07d9216 Mon Sep 17 00:00:00 2001 From: helmutm Date: Wed, 6 May 2009 21:01:47 +0000 Subject: [PATCH] split up instance processing, allowing for fine-grained overriding by subclasses git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3374 fd906abe-77d9-0310-91a1-e0d9ade77398 --- composer/message/instance.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/composer/message/instance.py b/composer/message/instance.py index 57a5895..5925647 100644 --- a/composer/message/instance.py +++ b/composer/message/instance.py @@ -41,11 +41,15 @@ from cybertools.util.jeep import Jeep class DataProvider(object): + extensions = {} + def __init__(self, context, data): self.context = context self.data = data def __getitem__(self, key): + if key in self.extensions: + return self.extensions[key](self) client = self.context.client messageManager = self.context.manager if key.startswith('@@'): @@ -71,14 +75,7 @@ class DataProvider(object): messageManager) return mi.applyTemplate(self.data)['text'] elif '.' in key: - if client is None: - return '$' + key - schemaName, fieldName = key.split('.', 1) - schema = client.manager.getClientSchemas()[schemaName] - instance = IInstance(client) - instance.template = schema - data = instance.applyTemplate() - return data[fieldName] + return self.getSubfieldValue(key) elif key in self.data: return self.data[key] else: @@ -90,6 +87,25 @@ class DataProvider(object): (self.context.client.manager, request), name=name) return view + def getSubfieldValue(self, key): + client = self.context.client + if client is None: + return '$' + key + schemaName, fieldName = key.split('.', 1) + schema = self.getClientSchemas().get(schemaName) + if schema is None: + return '$' + key + instance = IInstance(self.getSubclient(schemaName)) + instance.template = schema + data = instance.applyTemplate() + return data.get(fieldName) or '$' + key + + def getSubclient(self, name): + return self.context.client + + def getClientSchemas(self): + return self.context.client.manager.getClientSchemas() + class MessageInstance(Instance):