from Products.CPSSchemas.VocabulariesTool import LOCAL_VOCABULARY_CONTAINER_ID def getVocabularyFor(self, context, voc_id): """Returns vocabulary for given context.""" def hasLocalVocContainer(context): if getattr(context, 'hasObject', None) is None: return False return context.hasObject(LOCAL_VOCABULARY_CONTAINER_ID) def getLocalVocContainer(context): return context._getOb(LOCAL_VOCABULARY_CONTAINER_ID, None) getParentNode = lambda node: getattr(getattr(node, 'aq_inner', None), 'aq_parent', None) if not hasLocalVocContainer(context): parent = getParentNode(context) while parent is not None: if hasLocalVocContainer(parent): return getLocalVocContainer(parent).getVocabulary(voc_id) parent = getParentNode(parent) # no local vocabulary container found for given context globvoc = self._getOb(voc_id, None) if globvoc is None: raise KeyError, 'No vocabulary by id %s' % voc_id return globvoc else: return getLocalVocContainer(context).getVocabulary(voc_id) from Products.CPSSchemas.VocabulariesTool import VocabulariesTool VocabulariesTool.getVocabularyFor = getVocabularyFor